Ship the WeChat hot-update catalogs and the camp, TideWhale T2, UI atlas, and animation-lab work.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user