重點 ——
(0)狀態機與子狀態機的切換,狀態之間的切換
(1)狀態調用的切換 AnimatorStateTransition、狀態機調用的切換 AnimatorTransition
(2)添加狀態的先後順序,決定了該狀態機或子狀態機的默認狀態,但也可以用 stateMachineA.defaultState來直接指定
(3)從父狀態機切換到子狀態機,entry —-> stateX,會選擇一個滿足條件的狀態
(4)從子狀態機 exit,會切換到父狀態機,entry —-> 默認狀態,不需要滿足條件(爲啥)
(5)有時候會看到三個箭頭的情況,有些是因爲有多個切換(子狀態機中包含子狀態機),有些是因爲 AnimatorStateMachine.AddEntryTransition ,連到一個子狀態機中的默認狀態(三箭頭黃線)
這樣看,大致上可以這樣理解 ——
1、AnimatorController (動畫控制器)負責管理
層 AnimatorControllerLayer、
參數 AnimatorControllerParameter、
爲動畫狀態 AnimatorState 指定 動畫剪輯 AnimationClip、
爲動畫狀態 AnimatorState 指定 StateMachineBehaviour(AnimatorState的組件)
(還有一個 AddClip 也可以直接添加動畫狀態)
2、AnimatorStateMachine (動畫狀態機)負責管理
動畫狀態之間的切換 AnimatorTransition
添加動畫狀態 AnimatorState
添加動畫狀態機 AnimatorStateMachine
添加StateMachineBehaviour ———— AddStateMachineBehaviour( Type xx )
//注意添加動畫狀態機的寫法,一般是用 根狀態機來加其他的,每個狀態機就是一個“頁面”
var rootStateMachine = controller.layers[0].stateMachine;
var stateMachineA = rootStateMachine.AddStateMachine("smA");
var stateMachineB = rootStateMachine.AddStateMachine("smB");
var stateMachineC = stateMachineB.AddStateMachine("smC");
3、AnimatorTransition (動畫狀態切換)
繼承 AnimatorTransitionBase,主要是
AnimatorStateMachine.AddStateMachineTransition
和 AnimatorStateMachine.AddEntryTransition的時候 ,返回類型爲 AnimatorTransition,這個主要負責狀態機之間的切換
例如
AnimatorStateMachine rootStateMachine = controller.layers[0].stateMachine;
//root添加 smA 和 smB , smB 添加 smC
rootStateMachine.AddStateMachineTransition(smA,smB);
rootStateMachine.AddStateMachineTransition(smA,smC);
4、AnimatorCondition (動畫狀態切換條件)
public AnimatorConditionMode mode; //If IfNot Greater Less Equal NotEqual
public string parameter;
public float threshold; //條件爲真的閾值
通常是,添加一個Transition,返回一個 AnimatorTransition 或 AnimatorStateTransition 實例,再用這個實例來 AddCondition,例如
var rootStateMachine = controller.layers[0].stateMachine;
var resetTransition = rootStateMachine.AddAnyStateTransition(stateA1);
resetTransition.AddCondition(AnimatorConditionMode.If, 0, "Reset");
resetTransition.duration = 0;
從API看出 AnimatorStateMachine 類的大致結構如下 ——
using UnityEngine;
nameSpace UnityEdior.Animations
{
public class AnimatorStateMachine : object
{
public Vector3 anyStatePosition; //AnyState節點的座標
public AnimatorStateTransition[] anyStateTransitions; //AnyState的切換列表
public Vector3 entryPosition; //entry 節點的座標
public AnimatorTransition[] entryTransitions; //entry的切換列表
public Vector3 exitPosition; //exit 節點的座標
public Vector3 parentStateMachinePosition; //父狀態機節點的座標(只在分層的狀態機中有效)
public ChildAnimatorStateMachine[] stateMachines; //該狀態機的子狀態機的列表
public ChildAnimatorState[] states; //該狀態機的子狀態的列表
public StateMachineBehaviour[] behaviours; //這個狀態機的狀態的全部StateMachineBehaviour
public AnimatorState defaultState; //默認的動畫狀態(開始時就會進這個狀態)
//----------------------------------------
//添加、移除動畫狀態的轉換
AddAnyStateTransition / RemoveAnyStateTransition
AddEntryTransition / RemoveEntryTransition
AddStateMachineExitTransition / 這裏就沒有remove
//添加動畫狀態機之間、狀態機與狀態之間的轉換
AddStateMachineTransition
//獲取、設置 StateMachineTransition ----------
GetStateMachineTransitions / SetStateMachineTransitions
//添加、移除狀態、狀態機
AddState / RemoveState
AddStateMachine / RemoveStateMachine
//添加、移除 StateMachineBehaviour
AddStateMachineBehaviour / RemoveStateMachineBehaviour
MakeUniqueStateMachineName
MakeUniqueStateName
}
}
下邊是對該例子的簡單改寫 ——
using UnityEngine;
using UnityEditor;
using UnityEditor.Animations;
//狀態機調用切換 ,返回值 類型 Animator Transition
//狀態 調用切換,返回值 類型 Animator State Transition
public class MyCreateStateMachine : MonoBehaviour {
static AnimatorController animController;
static AnimatorStateMachine smA;
static AnimatorStateMachine smB;
static AnimatorStateMachine smC;
[MenuItem("MyMenu/CreateMyStateMachine")]
static void Create()
{
animController = AnimatorController.CreateAnimatorControllerAtPath("Assets/Mecanim/MyController.controller");
AddParameters();
CreateRootStateMachine();
CreateStateMachineA();
CreateStateMachineB();
CreateStateMachineC();
}
static void AddParameters()
{
animController.AddParameter("TransitionNow", AnimatorControllerParameterType.Trigger);
animController.AddParameter("Reset", AnimatorControllerParameterType.Trigger);
animController.AddParameter("GotoB1", AnimatorControllerParameterType.Trigger);
animController.AddParameter("GotoC", AnimatorControllerParameterType.Trigger);
}
static void CreateRootStateMachine()
{
AnimatorStateMachine rootStateMachine = animController.layers[0].stateMachine;
smA = rootStateMachine.AddStateMachine("smA");
smB = rootStateMachine.AddStateMachine("smB");
smC = smB.AddStateMachine("smC");
AnimatorTransition stateMachineTransition = rootStateMachine.AddStateMachineTransition(smA, smC); // 狀態機之間的切換
stateMachineTransition.AddCondition(AnimatorConditionMode.If, 0, "GotoC");
rootStateMachine.AddStateMachineTransition(smA, smB);
}
static void CreateStateMachineA()
{
AnimatorState stateA1 = smA.AddState("stateA1");
AnimatorStateTransition exitTransition = stateA1.AddExitTransition(); //xx state Transition
exitTransition.AddCondition(AnimatorConditionMode.If, 0, "TransitionNow");
exitTransition.duration = 0;
}
static void CreateStateMachineB()
{
AnimatorState stateB1 = smB.AddState("stateB1"); //添加的先後順序決定了默認狀態
AnimatorState stateB2 = smB.AddState("stateB2");
AnimatorTransition transitionB1 = smB.AddEntryTransition(stateB1); // Entry --- B1 xx Transition
transitionB1.AddCondition(AnimatorConditionMode.If, 0, "GotoB1");
AnimatorTransition transitionB2 = smB.AddEntryTransition(stateB2); // Entry --- B2
}
static void CreateStateMachineC()
{
AnimatorState stateC1 = smC.AddState("stateC1");
AnimatorState stateC2 = smC.AddState("stateC2");
//通過這裏指定默認狀態,所以上邊即使先寫stateC1也沒用,默認狀態爲 stateC2
//默認狀態,如果不需要指定 entry 到這個默認狀態的條件,那麼這句就可以達到切換的效果
smC.defaultState = stateC2;
// smC.AddEntryTransition(stateC2); //如果加了這句,就會有三個箭頭的黃線
AnimatorStateTransition exitTransitionC2 = stateC2.AddExitTransition(); // xx State Transition
exitTransitionC2.AddCondition(AnimatorConditionMode.If, 0, "TransitionNow");
exitTransitionC2.duration = 0;
}
}