77 lines
5.4 KiB
C#
77 lines
5.4 KiB
C#
#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<Component>().Select(c=>c?c.GetType().FullName:"Missing script").ToArray()};
|
|
}
|
|
public static string Inspect()
|
|
{
|
|
var selected=Selection.activeGameObject;
|
|
var selectedAncestors=selected?selected.GetComponentsInParent<Animator>(true).Concat(selected.GetComponentsInChildren<Animator>(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<GameObject>(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<Avatar>().Select(a=>new{a.name,a.isHuman,a.isValid}).ToArray(),
|
|
clips=AssetDatabase.LoadAllAssetsAtPath(p).OfType<AnimationClip>().Select(Clip).ToArray()};
|
|
}).ToArray();
|
|
var result=new{selected=selected?Hierarchy(selected.transform):null,selectedAnimators=selectedAncestors,
|
|
sceneAnimators=UnityEngine.Object.FindObjectsOfType<Animator>(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<Transform>(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<Transform>().Select(p=>new{p.name,euler=V(p.localEulerAngles)}).ToArray()};
|
|
}
|
|
var viewer=UnityEngine.Object.FindObjectOfType<AIGame.Review.CharacterAnimationLab>();
|
|
var clips=AssetDatabase.LoadAllAssetsAtPath("Assets/Bundles/Characters/Human/Common/CampGuideStudio@Walking.fbx").OfType<AnimationClip>().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<Animator>(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
|