From 270fbae1ac5896fe44f79f654e844f5933443a24 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Mon, 18 Nov 2024 14:05:28 +0900 Subject: [PATCH 1/4] avoid runtime exception. editor warning --- .../Editor/SpringBone/VRMSpringBoneEditor.cs | 60 +++++++++++++++++-- .../SpringBone/Logic/SpringBoneSystem.cs | 5 +- .../VRM/Runtime/SpringBone/VRMSpringBone.cs | 2 +- 3 files changed, 59 insertions(+), 8 deletions(-) diff --git a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs index 68e2027fc..c591ee672 100644 --- a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs +++ b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs @@ -1,3 +1,6 @@ +using System.Collections.Generic; +using System.Linq; +using UniGLTF; using UnityEditor; using UnityEngine; @@ -9,6 +12,7 @@ namespace VRM { private VRMSpringBone m_target; + private SerializedProperty m_script; private SerializedProperty m_commentProp; private SerializedProperty m_gizmoColorProp; private SerializedProperty m_stiffnessForceProp; @@ -21,6 +25,39 @@ namespace VRM private SerializedProperty m_colliderGroupsProp; private SerializedProperty m_updateTypeProp; + void OnValidate() + { + if (Validate().Any()) + { + m_target.m_gizmoColor = Color.magenta; + } + } + + Dictionary m_rootCount = new(); + + IEnumerable Validate() + { + m_rootCount.Clear(); + foreach (var root in m_target.RootBones) + { + if (m_rootCount.TryGetValue(root, out var count)) + { + m_rootCount[root] = count + 1; + } + else + { + m_rootCount.Add(root, 1); + } + } + foreach (var (k, v) in m_rootCount) + { + if (v > 1) + { + yield return Validation.Error($"Duplicate rootBone: {k} => {v}"); + } + } + } + void OnEnable() { if (target == null) @@ -29,8 +66,9 @@ namespace VRM } m_target = (VRMSpringBone)target; + m_script = serializedObject.FindProperty("m_Script"); m_commentProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_comment)); - m_gizmoColorProp = serializedObject.FindProperty("m_gizmoColor"); + m_gizmoColorProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_gizmoColor)); m_stiffnessForceProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_stiffnessForce)); m_gravityPowerProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_gravityPower)); m_gravityDirProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_gravityDir)); @@ -46,28 +84,38 @@ namespace VRM { serializedObject.Update(); + // header + using (new EditorGUI.DisabledScope(true)) + { + EditorGUILayout.PropertyField(m_script); + } EditorGUILayout.PropertyField(m_commentProp); EditorGUILayout.PropertyField(m_gizmoColorProp); - EditorGUILayout.Space(); + foreach (var validation in Validate()) + { + validation.DrawGUI(); + } + // settings 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(); + // collision EditorGUILayout.LabelField("Collision", EditorStyles.boldLabel); - LimitBreakSlider(m_hitRadiusProp, 0.0f, 0.5f, 0.0f, Mathf.Infinity); EditorGUILayout.PropertyField(m_colliderGroupsProp); - EditorGUILayout.PropertyField(m_updateTypeProp); + EditorGUILayout.Space(); + // runtime + EditorGUILayout.LabelField("Runtime", EditorStyles.boldLabel); + EditorGUILayout.PropertyField(m_updateTypeProp); serializedObject.ApplyModifiedProperties(); } diff --git a/Assets/VRM/Runtime/SpringBone/Logic/SpringBoneSystem.cs b/Assets/VRM/Runtime/SpringBone/Logic/SpringBoneSystem.cs index a44091bf1..a30ca03f2 100644 --- a/Assets/VRM/Runtime/SpringBone/Logic/SpringBoneSystem.cs +++ b/Assets/VRM/Runtime/SpringBone/Logic/SpringBoneSystem.cs @@ -38,7 +38,10 @@ namespace VRM.SpringBone for (int i = 0; i < m_joints.Count; ++i) { - m_jointIndexMap.Add(m_joints[i].Item1, i); + if (!m_jointIndexMap.ContainsKey(m_joints[i].Item1)) + { + m_jointIndexMap.Add(m_joints[i].Item1, i); + } } } diff --git a/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs b/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs index 2d8b5f859..f173cbd32 100644 --- a/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs +++ b/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs @@ -12,7 +12,7 @@ namespace VRM public sealed class VRMSpringBone : MonoBehaviour { [SerializeField] public string m_comment; - [SerializeField] private Color m_gizmoColor = Color.yellow; + [SerializeField] public Color m_gizmoColor = Color.yellow; [SerializeField] public float m_stiffnessForce = 1.0f; [SerializeField] public float m_gravityPower; [SerializeField] public Vector3 m_gravityDir = new Vector3(0, -1.0f, 0); From ddf438edf7288b221d68daba6cd515557879262d Mon Sep 17 00:00:00 2001 From: ousttrue Date: Mon, 18 Nov 2024 14:15:22 +0900 Subject: [PATCH 2/4] RootBonesNonNullUnique --- .../Runtime/SpringBone/Logic/SpringBoneSystem.cs | 5 +---- Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs | 13 ++++++++++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Assets/VRM/Runtime/SpringBone/Logic/SpringBoneSystem.cs b/Assets/VRM/Runtime/SpringBone/Logic/SpringBoneSystem.cs index a30ca03f2..a44091bf1 100644 --- a/Assets/VRM/Runtime/SpringBone/Logic/SpringBoneSystem.cs +++ b/Assets/VRM/Runtime/SpringBone/Logic/SpringBoneSystem.cs @@ -38,10 +38,7 @@ namespace VRM.SpringBone for (int i = 0; i < m_joints.Count; ++i) { - if (!m_jointIndexMap.ContainsKey(m_joints[i].Item1)) - { - m_jointIndexMap.Add(m_joints[i].Item1, i); - } + m_jointIndexMap.Add(m_joints[i].Item1, i); } } diff --git a/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs b/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs index f173cbd32..30c74ea7a 100644 --- a/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs +++ b/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using UnityEngine; namespace VRM @@ -47,6 +48,16 @@ namespace VRM } [SerializeField] public SpringBoneUpdateType m_updateType = SpringBoneUpdateType.LateUpdate; + List m_rootBonesNonNullUnique = new(); + List RootBonesNonNullUnique + { + get + { + m_rootBonesNonNullUnique.Clear(); + m_rootBonesNonNullUnique.AddRange(RootBones.Where(x => x != null).Distinct()); + return m_rootBonesNonNullUnique; + } + } SpringBone.SpringBoneSystem m_system = new(); void Awake() @@ -55,7 +66,7 @@ namespace VRM } SpringBone.SceneInfo Scene => new( - rootBones: RootBones, + rootBones: RootBonesNonNullUnique, center: m_center, colliderGroups: ColliderGroups, externalForce: ExternalForce); From 32e004d821dbc3c470d435b43bcf784fc334639f Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 19 Nov 2024 01:50:05 +0900 Subject: [PATCH 3/4] Editor.OnValidate not work --- .../Editor/SpringBone/VRMSpringBoneEditor.cs | 31 ++++++++++++------- .../VRM/Runtime/SpringBone/VRMSpringBone.cs | 2 +- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs index c591ee672..5a870b006 100644 --- a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs +++ b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs @@ -25,18 +25,12 @@ namespace VRM private SerializedProperty m_colliderGroupsProp; private SerializedProperty m_updateTypeProp; - void OnValidate() - { - if (Validate().Any()) - { - m_target.m_gizmoColor = Color.magenta; - } - } - Dictionary m_rootCount = new(); + List m_validation = new(); IEnumerable Validate() { + m_validation.Clear(); m_rootCount.Clear(); foreach (var root in m_target.RootBones) { @@ -53,9 +47,10 @@ namespace VRM { if (v > 1) { - yield return Validation.Error($"Duplicate rootBone: {k} => {v}"); + m_validation.Add(Validation.Error($"Duplicate rootBone: {k} => {v}", ValidationContext.Create(k))); } } + return m_validation; } void OnEnable() @@ -68,7 +63,7 @@ namespace VRM m_script = serializedObject.FindProperty("m_Script"); m_commentProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_comment)); - m_gizmoColorProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_gizmoColor)); + m_gizmoColorProp = serializedObject.FindProperty("m_gizmoColor"); m_stiffnessForceProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_stiffnessForce)); m_gravityPowerProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_gravityPower)); m_gravityDirProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_gravityDir)); @@ -78,6 +73,20 @@ namespace VRM m_hitRadiusProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_hitRadius)); m_colliderGroupsProp = serializedObject.FindProperty(nameof(VRMSpringBone.ColliderGroups)); m_updateTypeProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_updateType)); + + Validate(); + } + + public void OnSceneGUI() + { + foreach (var valiation in m_validation) + { + var t = (Transform)valiation.Context.Context; + if (t != null) + { + Handles.Label(t.position, "duplicate rootBone !"); + } + } } public override void OnInspectorGUI() @@ -92,7 +101,7 @@ namespace VRM EditorGUILayout.PropertyField(m_commentProp); EditorGUILayout.PropertyField(m_gizmoColorProp); EditorGUILayout.Space(); - foreach (var validation in Validate()) + foreach (var validation in m_validation) { validation.DrawGUI(); } diff --git a/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs b/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs index 30c74ea7a..75ed5f950 100644 --- a/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs +++ b/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs @@ -13,7 +13,7 @@ namespace VRM public sealed class VRMSpringBone : MonoBehaviour { [SerializeField] public string m_comment; - [SerializeField] public Color m_gizmoColor = Color.yellow; + [SerializeField] private Color m_gizmoColor = Color.yellow; [SerializeField] public float m_stiffnessForce = 1.0f; [SerializeField] public float m_gravityPower; [SerializeField] public Vector3 m_gravityDir = new Vector3(0, -1.0f, 0); From bf9c438f1fe131c4317440fe197cfee66a579bef Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 19 Nov 2024 12:58:52 +0900 Subject: [PATCH 4/4] use MonoBehaviour.OnValidate --- .../Editor/SpringBone/VRMSpringBoneEditor.cs | 34 ++----------------- .../VRM/Runtime/SpringBone/VRMSpringBone.cs | 28 +++++++++++++++ 2 files changed, 30 insertions(+), 32 deletions(-) diff --git a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs index 5a870b006..680bde7c5 100644 --- a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs +++ b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs @@ -25,34 +25,6 @@ namespace VRM private SerializedProperty m_colliderGroupsProp; private SerializedProperty m_updateTypeProp; - Dictionary m_rootCount = new(); - List m_validation = new(); - - IEnumerable Validate() - { - m_validation.Clear(); - m_rootCount.Clear(); - foreach (var root in m_target.RootBones) - { - if (m_rootCount.TryGetValue(root, out var count)) - { - m_rootCount[root] = count + 1; - } - else - { - m_rootCount.Add(root, 1); - } - } - foreach (var (k, v) in m_rootCount) - { - if (v > 1) - { - m_validation.Add(Validation.Error($"Duplicate rootBone: {k} => {v}", ValidationContext.Create(k))); - } - } - return m_validation; - } - void OnEnable() { if (target == null) @@ -73,13 +45,11 @@ namespace VRM m_hitRadiusProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_hitRadius)); m_colliderGroupsProp = serializedObject.FindProperty(nameof(VRMSpringBone.ColliderGroups)); m_updateTypeProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_updateType)); - - Validate(); } public void OnSceneGUI() { - foreach (var valiation in m_validation) + foreach (var valiation in m_target.Validations) { var t = (Transform)valiation.Context.Context; if (t != null) @@ -101,7 +71,7 @@ namespace VRM EditorGUILayout.PropertyField(m_commentProp); EditorGUILayout.PropertyField(m_gizmoColorProp); EditorGUILayout.Space(); - foreach (var validation in m_validation) + foreach (var validation in m_target.Validations) { validation.DrawGUI(); } diff --git a/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs b/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs index 75ed5f950..056224d35 100644 --- a/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs +++ b/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using UniGLTF; using UnityEngine; namespace VRM @@ -60,6 +61,33 @@ namespace VRM } SpringBone.SpringBoneSystem m_system = new(); + Dictionary m_rootCount = new(); + List m_validations = new(); + public List Validations => m_validations; + public void OnValidate() + { + Validations.Clear(); + m_rootCount.Clear(); + foreach (var root in RootBones) + { + if (m_rootCount.TryGetValue(root, out var count)) + { + m_rootCount[root] = count + 1; + } + else + { + m_rootCount.Add(root, 1); + } + } + foreach (var (k, v) in m_rootCount) + { + if (v > 1) + { + Validations.Add(Validation.Error($"Duplicate rootBone: {k} => {v}", ValidationContext.Create(k))); + } + } + } + void Awake() { Setup();