#if UNITY_EDITOR using System; using System.IO; using System.Linq; using Newtonsoft.Json; using UnityEditor; using UnityEditor.Animations; using UnityEngine; public static class InspectBoyAnimator { static string PathOf(UnityEngine.Object o)=>o?AssetDatabase.GetAssetPath(o):null; static string Hierarchy(Transform t)=>!t?null:!t.parent?t.name:Hierarchy(t.parent)+"/"+t.name; static object Clip(AnimationClip c)=>new{c.name,path=PathOf(c),c.legacy,c.humanMotion,c.length,curves=AnimationUtility.GetCurveBindings(c).Length, paths=AnimationUtility.GetCurveBindings(c).Select(x=>x.path).Distinct().Take(5).ToArray()}; static object AnimatorInfo(Animator a) { var controller=a.runtimeAnimatorController; var ac=controller as AnimatorController; return new{path=Hierarchy(a.transform),asset=PathOf(a.gameObject),prefabSource=PathOf(PrefabUtility.GetCorrespondingObjectFromSource(a.gameObject)), a.enabled,a.applyRootMotion,a.updateMode,a.cullingMode,a.isHuman,bindingWarning=new SerializedObject(a).FindProperty("m_WarningMessage")?.stringValue, avatar=a.avatar?new{name=a.avatar.name,path=PathOf(a.avatar),a.avatar.isValid,a.avatar.isHuman}:null, controller=controller?new{name=controller.name,path=PathOf(controller),clips=controller.animationClips.Select(Clip).ToArray()}:null, states=ac?ac.layers.Select(l=>new{l.name,defaultState=l.stateMachine.defaultState?l.stateMachine.defaultState.name:null, states=l.stateMachine.states.Select(s=>new{s.state.name,motion=PathOf(s.state.motion),motionName=s.state.motion?s.state.motion.name:null}).ToArray()}).ToArray():null, components=a.GetComponents().Select(c=>c?c.GetType().FullName:"Missing script").ToArray()}; } public static string Inspect() { var selected=Selection.activeGameObject; var selectedAncestors=selected?selected.GetComponentsInParent(true).Concat(selected.GetComponentsInChildren(true)).Distinct().Select(AnimatorInfo).ToArray():null; string[] paths={"Assets/Bundles/Characters/Human/test/Boy_mixamo/CampGuideStudio.fbx", "Assets/Bundles/Characters/Human/Common/CampGuideStudio@Walking.fbx", "Assets/Bundles/Characters/Human/Common/CampGuideStudio@Breathing Idle.fbx", "Assets/Bundles/Characters/Human/Common/CampGuideStudio@Happy Idle.fbx"}; var importers=paths.Select(p=> { var importer=AssetImporter.GetAtPath(p) as ModelImporter; var model=AssetDatabase.LoadAssetAtPath(p); return new{path=p,exists=importer!=null,type=importer?importer.animationType.ToString():null, avatarSetup=importer?importer.avatarSetup.ToString():null,sourceAvatar=importer?PathOf(importer.sourceAvatar):null, avatars=AssetDatabase.LoadAllAssetsAtPath(p).OfType().Select(a=>new{a.name,a.isHuman,a.isValid}).ToArray(), clips=AssetDatabase.LoadAllAssetsAtPath(p).OfType().Select(Clip).ToArray()}; }).ToArray(); var result=new{selected=selected?Hierarchy(selected.transform):null,selectedAnimators=selectedAncestors, sceneAnimators=UnityEngine.Object.FindObjectsOfType(true).Select(AnimatorInfo).ToArray(),importers}; var output=JsonConvert.SerializeObject(result,Formatting.Indented); var directory=System.IO.Path.Combine(Directory.GetParent(Application.dataPath).Parent.FullName,"Tools/output/campguide_studio/animator_warning"); Directory.CreateDirectory(directory);File.WriteAllText(System.IO.Path.Combine(directory,"inspection.json"),output); return output; } public static string Direction() { object V(Vector3 v)=>new{x=v.x,y=v.y,z=v.z}; object Rig(Transform t) { var bones=t.GetComponentsInChildren(true); Transform Bone(string n)=>bones.FirstOrDefault(b=>b.name.EndsWith(n)); var foot=Bone("LeftFoot");var toe=Bone("LeftToeBase"); return new{name=Hierarchy(t),localEuler=V(t.localEulerAngles),worldEuler=V(t.eulerAngles),scale=V(t.lossyScale), worldToeDirection=foot&&toe?V((toe.position-foot.position).normalized):null, localToeDirection=foot&&toe?V(t.InverseTransformDirection(toe.position-foot.position).normalized):null, parents=t.GetComponentsInParent().Select(p=>new{p.name,euler=V(p.localEulerAngles)}).ToArray()}; } var viewer=UnityEngine.Object.FindObjectOfType(); var clips=AssetDatabase.LoadAllAssetsAtPath("Assets/Bundles/Characters/Human/Common/CampGuideStudio@Walking.fbx").OfType().Where(c=>!c.name.StartsWith("__preview__")).Select(c=> { var settings=AnimationUtility.GetAnimationClipSettings(c); return new{c.name,c.humanMotion,settings.orientationOffsetY,settings.keepOriginalOrientation,settings.keepOriginalPositionXZ}; }).ToArray(); return JsonConvert.SerializeObject(new{EditorApplication.isPlaying, animators=UnityEngine.Object.FindObjectsOfType(true).Select(a=>new{rig=Rig(a.transform),a.isHuman,a.applyRootMotion}).ToArray(), viewer=viewer?new{viewer.yaw,actors=viewer.actors.Select(a=>Rig(a.rig.transform)).ToArray()}:null,clips},Formatting.Indented); } } #endif