static void FindAllAniInControlMachine(UnityEditorInternal.StateMachine machine, List <AnimationClip> list) { for (int i = 0; i < machine.stateCount; i++) { var s = machine.GetState(i); var m = s.GetMotion(); if (m != null) { if (list.Contains(m as AnimationClip) == false) { list.Add(m as AnimationClip); if (m.name != s.name) { //Debug.LogWarning("发现一个问题,clipname 和 state name 不相等 " + m.name + "=>" + s.name); } mapClip2State[m.name] = s.name; //建立一张转换表,把clip的名字转换为state的名字,以正常clone } } } for (int i = 0; i < machine.stateMachineCount; i++) { var m = machine.GetStateMachine(i); FindAllAniInControlMachine(m, list); } }
private List <AnimationCustomCurves> GetCurvesFromStateMachine(UnityEditorInternal.StateMachine stateMachine, string namePrefix) { var animCurvesList = new List <AnimationCustomCurves>(); // Por cada estado de la maquina for (int stateIndex = 0; stateIndex < stateMachine.stateCount; stateIndex++) { //Extrae el estado y el animation clip var state = stateMachine.GetState(stateIndex); var clip = state.GetMotion() as AnimationClip; // Si no esta el clip ya en la lista lo agrega if (!animCurvesList.Exists(x => x.name == clip.name)) { var deltaX = new AnimationCurve(); var deltaY = new AnimationCurve(); var deltaZ = new AnimationCurve(); // Extrae las curvas #pragma warning disable 612, 618 foreach (var curveData in AnimationUtility.GetAllCurves(clip)) #pragma warning restore 612, 618 { if (curveData.propertyName == "deltaX") { deltaX = NormalizeCurveLength(curveData.curve, 1f); } else if (curveData.propertyName == "deltaY") { deltaY = NormalizeCurveLength(curveData.curve, 1f); } else if (curveData.propertyName == "deltaZ") { deltaZ = NormalizeCurveLength(curveData.curve, 1f); } } // Agrega el nodo animCurvesList.Add(new AnimationCustomCurves(namePrefix + state.name, deltaX, deltaY, deltaZ)); } } // Para cada sub maquina de estado for (int index = 0; index < stateMachine.stateMachineCount; index++) { // Extrae la maquina de estados var subStateMachine = stateMachine.GetStateMachine(index); // Agrega al prefijo el nombre de la sub maquina var subNamePrefix = subStateMachine.name + ("."); // Extrae las curvas de la submaquina animCurvesList.AddRange(GetCurvesFromStateMachine(subStateMachine, subNamePrefix)); } return(animCurvesList); }
public static IEnumerable <UnityEditorInternal.State> EnumerateStatesRecursive(this UnityEditorInternal.StateMachine sm) { foreach (var i in EnumerateStates(sm)) { yield return(i); } for (int i = 0; i < sm.stateMachineCount; ++i) { foreach (var j in EnumerateStatesRecursive(sm.GetStateMachine(i))) { yield return(j); } } }
public static IEnumerable <KeyValuePair <string, string> > EnumerateStateNamesRecursive(this UnityEditorInternal.StateMachine sm) { for (int i = 0; i < sm.stateCount; ++i) { yield return(new KeyValuePair <string, string>(sm.name + "." + sm.GetState(i).name, sm.GetState(i).name)); } for (int i = 0; i < sm.stateMachineCount; ++i) { var ssm = sm.GetStateMachine(i); foreach (var j in EnumerateStateNamesRecursive(ssm)) { yield return(j); } } }
private static int GetTransitionsCountFromStateMachine(StateMachine sm) { int total = 0; List<Transition> transitions = new List<Transition>(); for (int i = 0; i < sm.stateCount; ++i) { transitions.AddRange(sm.GetTransitionsFromState(sm.GetState(i))); } total = transitions.Count; for (int i = 0; i < sm.stateMachineCount; ++i) { total += GetTransitionsCountFromStateMachine(sm.GetStateMachine(i)); } return total; }
private static string[] GetTransitionNamesFromStateMachine(StateMachine sm) { List<string> transitionNames = new List<string>(); List<Transition> transitions = new List<Transition>(); for (int i = 0; i < sm.stateCount; ++i) { transitions.AddRange(sm.GetTransitionsFromState(sm.GetState(i))); } foreach (Transition transition in transitions) transitionNames.Add(transition.uniqueName); for (int i = 0; i < sm.stateMachineCount; ++i) { transitionNames.AddRange(GetTransitionNamesFromStateMachine(sm.GetStateMachine(i))); } return transitionNames.ToArray(); }
private static int[] GetTransitionKeysFromStateMachine(StateMachine sm) { List<int> transitionKeys = new List<int>(); List<Transition> transitions = new List<Transition>(); for (int i = 0; i < sm.stateCount; ++i) { transitions.AddRange(sm.GetTransitionsFromState(sm.GetState(i))); } foreach (Transition transition in transitions) transitionKeys.Add(transition.uniqueNameHash); for (int i = 0; i < sm.stateMachineCount; ++i) { transitionKeys.AddRange(GetTransitionKeysFromStateMachine(sm.GetStateMachine(i))); } return transitionKeys.ToArray(); }
private static string[] GetStateNamesFromStateMachine(StateMachine sm) { List<string> stateNames = new List<string>(); for (int i = 0; i < sm.stateCount; ++i) { stateNames.Add(sm.GetState(i).uniqueName); } for (int i = 0; i < sm.stateMachineCount; ++i) { stateNames.AddRange(GetStateNamesFromStateMachine(sm.GetStateMachine(i))); } return stateNames.ToArray(); }
private static int[] GetStateKeysFromStateMachine(StateMachine sm) { List<int> stateKeys = new List<int>(); for (int i = 0; i < sm.stateCount; ++i) { stateKeys.Add(sm.GetState(i).uniqueNameHash); } for (int i = 0; i < sm.stateMachineCount; ++i) { stateKeys.AddRange(GetStateKeysFromStateMachine(sm.GetStateMachine(i))); } return stateKeys.ToArray(); }
private static void FromStateMachineToTransitionName(StateMachine stateMachine, List<string> transitionNames) { for (int i = 0; i < stateMachine.stateCount; i++) { Transition[] trans = stateMachine.GetTransitionsFromState(stateMachine.GetState(i)); foreach(Transition tran in trans) { transitionNames.Add(tran.uniqueName); } } for (int i = 0; i < stateMachine.stateMachineCount; i++) { FromStateMachineToTransitionName(stateMachine.GetStateMachine(i), transitionNames); } }
private static void FromStateMachineToStateName(StateMachine stateMachine, List<string> stateNames) { for (int i = 0; i < stateMachine.stateCount; i++) { stateNames.Add(stateMachine.GetState(i).uniqueName); } for (int i = 0; i < stateMachine.stateMachineCount; i++) { FromStateMachineToStateName(stateMachine.GetStateMachine(i), stateNames); } }
private static void FromStateMachineToStateKey(StateMachine stateMachine, List<int> stateKeys) { for (int i = 0; i < stateMachine.stateCount; i++) { stateKeys.Add(stateMachine.GetState(i).uniqueNameHash); } for (int i = 0; i < stateMachine.stateMachineCount; i++) { FromStateMachineToStateKey(stateMachine.GetStateMachine(i), stateKeys); } }
static ControllerStateMachine ConverStateMachine(UnityEditorInternal.StateMachine stateMachine, ControllerState[] states) { return(new ControllerStateMachine() { name = stateMachine.name, hash = Animator.StringToHash(stateMachine.name), states = states.Where(i => stateMachine.EnumerateStates().Any(j => j.uniqueNameHash == i.uniqueNameHash)).ToArray(), subStateMachines = Enumerable.Range(0, stateMachine.stateMachineCount).Select(i => ConverStateMachine(stateMachine.GetStateMachine(i), states)).ToArray() }); }