From 3f9071f679ffa5a0718d2189b975d6c2a7d2b026 Mon Sep 17 00:00:00 2001 From: 0b5vr <0b5vr@0b5vr.com> Date: Thu, 8 Dec 2022 20:27:57 +0900 Subject: [PATCH 1/6] feature (VRM1, SpringBone): add limit break slider to spring bone joint properties --- .../SpringBone/VRM10SpringBoneJointEditor.cs | 98 +++++++++++++++++++ .../VRM10SpringBoneJointEditor.cs.meta | 11 +++ .../SpringBone/VRM10SpringBoneJoint.cs | 6 +- 3 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs create mode 100644 Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs.meta diff --git a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs new file mode 100644 index 000000000..d43d38d16 --- /dev/null +++ b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs @@ -0,0 +1,98 @@ +using UnityEditor; +using UnityEngine; + +namespace UniVRM10 +{ + [CustomEditor(typeof(VRM10SpringBoneJoint))] + class VRM10SpringBoneJointEditor : Editor + { + private VRM10SpringBoneJoint m_target; + private SerializedProperty m_stiffnessForceProp; + private SerializedProperty m_gravityPowerProp; + private SerializedProperty m_gravityDirProp; + private SerializedProperty m_dragForceProp; + private SerializedProperty m_jointRadiusProp; + + void OnEnable() + { + if (target == null) + { + return; + } + m_target = (VRM10SpringBoneJoint)target; + + 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_jointRadiusProp = serializedObject.FindProperty("m_jointRadius"); + } + + public override void OnInspectorGUI() + { + serializedObject.Update(); + + 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.Space(); + + EditorGUILayout.LabelField("Collision", EditorStyles.boldLabel); + + LimitBreakSlider(m_jointRadiusProp, 0.0f, 0.5f, 0.0f, Mathf.Infinity); + + 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/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs.meta b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs.meta new file mode 100644 index 000000000..5dba9344a --- /dev/null +++ b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cb6829ce1ea93194fbd08e175456a797 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneJoint.cs b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneJoint.cs index 289087dda..867d3fcbd 100644 --- a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneJoint.cs +++ b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneJoint.cs @@ -11,10 +11,10 @@ namespace UniVRM10 [DisallowMultipleComponent] public class VRM10SpringBoneJoint : MonoBehaviour { - [SerializeField, Range(0, 4), Header("Settings")] + [SerializeField] public float m_stiffnessForce = 1.0f; - [SerializeField, Range(0, 2)] + [SerializeField] public float m_gravityPower = 0; [SerializeField] @@ -23,7 +23,7 @@ namespace UniVRM10 [SerializeField, Range(0, 1)] public float m_dragForce = 0.4f; - [SerializeField, Range(0, 0.5f), Header("Collision")] + [SerializeField] public float m_jointRadius = 0.02f; void AddJointRecursive(Transform t, VRM10SpringBoneJoint src) 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 2/6] 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] From 907f8ec33faf548d5e1b1e68d2628d0ac841caeb Mon Sep 17 00:00:00 2001 From: 0b5vr <0b5vr@0b5vr.com> Date: Fri, 9 Dec 2022 15:59:17 +0900 Subject: [PATCH 3/6] fix: rename `VRM10SpringBoneJointEditor` -> `VRMSpringBoneEditor` Addressing https://github.com/vrm-c/UniVRM/pull/1952#discussion_r1044132637 --- Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs index 70f1c66ab..feae81158 100644 --- a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs +++ b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs @@ -4,7 +4,7 @@ using UnityEngine; namespace VRM { [CustomEditor(typeof(VRMSpringBone))] - class VRM10SpringBoneJointEditor : Editor + class VRMSpringBoneEditor : Editor { private VRMSpringBone m_target; From a56bdbb3fe314d3da172237407d10ce817207de4 Mon Sep 17 00:00:00 2001 From: 0b5vr <0b5vr@0b5vr.com> Date: Fri, 9 Dec 2022 15:59:56 +0900 Subject: [PATCH 4/6] fix: Add [CanEditMultipleObjects] to VRMSpringBoneEditor Addressing https://github.com/vrm-c/UniVRM/pull/1952#discussion_r1044140283 --- Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs index feae81158..0eaa35e8f 100644 --- a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs +++ b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs @@ -4,6 +4,7 @@ using UnityEngine; namespace VRM { [CustomEditor(typeof(VRMSpringBone))] + [CanEditMultipleObjects] class VRMSpringBoneEditor : Editor { private VRMSpringBone m_target; From 9c194d55e72a3a71a4fedb4cbb6a9c91130a259d Mon Sep 17 00:00:00 2001 From: 0b5vr <0b5vr@0b5vr.com> Date: Fri, 9 Dec 2022 16:03:45 +0900 Subject: [PATCH 5/6] refactor: SpringBoneEditor, change FindProperty specifier from string literal to nameof Addressing https://github.com/vrm-c/UniVRM/pull/1952#discussion_r1044133280 Addressing https://github.com/vrm-c/UniVRM/pull/1952#discussion_r1044133784 --- .../Editor/SpringBone/VRMSpringBoneEditor.cs | 20 +++++++++---------- .../SpringBone/VRM10SpringBoneJointEditor.cs | 10 +++++----- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs index 0eaa35e8f..68e2027fc 100644 --- a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs +++ b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs @@ -29,17 +29,17 @@ namespace VRM } m_target = (VRMSpringBone)target; - m_commentProp = serializedObject.FindProperty("m_comment"); + m_commentProp = serializedObject.FindProperty(nameof(VRMSpringBone.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"); + m_stiffnessForceProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_stiffnessForce)); + m_gravityPowerProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_gravityPower)); + m_gravityDirProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_gravityDir)); + m_dragForceProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_dragForce)); + m_centerProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_center)); + m_rootBonesProp = serializedObject.FindProperty(nameof(VRMSpringBone.RootBones)); + m_hitRadiusProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_hitRadius)); + m_colliderGroupsProp = serializedObject.FindProperty(nameof(VRMSpringBone.ColliderGroups)); + m_updateTypeProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_updateType)); } public override void OnInspectorGUI() diff --git a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs index d43d38d16..f28dd88e7 100644 --- a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs +++ b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs @@ -21,11 +21,11 @@ namespace UniVRM10 } m_target = (VRM10SpringBoneJoint)target; - 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_jointRadiusProp = serializedObject.FindProperty("m_jointRadius"); + m_stiffnessForceProp = serializedObject.FindProperty(nameof(VRM10SpringBoneJoint.m_stiffnessForce)); + m_gravityPowerProp = serializedObject.FindProperty(nameof(VRM10SpringBoneJoint.m_gravityPower)); + m_gravityDirProp = serializedObject.FindProperty(nameof(VRM10SpringBoneJoint.m_gravityDir)); + m_dragForceProp = serializedObject.FindProperty(nameof(VRM10SpringBoneJoint.m_dragForce)); + m_jointRadiusProp = serializedObject.FindProperty(nameof(VRM10SpringBoneJoint.m_jointRadius)); } public override void OnInspectorGUI() From e8942a4f42fb86e39029006a87aa217e5728d543 Mon Sep 17 00:00:00 2001 From: 0b5vr <0b5vr@0b5vr.com> Date: Fri, 9 Dec 2022 16:05:39 +0900 Subject: [PATCH 6/6] fix: Add [CanEditMultipleObjects] to VRM10SpringBoneJointEditor Addressing https://github.com/vrm-c/UniVRM/pull/1952#discussion_r1044140952 --- .../Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs index f28dd88e7..5f2e5329e 100644 --- a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs +++ b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs @@ -4,6 +4,7 @@ using UnityEngine; namespace UniVRM10 { [CustomEditor(typeof(VRM10SpringBoneJoint))] + [CanEditMultipleObjects] class VRM10SpringBoneJointEditor : Editor { private VRM10SpringBoneJoint m_target;