From 3d4b10da12922029bf7a15ec04299d2e77bfbd89 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 6 May 2021 13:45:01 +0900 Subject: [PATCH] =?UTF-8?q?VRM10SpringBoneColliderGroup=20=E3=81=AE=20null?= =?UTF-8?q?=20=E9=98=B2=E5=BE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../VRM10SpringBoneColliderGroupEditor.cs | 4 +- .../Components/SpringBone/VRM10SpringBone.cs | 43 +++++++++---------- .../VRM10SpringBoneColliderGroup.cs | 40 ++++++++++++++++- Assets/VRM10/Runtime/IO/Vrm10Importer.cs | 2 +- 4 files changed, 62 insertions(+), 27 deletions(-) diff --git a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneColliderGroupEditor.cs b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneColliderGroupEditor.cs index f97b0f5cc..a10587da9 100644 --- a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneColliderGroupEditor.cs +++ b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneColliderGroupEditor.cs @@ -64,7 +64,7 @@ namespace UniVRM10 Undo.RecordObject(target, "Sort Colliders by Radius"); - target.Colliders = target.Colliders.OrderBy(x => -x.Radius).ToList(); + target.Colliders = target.Colliders.OrderBy(x => -x.Radius); } [MenuItem("CONTEXT/VRM10SpringBoneColliderGroup/Sort Colliders by Offset Y")] @@ -75,7 +75,7 @@ namespace UniVRM10 Undo.RecordObject(target, "Sort Colliders by Offset Y"); - target.Colliders = target.Colliders.OrderBy(x => -x.Offset.y).ToList(); + target.Colliders = target.Colliders.OrderBy(x => -x.Offset.y); } } } diff --git a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBone.cs b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBone.cs index f87ea8048..902196c9b 100644 --- a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBone.cs +++ b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBone.cs @@ -58,34 +58,31 @@ namespace UniVRM10 m_colliderList.Clear(); if (ColliderGroups != null) { - foreach (var group in ColliderGroups) + foreach (var group in ColliderGroups.Where(x => x != null)) { - if (group != null) + foreach (var collider in group.Colliders) { - foreach (var collider in group.Colliders) + switch (collider.ColliderType) { - switch (collider.ColliderType) - { - case VRM10SpringBoneColliderTypes.Sphere: - m_colliderList.Add(new SpringBoneLogic.InternalCollider - { - ColliderTypes = VRM10SpringBoneColliderTypes.Sphere, - WorldPosition = group.transform.TransformPoint(collider.Offset), - Radius = collider.Radius, + case VRM10SpringBoneColliderTypes.Sphere: + m_colliderList.Add(new SpringBoneLogic.InternalCollider + { + ColliderTypes = VRM10SpringBoneColliderTypes.Sphere, + WorldPosition = group.transform.TransformPoint(collider.Offset), + Radius = collider.Radius, - }); - break; + }); + break; - case VRM10SpringBoneColliderTypes.Capsule: - m_colliderList.Add(new SpringBoneLogic.InternalCollider - { - ColliderTypes = VRM10SpringBoneColliderTypes.Capsule, - WorldPosition = group.transform.TransformPoint(collider.Offset), - Radius = collider.Radius, - WorldTail = group.transform.TransformPoint(collider.Tail) - }); - break; - } + case VRM10SpringBoneColliderTypes.Capsule: + m_colliderList.Add(new SpringBoneLogic.InternalCollider + { + ColliderTypes = VRM10SpringBoneColliderTypes.Capsule, + WorldPosition = group.transform.TransformPoint(collider.Offset), + Radius = collider.Radius, + WorldTail = group.transform.TransformPoint(collider.Tail) + }); + break; } } } diff --git a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneColliderGroup.cs b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneColliderGroup.cs index fece4413f..8ecae79fd 100644 --- a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneColliderGroup.cs +++ b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneColliderGroup.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using UnityEngine; @@ -11,6 +12,43 @@ namespace UniVRM10 public class VRM10SpringBoneColliderGroup : MonoBehaviour { [SerializeField] - public List Colliders = new List(); + List m_colliders = new List(); + + public IEnumerable Colliders + { + get + { + return m_colliders.Where(x => x != null); + } + set + { + m_colliders = value.ToList(); + OnValidate(); + } + } + + public void AddCollider(VRM10SpringBoneCollider collider) + { + if (collider == null) + { + Debug.LogWarning("null collider"); + return; + } + + if (m_colliders == null) + { + m_colliders = new List(); + } + m_colliders.Add(collider); + } + + void OnValidate() + { + if (m_colliders.Any(x => x == null)) + { + Debug.LogWarning($"{this} remove null"); + m_colliders = m_colliders.Where(x => x != null).ToList(); + } + } } } diff --git a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs index 1a8d52ba9..edd7cc3bd 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs @@ -384,7 +384,7 @@ namespace UniVRM10 var node = Nodes[c.Node.Value]; var collider = node.gameObject.AddComponent(); - colliderGroup.Colliders.Add(collider); + colliderGroup.AddCollider(collider); if (c.Shape.Sphere is UniGLTF.Extensions.VRMC_springBone.ColliderShapeSphere sphere) {