From 375333a729999050e8b739f4b8bd6d8a6e459212 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Couture?= Date: Thu, 21 Oct 2021 09:19:02 +0200 Subject: [PATCH] Fixed the rootbone in the character creation --- .../CharacterCreationWindow.cs | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/Assets/CharacterPrefabCreator/CharacterCreationWindow.cs b/Assets/CharacterPrefabCreator/CharacterCreationWindow.cs index 80a0f36..c5044c7 100644 --- a/Assets/CharacterPrefabCreator/CharacterCreationWindow.cs +++ b/Assets/CharacterPrefabCreator/CharacterCreationWindow.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Linq; using UnityEditor; using UnityEngine; @@ -62,7 +63,9 @@ void OnGUI() { renderer.sharedMaterials = materialsClone; - renderer.receiveShadows = false; + if (renderer is SkinnedMeshRenderer skinnedMeshRenderer) { + skinnedMeshRenderer.rootBone = FindRecursive(prefab.transform, skinnedMeshRenderer.rootBone.name); + } }); } @@ -120,21 +123,42 @@ private void EditPrefabValue(GameObject prefab, Action valuesModifie //DestroyImmediate(instance); } - // source: https://forum.unity.com/threads/custom-editor-new-prefabs-how-to-setup-overrides.675310/#post-4574266 - private void SetPrefabDirty(GameObject prefab) { - EditorUtility.SetDirty(prefab); - PrefabUtility.RecordPrefabInstancePropertyModifications(prefab); - UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(prefab.scene); - } - private bool IsCharacterCreationPossible() => characterRig != null && characterModel != null && characterAvatar != null && characterBasePrefab != null; - - private T ObjectField(string fieldLabel, T obj, bool allowSceneObjects) where T : UnityEngine.Object { + /// + /// Works just like Transform.Find(string), but recursively. + /// + /// The transform to start from. + /// the name of the transform to find, as child of parent. + /// A child transform of parent with the name targetName, or null if none can be found. + private Transform FindRecursive(Transform parent, string targetName) { + List transformsToLookAt = GetAllDirectChildrenOf(parent); + + while (transformsToLookAt.Count > 0) { + foreach (Transform child in transformsToLookAt) { + if (child.name == targetName) + return child; + } + + List nextLayer = new List(); + foreach (Transform child in transformsToLookAt) { + nextLayer.AddRange(GetAllDirectChildrenOf(child)); + } + + transformsToLookAt = nextLayer; + } + + return null; + } + + private List GetAllDirectChildrenOf(Transform parent) => + Enumerable.Range(0, parent.childCount).Select(parent.GetChild).ToList(); + + private T ObjectField(string fieldLabel, T obj, bool allowSceneObjects) where T : UnityEngine.Object { return (T) EditorGUILayout.ObjectField(fieldLabel, obj, typeof(T), allowSceneObjects); } }