1、Animator組件
任何一個擁有Avatar的GameObject都同時需要有一個Animator組件,該組件是關聯角色及其行為的紐帶。
Animator組件中還引用了一個Animator Controller,它被用於為角色設置行為,這里所說的行為包括狀態機(State Machines)、混合樹(Blend Trees)以及通過腳本控制的事件(Events),具體包括:
- Controller:關聯到該角色的Animator控制器。
- Avatar:該角色的Avatar。
- Apply Root Motion:是使用動畫本身還是使用腳本來控制角色的位置。
- Update Mode:動畫的更新模式。
- Normal:同步更新,動畫速度與運行速度相匹配,運行速度慢,動畫慢。
- Animate Physics:動畫是有物理的相互作用時,用詞模式,例如,人物可以推動周圍的剛體。
- Unscaled Time:不成比例的事件,動畫忽略當前的運行速度。
- Culling Mode:動畫的裁剪模式
- Always Animate:總是啟用動畫,不進行裁剪。
- Cull Update Transforms:更新裁切。
- Cull Completely:完全裁切。
2、Animator Controller
Animator Controller視圖包括:
- Animation Layer組件。
- 事件參數組件。
- 狀態機自身的可視化表達。
需要注意的是,Animator Controller視圖總是顯示最近被選中的.controller資源的狀態機,而與當前所載入的場景無關。
3、動畫狀態機
1) 狀態機基礎
狀態機的基本思想是使角色在某一給定時刻進行一個特定的動作。動作類型可因游戲類型的不同而不同,常用的動作包括空閑、走路、跑步和跳躍等,其中每一個動作被稱為一種狀態(States)。一般來說,角色從一個狀態立即切換到另外一個狀態是需要一定的限制條件的,比如角色只能從跑步狀態切換到跑跳狀態,而不能直接又靜止狀態切換到跑跳狀態。上述的限制條件被稱為狀態過渡條件(State Transitions)。總之,狀態集合、狀態過渡條件以及記錄當前狀態的變量放在一起,就組成了一個最簡單的狀態機。
節點表示狀態,節點間的箭頭表示狀態過渡。狀態機對於動畫的重要意義是在於用戶可以通過很少的代碼對狀態機進行設計和升級,從而讓動畫師方便地定義動作順序,而不必去關心底層代碼的實現。
2) Mecanim狀態機
Mecanim的動畫狀態機提供了一種縱覽角色所有動畫片段的方法,並且允許通過游戲中的各種事件(如用戶輸入)來觸發不同的動畫效果。動畫狀態機可以通過Animator Controller視圖來創建。一般而言,動畫狀態機包括動畫狀態、動畫過渡和動畫事件;而復雜的狀態機還可以含有簡單的子狀態機。
3) Animation States (動畫狀態)
Animation States是動畫狀態機中的基本組件模塊,每個動畫狀態都含有一個單獨的動畫序列(或者混合樹)。當某一游戲事件觸發了一個動畫切換時,游戲角色就會進入到一個新的動畫狀態中。當在Animator Controller中選擇了一個動畫狀態時,就能在Inspector視圖中查看到它的屬性,其中:
- Speed:動畫的默認速度。
- Motion:當前狀態下的動畫片段。
- Foot IK:是否使用Foot IK。
- Write Defaults:是否對沒有動畫的屬性寫回默認值。
- Mirror:鏡像。
- Transitions:由當前狀態觸發的過渡條件列表。
以黃色顯示的是動畫狀態機中默認狀態,它是指該狀態機被首次激活時所進入的狀態。可以在其他狀態上右擊並選擇Set as Layer Default State命令來改變默認狀態。每個狀態機在Inspector視圖中Transitions內的Solo和Mute選擇框用於控制動畫在預覽時的行為表現。
4) Any State(任意狀態)
Any State是一個始終存在的特殊狀態。它被應用於不管角色當前處於何種狀態,都需要進入另外一個指定狀態的情形。這是一種為所有動畫狀態添加公共出口狀態的便捷方法,特別地,Any State並不能作為一種獨立的目標狀態。
5) Animation Transitions(動畫過渡)
動畫過渡是指由一個動畫狀態過渡到另外一個時發生的行為事件,需要注意的是,在一個特定時刻,只能進行一個動畫過渡。
- Atomic:當前的動畫過渡是過渡原子,不能被中斷。
- Conditions:決定該動畫過渡在何時被觸發。一個Condition包括以下信息:
- 一個事件參數(也可以是一個歸一化的推出時間,即退出事件點相對整個動畫片段時長的歸一化表達,例如0.95表示該動畫片段運行到了整個片段的95%位置)、
- 一個可選的條件斷言(例如大於或小於或一浮點數)。
- 一個可選的參數值。
可通過拖動重疊區域的起始值和終止值來調節兩個動畫的過渡情況。
6) Animation Parameters(動畫參數)
Animation Parameters是一系列在動畫系統中定義的變量,但也可以通過腳本來進行訪問和賦值。例如一個參數值可以被動畫曲線更新,然后被腳本訪問;類似地,腳本也可以先設置參數值,然后被Mecanim系統使用。
默認參數值可以在Animator窗口左下角的Parameters工具欄中進行設置,參數值可以為四種基本類型。
- Float:浮點數。
- Int:整數。
- Bool:返回布爾值,通過復選框來選擇True或者False。
- Trigger:觸發一個布爾值,復位控制器時消耗一個轉變,由一個圓按鈕表示。
參數可以通過在腳本中使用Animator類函數來賦值,包括SetTrigger、SetFloat、SetInteger和SetBool。
4、混合樹
在游戲動畫中,一種常見的需求是對兩個或更多個相似的運動進行混合,一個常見的例子是根據角色的移動速度對走路和跑步動畫進行混合,另一個常見的例子是角色在跑動時向左或向右傾斜轉彎。動畫過渡和動畫混合是完全不同的概念,盡管它們都用於生成平滑的動畫,但卻適用於不同的場合。動畫過渡被用於在一段給定的事件內完成由一個動畫狀態向另一個動畫狀態的平滑過渡;而動畫混合則被用於通過插值技術實現對多個動畫片段的混合,每個動作對於最終結果的貢獻量取決於混合參數。特別地,動畫混合樹可以作為狀態機中一種特殊的動畫狀態而存在。
要制作一個新的混合樹,需要以下步驟:
(1) 在Animator Controller視圖中右擊空白區域。
(2) 在彈出的快捷菜單中選擇Create State→From New Blend Tree命令。
(3) 雙擊混合樹,進入混合樹視圖。
此時,Animator視圖中將會顯示整個混合樹的圖形表達,Inspector視圖中將會顯示當前選中的節點和其緊鄰的子節點。
在Blend Type選項中可以指定不同的混合類型,包括1D混合和2D混合兩種。
文章摘自《Unity官方案例精講》