AnimatorStateMachine

重點 ——

(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

    }

}

Animator類的文檔例子

下邊是對該例子的簡單改寫 ——

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;
    }


}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章