From cd88d0744ffa014113b96368fe6e8f5c38b34b23 Mon Sep 17 00:00:00 2001 From: 0b5vr <0b5vr@0b5vr.com> Date: Thu, 8 Dec 2022 20:40:15 +0900 Subject: [PATCH] feature (VRM0, SpringBone): add limit break slider to spring bone joint properties --- .../Editor/SpringBone/VRMSpringBoneEditor.cs | 121 ++++++++++++++++++ .../SpringBone/VRMSpringBoneEditor.cs.meta | 11 ++ .../VRM/Runtime/SpringBone/VRMSpringBone.cs | 6 +- 3 files changed, 133 insertions(+), 5 deletions(-) create mode 100644 Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs create mode 100644 Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs.meta 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]