簡介
Animator Controller在Unity中是作為一種單獨的配置文件存在的文件類型,其后綴為controller,Animator Controller包含了以下幾種功能:
- 可以對多個動畫進行整合;
- 使用狀態機來實現動畫的播放和切換;
- 可以實現動畫融合和分層播放;
- 可以通過腳本來對動畫播放進行深度控制;
下面我們通過一個圖來直觀的看看動畫的組成結構:
Animator組件用來控制人物動畫的播放,其中需要的兩個最核心的內容就是控制動畫播放邏輯的Animator Controller以及動畫骨骼Avatar對象。
Animator組件
我們需要播放動畫的角色都需要添加Animator組件,該組件即為我們控制動畫的接口,下面我們來看看Animator組件:
- Controller:使用的Animator Controller文件。
- Avatar:使用的骨骼文件。
- Apply Root Motion:綁定該組件的GameObject的位置是否可以由動畫進行改變(如果存在改變位移的動畫)。
- Update Mode:更新模式:Normal表示使用Update進行更新,Animate Physics表示使用FixUpdate進行更新(一般用在和物體有交互的情況下),Unscale Time表示無視timeScale進行更新(一般用在UI動畫中)。
- Culling Mode:剔除模式:Always Animate表示即使攝像機看不見也要進行動畫播放的更新,Cull Update Transform表示攝像機看不見時停止動畫播放但是位置會繼續更新,Cull Completely表示攝像機看不見時停止動畫的所有更新。
下方還會顯示我們的動畫的一些主要信息。
Animator Override Controller
我們在右鍵創建資源時還會發現這樣的一個資源,該資源的意思是基於某個Animator Controller進行每個狀態的動畫的修改,其他設置不變,可以方便的復用我們已經創建好的Animator Controller。
創建一個Animator Controller
我們在Project視圖中右擊菜單中可以創建Animator Controller,下面我們看看新創建的Animator Controller:
首先,我們發現的是3個默認的狀態,這些狀態是Unity自動幫我們創建的同時也無法刪除:
- Entry:表示當進入當前狀態機時的入口,該狀態連接的狀態會成為進入狀態機后的第一個狀態;
- Any State:表示任意的狀態,其作用是其指向的狀態是在任意時刻都可以切換過去的狀態;
- Exit:表示退出當前的狀態機,如果有任意狀態指向該出口,表示可以從指定狀態退出當前的狀態機;
創建新狀態
1.我們可以通過右鍵菜單進行創建:
2.或者我們可以通過把一個Animation Clip拖拽到狀態機窗口中進行創建;
我們發現我們創建的第一個狀態被設置為默認的第一個狀態,第一個狀態會被標記為黃色,如下:
我們可以通過Inspector窗口進行該狀態的設置,上篇筆記有詳細的解說。
我們可以使用這兩種方法來創建多個狀態,同時配置好每個狀態,如下:
狀態切換
我們的狀態機已經有了狀態,但是還沒有指定每個狀態之間的關系,下面我們來看看該如何指定狀態之間的關系。
在Mecanim中,動畫之間的播放不再是通過調用諸如“Play”之類的方法進行切換了,而是通過判斷參數的變換來進行狀態即動畫的切換。
我們打開Parameters面板,這里被用來設置狀態機使用到的各種參數,如下:
點擊加號可以創建一個參數,在Unity中允許我們創建4種類型的參數:
Float:float類型的參數,多用於控制狀態機內部的浮點型參數;
Int:int類型的參數,多用於控制狀態機內部的整型參數;
Bool:bool類型參數,多用於狀態切換;
Trigger:本質上也是一個bool類型的參數,但是其值默認為false,且設置為true后系統會自動將其還原為false;
下面我們創建兩個簡單的Bool類型的變量,如下:
我們希望,當Walk為true時人物走動,為false時人物站立,Run也是一致,只不過會過渡到跑動。
下面我們通過右擊狀態的菜單可以拉出一條狀態轉換的線條,表示當前狀態轉換到目標狀態。
我們點擊線條可以在Inspector窗口設定轉換的條件,如下:
我們在條件框設置Walk為true,表示當Walk被設置為true時就從站立跳轉到走路動畫,同樣的,走路回到站立也需要一條轉換的線條,不過Walk要設置為false:
Run的設定也一致。
Has Exit Time
我們發現線條中有一個勾選項Has Exit Time,那么它是什么意思呢?
如果我們勾選了該項,在動畫轉換時會等待當前動畫播放完畢才會轉換到下一個動畫,如果當前動畫是循環動畫會等待本次播放完畢時轉換,所以對於需要立即轉換動畫的情況時記得要取消勾選。
還有一種情況時,當我當前的動畫播放完畢后就自動轉換到箭頭所指的下一個狀態(沒有其他跳轉條件),此時必須勾選該選項,否則動畫播放完畢后就會卡在最后一幀,如果是循環動畫就會一直循環播放。
控制動畫轉換
我們在綁定了Animator組件的GameObject之上添加下面的新腳本組件,就可以實現通過按鍵來切換人物播放的動畫了:
1 using UnityEngine; 2 using System.Collections; 3 4 public class TestAnimChange : MonoBehaviour 5 { 6 private Animator _animator; 7 8 void Start() 9 { 10 _animator = this.GetComponent<Animator>(); 11 } 12 13 void Update() 14 { 15 if(Input.GetKeyDown(KeyCode.W)) 16 { 17 _animator.SetBool("Walk", true); 18 } 19 if(Input.GetKeyUp(KeyCode.W)) 20 { 21 _animator.SetBool("Walk", false); 22 } 23 if(Input.GetKeyDown(KeyCode.R)) 24 { 25 _animator.SetBool("Run", true); 26 } 27 if(Input.GetKeyUp(KeyCode.R)) 28 { 29 _animator.SetBool("Run", false); 30 } 31 } 32 }