1. 程式人生 > >Unity3D之Mecanim動畫系統學習筆記(五):Animator Controller

Unity3D之Mecanim動畫系統學習筆記(五):Animator Controller

浮點 key 發現 菜單 融合 stat mon 好的 project

簡介

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 }
技術分享

Unity3D之Mecanim動畫系統學習筆記(五):Animator Controller