diff --git a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs
new file mode 100644
index 000000000..70f1c66ab
--- /dev/null
+++ b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs
@@ -0,0 +1,121 @@
+using UnityEditor;
+using UnityEngine;
+
+namespace VRM
+{
+ [CustomEditor(typeof(VRMSpringBone))]
+ class VRM10SpringBoneJointEditor : Editor
+ {
+ private VRMSpringBone m_target;
+
+ private SerializedProperty m_commentProp;
+ private SerializedProperty m_gizmoColorProp;
+ private SerializedProperty m_stiffnessForceProp;
+ private SerializedProperty m_gravityPowerProp;
+ private SerializedProperty m_gravityDirProp;
+ private SerializedProperty m_dragForceProp;
+ private SerializedProperty m_centerProp;
+ private SerializedProperty m_rootBonesProp;
+ private SerializedProperty m_hitRadiusProp;
+ private SerializedProperty m_colliderGroupsProp;
+ private SerializedProperty m_updateTypeProp;
+
+ void OnEnable()
+ {
+ if (target == null)
+ {
+ return;
+ }
+ m_target = (VRMSpringBone)target;
+
+ m_commentProp = serializedObject.FindProperty("m_comment");
+ m_gizmoColorProp = serializedObject.FindProperty("m_gizmoColor");
+ m_stiffnessForceProp = serializedObject.FindProperty("m_stiffnessForce");
+ m_gravityPowerProp = serializedObject.FindProperty("m_gravityPower");
+ m_gravityDirProp = serializedObject.FindProperty("m_gravityDir");
+ m_dragForceProp = serializedObject.FindProperty("m_dragForce");
+ m_centerProp = serializedObject.FindProperty("m_center");
+ m_rootBonesProp = serializedObject.FindProperty("RootBones");
+ m_hitRadiusProp = serializedObject.FindProperty("m_hitRadius");
+ m_colliderGroupsProp = serializedObject.FindProperty("ColliderGroups");
+ m_updateTypeProp = serializedObject.FindProperty("m_updateType");
+ }
+
+ public override void OnInspectorGUI()
+ {
+ serializedObject.Update();
+
+ EditorGUILayout.PropertyField(m_commentProp);
+ EditorGUILayout.PropertyField(m_gizmoColorProp);
+
+ EditorGUILayout.Space();
+
+ EditorGUILayout.LabelField("Settings", EditorStyles.boldLabel);
+
+ LimitBreakSlider(m_stiffnessForceProp, 0.0f, 4.0f, 0.0f, Mathf.Infinity);
+ LimitBreakSlider(m_gravityPowerProp, 0.0f, 2.0f, 0.0f, Mathf.Infinity);
+ EditorGUILayout.PropertyField(m_gravityDirProp);
+ EditorGUILayout.PropertyField(m_dragForceProp);
+ EditorGUILayout.PropertyField(m_centerProp);
+ EditorGUILayout.PropertyField(m_rootBonesProp);
+
+ EditorGUILayout.Space();
+
+ EditorGUILayout.LabelField("Collision", EditorStyles.boldLabel);
+
+ LimitBreakSlider(m_hitRadiusProp, 0.0f, 0.5f, 0.0f, Mathf.Infinity);
+ EditorGUILayout.PropertyField(m_colliderGroupsProp);
+ EditorGUILayout.PropertyField(m_updateTypeProp);
+
+
+ serializedObject.ApplyModifiedProperties();
+ }
+
+ ///
+ /// スライダーと数値入力で限界値の違う、所謂「限界突破スライダー」を作成する
+ /// `EditorGUILayout.PropertyField` の代替として利用する
+ ///
+ private static void LimitBreakSlider(SerializedProperty property, float sliderLeft, float sliderRight, float numberLeft, float numberRight)
+ {
+ var label = new GUIContent(property.displayName);
+ var currentValue = property.floatValue;
+
+ var rect = EditorGUILayout.GetControlRect();
+
+ EditorGUI.BeginProperty(rect, label, property);
+
+ rect = EditorGUI.PrefixLabel(rect, label);
+
+ // slider
+ {
+ EditorGUI.BeginChangeCheck();
+
+ var sliderRect = rect;
+ sliderRect.width -= 55.0f;
+ rect.xMin += rect.width - 50.0f;
+
+ var clampedvalue = Mathf.Clamp(currentValue, sliderLeft, sliderRight);
+ var sliderValue = GUI.HorizontalSlider(sliderRect, clampedvalue, sliderLeft, sliderRight);
+
+ if (EditorGUI.EndChangeCheck())
+ {
+ property.floatValue = sliderValue;
+ }
+ }
+
+ // number
+ {
+ EditorGUI.BeginChangeCheck();
+
+ var numberValue = Mathf.Clamp(EditorGUI.FloatField(rect, currentValue), numberLeft, numberRight);
+
+ if (EditorGUI.EndChangeCheck())
+ {
+ property.floatValue = numberValue;
+ }
+ }
+
+ EditorGUI.EndProperty();
+ }
+ }
+}
diff --git a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs.meta b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs.meta
new file mode 100644
index 000000000..64402c885
--- /dev/null
+++ b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: bcc37b2e1c446d4448718e89fcba946b
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs b/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs
index 06e5ad58f..5e9d8c7d0 100644
--- a/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs
+++ b/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs
@@ -19,11 +19,9 @@ namespace VRM
[SerializeField] private Color m_gizmoColor = Color.yellow;
[SerializeField]
- [Range(0, 4)]
- [Header("Settings")]
public float m_stiffnessForce = 1.0f;
- [SerializeField][Range(0, 2)] public float m_gravityPower;
+ [SerializeField] public float m_gravityPower;
[SerializeField] public Vector3 m_gravityDir = new Vector3(0, -1.0f, 0);
@@ -35,8 +33,6 @@ namespace VRM
Dictionary m_initialLocalRotationMap;
[SerializeField]
- [Range(0, 0.5f)]
- [Header("Collider")]
public float m_hitRadius = 0.02f;
[SerializeField]