介紹:
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之上添加下面的新腳本元件,就可以實作通過按鍵來切換人物播放的動畫了:
using UnityEngine;
using System.Collections;
public class TestAnimChange : MonoBehaviour
{
private Animator _animator;
void Start()
{
_animator = this.GetComponent<Animator>();
}
void Update()
{
if(Input.GetKeyDown(KeyCode.W))
{
_animator.SetBool("Walk", true);
}
if(Input.GetKeyUp(KeyCode.W))
{
_animator.SetBool("Walk", false);
}
if(Input.GetKeyDown(KeyCode.R))
{
_animator.SetBool("Run", true);
}
if(Input.GetKeyUp(KeyCode.R))
{
_animator.SetBool("Run", false);
}
}
}