Animator Controller在Unity中是做爲一種單獨的配置文件存在的文件類型,其後綴爲controller,Animator Controller包含了如下幾種功能:ide
下面咱們經過一個圖來直觀的看看動畫的組成結構:動畫
Animator組件用來控制人物動畫的播放,其中須要的兩個最核心的內容就是控制動畫播放邏輯的Animator Controller以及動畫骨骼Avatar對象。this
咱們須要播放動畫的角色都須要添加Animator組件,該組件即爲咱們控制動畫的接口,下面咱們來看看Animator組件:spa
下方還會顯示咱們的動畫的一些主要信息。3d
咱們在右鍵建立資源時還會發現這樣的一個資源,該資源的意思是基於某個Animator Controller進行每一個狀態的動畫的修改,其餘設置不變,能夠方便的複用咱們已經建立好的Animator Controller。code
咱們在Project視圖中右擊菜單中能夠建立Animator Controller,下面咱們看看新建立的Animator Controller:orm
首先,咱們發現的是3個默認的狀態,這些狀態是Unity自動幫咱們建立的同時也沒法刪除:對象
1.咱們能夠經過右鍵菜單進行建立:blog
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,那麼它是什麼意思呢?
若是咱們勾選了該項,在動畫轉換時會等待當前動畫播放完畢纔會轉換到下一個動畫,若是當前動畫是循環動畫會等待本次播放完畢時轉換,因此對於須要當即轉換動畫的狀況時記得要取消勾選。
還有一種狀況時,當我當前的動畫播放完畢後就自動轉換到箭頭所指的下一個狀態(沒有其餘跳轉條件),此時必須勾選該選項,不然動畫播放完畢後就會卡在最後一幀,若是是循環動畫就會一直循環播放。
咱們在綁定了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 }