【Unity技巧4】使用代碼給動(dòng)畫(huà)狀態(tài)機(jī)批量連線
前段時(shí)間寫技能編輯器的時(shí)候, 發(fā)現(xiàn)很多的動(dòng)畫(huà)片段需要連線,手動(dòng)連線肯定是很麻煩。
那么如何優(yōu)雅得連線呢?
那就是使用AnimatorStateMachine的API來(lái)完成這些事件。
核心API
AnimatorStateMachine.AddTransition //連線
AnimatorStateMachine.AddExitTransition? //連線到退出
AnimatorStateMachine.RemoveEntryTransition //移除連線
AnimatorState.AddState //添加動(dòng)畫(huà)片段到狀態(tài)機(jī)

編輯器代碼:
??? public static class XiaocaoEditorAnimTool
??? {
??????? //添加一個(gè)Clip到動(dòng)畫(huà)機(jī)
??????? public static bool AddClipToAnimator(AnimatorController ac, AnimationClip item)
??????? {
??????????? if (!ac.animationClips.Contains(item))
??????????? {
??????????????? AnimatorStateMachine sm = ac.layers[0].stateMachine;
??????????????? AnimatorState state = sm.AddState(item.name, sm.exitPosition + Vector3.up * Random.Range(100, 800));
??????????????? state.motion = item;
??????????????? state.AddExitTransition(true);
??????????????? Debug.Log($"anim add {item.name}");
??????????????? EditorUtility.SetDirty(ac);
??????????????? return true;
??????????? }
??????????? else
??????????? {
??????????????? Debug.Log($"yns has {item.name}");
??????????????? return false;
??????????? }
??????? }
??????? [MenuItem("Assets/AnimatorTool/移除所有連線")]
??????? public static void RemoveAllTransmiss()
??????? {
??????????? OnRemoveAllTransmiss(Selection.activeObject as AnimatorController);
??????? }
??????? [MenuItem("Assets/AnimatorTool/自動(dòng)連線")]
??????? public static void SetIdleTransmiss()
??????? {
??????????? RemoveAllTransmiss();
??????????? OnSetIdleTransmiss(Selection.activeObject as AnimatorController);
??????? }
??????? public static void OnSetIdleTransmiss(AnimatorController ac)
??????? {
??????????? foreach (var item in ac.layers[0].stateMachine.states)
??????????? {
??????????????? if (item.state.name.ToLower() != "idle")
??????????????? {
??????????????????? item.state.AddExitTransition(true);
??????????????? }
??????????? }
??????? }
??????? public static void OnRemoveAllTransmiss(AnimatorController ac, List<string> unRemoves = null)
??????? {
??????????? var stateMachine = ac.layers[0].stateMachine;
??????????? foreach (var item in stateMachine.entryTransitions)
??????????? {
??????????????? if (unRemoves != null)
??????????????? {
??????????????????? if (unRemoves.Contains(item.destinationState.name))
??????????????????? {
??????????????????????? continue;
??????????????????? }
??????????????? }
??????????????? Debug.Log("yns? remove " + item.destinationState);
??????????????? stateMachine.RemoveEntryTransition(item);
??????????? }
??????????? foreach (var item in stateMachine.anyStateTransitions)
??????????? {
??????????????? Debug.Log("yns? remove " + item.destinationState);
??????????????? stateMachine.RemoveAnyStateTransition(item);
??????????? }
??????????? //foreach (var item in ac.layers[0].stateMachine.stateMachines)
??????????? //{
??????????? //??? //Debug.Log("yns? stateMachines " + item.stateMachine.ToString());
??????????? //}
??????????? foreach (var item in ac.layers[0].stateMachine.states)
??????????? {
??????????????? if (unRemoves != null)
??????????????? {
??????????????????? if (unRemoves.Contains(item.state.name))
??????????????????? {
??????????????????????? continue;
??????????????????? }
??????????????? }
??????????????? Debug.Log("yns? states " + item.state.ToString());
??????????????? foreach (var tr in item.state.transitions)
??????????????? {
??????????????????? item.state.RemoveTransition(tr);
??????????????? }
??????????? }
??????????? EditorUtility.SetDirty(ac);
??????????? AssetDatabase.SaveAssets();
??????? }
??? }