1. 程式人生 > 實用技巧 >Unity Animator動畫狀態機

Unity Animator動畫狀態機

Unity Animator動畫狀態機

一個角色一般會擁有若干不同的狀態,需要在不同的條件下播放不同的狀態動畫(執行動作),還需要控制動畫的播放速度、播放時間等。在Unity中使用動畫狀態機(Animator)來將動畫狀態以流程圖的網格化形式視覺化,可以通過它來實現角色動畫狀態的播放以及切換。

Animator視窗

建立、檢視和修改Animator Controller檔案。

右邊部分:網格化佈局區域

Entry:狀態機入口

Exit:狀態機出口

AnyState:任意狀態

State

​ 橙色:預設狀態,進入狀態機時預設連線該動畫

​ 灰色:一般狀態,可以由任意狀態進入該狀態

左邊部分:狀態機的動畫層和引數

  • 動畫層:使用動畫層同時控制角色不同部位或不同功能的狀態

點選右側設定按鈕開啟設定視窗

Weight:權重(0~1),1為正常播放

Mask:此層上使用的遮罩,可以限制動畫的播放部位,例如只要播放上半身的動畫,可以使用一個遮罩定義在上半身播放動畫。

Blending:

​ override:忽略其他層的資訊

​ Additive:在先前層上新增動畫

Sync & Timing:用於動畫同步

​ Sync:勾選並選擇要同步的層,隨後狀態機的結構便會與之相同,但狀態使用的實際動畫剪輯不同。在同步層檢視中對狀態機的佈局或結構所做的任何更改(新增/刪除狀態或過渡)都是針對同步層的源進行的。

​ Timing:同步層上的動畫的長度拉伸到與原始層上的一致,如果選中該選項,則動畫長度將在兩個動畫之間平衡(基於權重)。

IK Pass:開啟IK控制(可用以控制角色頭部注視物體)

可以通過多層動畫實現動畫的混合

  • 引數:控制或影響狀態機流程

    • Int - 整數
    • Float - 浮點數
    • Bool - true 或 false 值(由複選框表示)
    • Trigger - 當被過渡使用時,由控制器重置的布林值引數(以圓形按鈕表示)

動畫狀態

狀態基礎

Motion:狀態繫結的動畫(Animation)

Speed:動畫播放的速度 Multiplier:Speed * 指定引數(float)

作為執行時的播放速度

Motion Time:指定引數(float)作為動畫播放時間

Mirror:映象播放 Parameter:指定引數作(bool)為Mirror的開關

Cycle Offset:迴圈偏移 Parameter:指定引數(float)作為Cycle Offset

Foot IK:腳部IK修正,可解決角色跑動不正常問題

Transition

Solo:只生成當前過渡

Mute:禁用過渡

Has Exit Time:存在退出時間,即上一個狀態能否完整結束

Settings:(可通過數值修改,也可以通過圖形修改)

​ Exit Time:退出時間,前一個狀態的何時開始過渡

​ Fixed Duration:Transition Duration以s為單位 取消勾選:Transition Duration以(前一個狀態的)百分數計數,1為100%

​ Transition Duration:過渡時間

​ Transition Offset:過渡偏移,後一個狀態從何處開始,值為後一個狀態的百分數,1為100%。

​ Interruption Source:中斷源,可以打斷狀態的過渡、

​ None:不可打斷

​ Current State:前一個狀態開始的狀態過渡可以打斷正在進行的狀態過渡

​ Ordered Interruption:優先順序高於當前過渡才可以打斷

​ 如上述狀態過渡,當處於A->B過渡時,如果觸發A->D條件,過程不會被打斷;如果觸發A->C條件,A->B立刻被打斷轉而執行A->B過渡。

​ Next State:從後一個狀態開始的狀態過渡可以打斷正在進行的狀態過渡

​ A->C 和 A->D 將無法打斷這個過渡。但是,此時當我們在 A->B 過程中去觸發 B->D,State Machine 將立刻開始 A->D 的過渡,並且整個過程不需要完成 A->B 的Transition。

​ Current State Then Next State || Next State Then Current State:決定哪個動畫State上的過渡節點優先權更高,前者表示先看前一個State的優先順序如果沒有被觸發,再看後一個State的優先順序,後者則相反,來達到不同的融合與打斷效果。

Condition:過渡條件,可從引數中選擇

​ int / float :可選擇Greater(>)、Less(<)、Equals(==)、NotEqual(!=)指定的數作為過渡條件

​ bool:可選擇指定值(true or false)作為過渡條件

​ Trigger:條件為true時觸發狀態過渡

可以通過指令碼來修改引數的值來觸發響應的的狀態過渡。