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;
+ }
}
}