diff --git a/Packages/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs b/Packages/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs index 537ba365c..77ac620e8 100644 --- a/Packages/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs +++ b/Packages/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs @@ -63,10 +63,11 @@ namespace UniVRM10 /// spring 情報。readonly。mouse click による hierarchy 参照補助 /// EditorGUI.BeginDisabledGroup(true); - var isLastTail = ShowSpringInfo(); + var info = Vrm10InstanceSpringBone.GetEditInfo(m_target, m_root); + ShowSpringInfo(info); EditorGUI.EndDisabledGroup(); - if (isLastTail) + if (info.IsLastTail) { EditorGUILayout.HelpBox("末端 joint です。下記の設定は使用されません。", MessageType.Info); } @@ -99,7 +100,7 @@ namespace UniVRM10 EditorGUILayout.HelpBox("SpringBoneの角度制限はまだdraft仕様です。将来的に仕様が変更される可能性があります。\nThe angle limit feature for SpringBone is still in draft status. The specifications may change in the future.", MessageType.Warning); - if (isLastTail) + if (info.IsLastTail) { EditorGUILayout.HelpBox("末端ノードではAngleLimitは無視されます。", MessageType.Info); } @@ -144,52 +145,51 @@ namespace UniVRM10 /// - Springに関連付けられたColliderの情報を表示する /// /// 末端 - bool ShowSpringInfo() + static void ShowSpringInfo(Vrm10InstanceSpringBone.EditInfo info) { - if (m_root == null) + if (info.Root == null) { EditorGUILayout.HelpBox("no vrm-1.0", MessageType.Warning); - return false; + return; } - EditorGUILayout.ObjectField("Vrm-1.0", m_root, typeof(Vrm10Instance), true, null); + EditorGUILayout.ObjectField("Vrm-1.0", info.Root, typeof(Vrm10Instance), true, null); - var found = m_root.SpringBone.FindJoint(m_target); - if (!found.HasValue) + if (info.Spring == null) { EditorGUILayout.HelpBox("This joint not belongs any spring", MessageType.Warning); - return false; + return; } - var (spring, i, _) = found.Value; - m_showJoints = EditorGUILayout.Foldout(m_showJoints, $"Springs[{i}]({spring.Name})"); + // var (spring, i, _) = found.Value; + m_showJoints = EditorGUILayout.Foldout(m_showJoints, $"Springs[{info.SpringIndex}]({info.Spring.Name})"); int? jointIndex = default; // joints - for (int j = 0; j < spring.Joints.Count; ++j) + for (int j = 0; j < info.Spring.Joints.Count; ++j) { - var joint = spring.Joints[j]; + var joint = info.Spring.Joints[j]; if (m_showJoints) { var label = $"Joints[{j}]"; - if (joint == m_target) + if (joint == info.Target) { label += "★"; } EditorGUILayout.ObjectField(label, joint, typeof(VRM10SpringBoneJoint), true, null); } - if (joint == m_target) + if (joint == info.Target) { jointIndex = j; } } m_showColliders = EditorGUILayout.Foldout(m_showColliders, "ColliderGroups"); - if (m_showColliders && found.HasValue) + if (m_showColliders) { // collider groups - for (int j = 0; j < spring.ColliderGroups.Count; ++j) + for (int j = 0; j < info.Spring.ColliderGroups.Count; ++j) { - var group = spring.ColliderGroups[j]; + var group = info.Spring.ColliderGroups[j]; EditorGUILayout.LabelField($"ColliderGroups[{j}]({group.Name})"); for (int k = 0; k < group.Colliders.Count; ++k) { @@ -199,8 +199,6 @@ namespace UniVRM10 } } } - - return jointIndex == (spring.Joints.Count - 1); } /// diff --git a/Packages/VRM10/Runtime/Components/Vrm10Instance/Vrm10InstanceSpringBone.cs b/Packages/VRM10/Runtime/Components/Vrm10Instance/Vrm10InstanceSpringBone.cs index f47a972c3..1501e8465 100644 --- a/Packages/VRM10/Runtime/Components/Vrm10Instance/Vrm10InstanceSpringBone.cs +++ b/Packages/VRM10/Runtime/Components/Vrm10Instance/Vrm10InstanceSpringBone.cs @@ -89,5 +89,58 @@ namespace UniVRM10 } return default; } + + public struct EditInfo + { + public VRM10SpringBoneJoint Target; + public Vrm10Instance Root; + public Spring Spring; + public int SpringIndex; + public int JointIndex; + public bool IsLastTail; + } + + /// + /// Return SprintBone EditInfo. + /// Do not call on runtime play for performance. + /// + /// On Editor may null. + /// GetComponentInParent cache. + /// + public static EditInfo GetEditInfo(VRM10SpringBoneJoint target, Vrm10Instance root) + { + EditInfo info = default; + if (target == null) + { + return info; + } + info.Target = target; + + if (root == null) + { + root = target.GetComponentInParent(); + } + if (root == null) + { + return info; + } + info.Root = root; + + var found = root.SpringBone.FindJoint(target); + if (!found.HasValue) + { + return info; + } + (info.Spring, info.SpringIndex, info.JointIndex) = found.Value; + + + // ヒエラルキーの末端ではなく、Springの末端である + if (info.Spring.Joints.Count > 0 && info.Spring.Joints[info.Spring.Joints.Count - 1] == target) + { + info.IsLastTail = true; + } + + return info; + } } }