123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- using UnityEngine;
- namespace Animancer
- {
-
-
-
-
-
-
- public interface ICharacterRoot
- {
-
- #pragma warning disable IDE1006 // Naming Styles.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Transform transform { get; }
-
- #pragma warning restore IDE1006 // Naming Styles.
-
- }
- }
- #if UNITY_EDITOR
- namespace Animancer.Editor
- {
-
- partial class AnimancerEditorUtilities
- {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- public static Transform FindRoot(GameObject gameObject)
- {
- var root = gameObject.GetComponentInParent<ICharacterRoot>();
- if (root != null)
- return root.transform;
- #if UNITY_EDITOR
- var path = UnityEditor.AssetDatabase.GetAssetPath(gameObject);
- if (!string.IsNullOrEmpty(path))
- return gameObject.transform.root;
- var status = UnityEditor.PrefabUtility.GetPrefabInstanceStatus(gameObject);
- if (status != UnityEditor.PrefabInstanceStatus.NotAPrefab)
- {
- gameObject = UnityEditor.PrefabUtility.GetOutermostPrefabInstanceRoot(gameObject);
- return gameObject.transform;
- }
- #endif
- var animators = ObjectPool.AcquireList<Animator>();
- gameObject.GetComponentsInChildren(true, animators);
- var animatorCount = animators.Count;
- var parent = gameObject.transform;
- while (parent.parent != null)
- {
- animators.Clear();
- parent.parent.GetComponentsInChildren(true, animators);
- if (animatorCount == 0)
- animatorCount = animators.Count;
- else if (animatorCount != animators.Count)
- break;
- parent = parent.parent;
- }
- ObjectPool.Release(animators);
- return parent;
- }
-
-
-
-
-
- public static Transform FindRoot(Object obj)
- {
- if (obj is ICharacterRoot iRoot)
- return iRoot.transform;
- return TryGetGameObject(obj, out var gameObject) ? FindRoot(gameObject) : null;
- }
-
-
-
-
-
-
-
- public static bool TryGetGameObject(Object obj, out GameObject gameObject)
- {
- if (obj is GameObject go)
- {
- gameObject = go;
- return true;
- }
- if (obj is Component component)
- {
- gameObject = component.gameObject;
- return true;
- }
- gameObject = null;
- return false;
- }
-
- }
- }
- #endif
|