Unity Mecanim動畫的實現(十):動畫混合樹、子狀態機和狀態行爲
1.動畫混合樹
混合樹表示多個狀態的混合調用,一般根據某些參數來實現這些動畫狀態之間的混合與切換,根據參數的個數可以分爲1D混合、2D混合和直接混合。比如在之前的案例中,我們通過控制Float參數Speed實現了Idle、Run、Walk之間的過渡,我們這裏也可以通過混合樹來實現。1D混合如下圖所示。
- 設定混合類型爲1D
- 添加混合參數Speed
- 添加Motion,並設定Motion在的門坎值。
我們通過一個混合樹就實現了之前通過三個狀態並設定過渡條件實現的功能。
除了1D混合,我們還可以2D混合,2D混合有三種不同類型:
- 2D simple Directional,表示在二維每個空間方向只能有一個動作;
- 2D Freedom Directional,表示在二維每個空間方向可以有兩個動作,但是必須一個是Idle。
- 2D Freedom Cartesian,表示在笛卡爾二維空間中各個方向可以隨便設定動作。這個是最常用的。
下面我們在1D的基礎上,增加三個動作,後退、左轉和右轉,那麼1D混合滿足不了需求了,我們需要用2D混合類型,通過2D類型控制了6個Motion的切換。
2.子狀態機
子狀態相當於在目前層的狀態機下面建立一個自狀態集合,可以將類似的動畫裝填結合在一起,簡化動畫邏輯。典型的子狀態機如下所示(Attack是子狀態機):
3.狀態行爲
狀態行爲即爲狀態機中的狀態添加腳本,在狀態進入、更新事件、IK、根動畫時進行一些腳本控制。
狀態行爲腳本繼承的類是StateMachineBehaviour,包括五個回調函數。他們的回調時機可以從Unity提供的註釋得知:
using UnityEngine;
using System.Collections;
public class Test : StateMachineBehaviour {
// OnStateEnter is called before OnStateEnter is called on any state inside this state machine
//override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
//
//}
// OnStateUpdate is called before OnStateUpdate is called on any state inside this state machine
//override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
//
//}
// OnStateExit is called before OnStateExit is called on any state inside this state machine
//override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
//
//}
// OnStateMove is called before OnStateMove is called on any state inside this state machine
//override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
//
//}
// OnStateIK is called before OnStateIK is called on any state inside this state machine
//override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
//
//}
// OnStateMachineEnter is called when entering a statemachine via its Entry Node
//override public void OnStateMachineEnter(Animator animator, int stateMachinePathHash){
//
//}
// OnStateMachineExit is called when exiting a statemachine via its Exit Node
//override public void OnStateMachineExit(Animator animator, int stateMachinePathHash) {
//
//}
}
狀態行爲可以用於添加狀態發生時的音效、控制碰撞檢測代碼等。