Animator Layers
Unity 圖層的機制,模型是如何被修改的呢?
不同圖層的狀態可以同時發生,同一圖層同時只能執行一個狀態。
點擊 + 可以新增一個圖層,點擊圖層旁邊的齒輪圖示,會彈出一個小視窗,可以設定該圖層對應的參數。
| 屬性 | 描述 |
|---|---|
| Weight(權重) | 這一層的權重,0 代表該層權重是 0(該層不生效),1 代表該層權重為 1(該層中的動畫能完全表現) |
| Mask(遮罩) | 此層上使用的遮罩,可以限制動畫的播放部位,例如只要播放上半身的動畫,可以使用一個遮罩定義在上半身播放動畫。設定後該圖層上面會顯示一個 M 的小圖示 |
| Blending | 和其他層混合的模式 |
| Override | 覆蓋(Override)上面層中對應 Mask 的部位 |
| Additive | 疊加(Additive)在之前圖層的動畫之上 |
| Sync | 複用其他層中的狀態機 |
| IK Pass | 反向動力學 |
狀態是指在圖層中的「小方塊」,當拖入動畫時會自動變成的「東西」。
新建一個圖層,可以看到三個狀態:
| 狀態名稱 | 簡述 |
|---|---|
| Entry | 入口,根據過渡進入預設狀態 |
| Any State | 任意狀態,只要條件滿足,可任意跳轉到過渡的狀態 |
| Exit | 退出,返回到「Entry」 |
可以在空白處右鍵新增 Empty(空狀態),也可以將動畫檔案拖到 Animator 視窗中新增一個狀態。
如果目前在 Project 視窗選取了一個動畫檔案,可以透過右鍵點擊 From Selected Clip 建立一個狀態,不過直接拖入更方便。
第一個建立的狀態預設是橘色的,代表預設狀態,Animator 會在一開始就播放,如果狀態中有動畫,也會被播放。
橘色:預設狀態,即進入就執行的動畫。
灰色:可透過過渡達到條件執行的動畫。
每個狀態都可以包含一個動畫,處於該狀態時,Animator 元件所在的物件會播放動畫,選取一個狀態時,會有如下選項:
| 名稱 | 描述 |
|---|---|
| Motion | 狀態綁定的動畫(Animation) |
| 速度(Speed) | 動畫播放的速度 |
| 乘數(Multiplier) | Speed * 指定參數(float)作為執行時的播放速度 |
| Motion Time | 單位化時間(Normalized Time),指定參數(float,範圍是 0~1)作為動畫播放時間(可使用此製作輪盤開關) |
| 鏡像(Mirror) | 鏡像播放,若開啟「參數(Parameter)」:指定參數(bool)作為鏡像的開關 |
| 週期偏移(Cycle Offset) | 循環偏移量,可以用來同步循環的動畫,使用單位化時間(範圍是 0~1),也可使用參數控制 |
| Foot IK | 只用於人形動畫,角色的腳部是否使用 IK(反向動力學) |
| Write Default | 進入下一個狀態時重設此狀態所作的更改(初始化該狀態沒有用到的參數為預設值) |
Transition
Section titled “Transition”顯示目前狀態的過渡,選取後出現的內容與在圖層中選取一致。
| 名稱 | 描述 |
|---|---|
| Solo | 選取則只生效目前過渡,其他將被停用 |
| Mute | 選取則停用目前過渡 |
如果同時選取 Solo 和 Mute,Mute 會優先權生效。
表示狀態之間的切換條件,一般會有一個或多個條件,用於從一個狀態切換到另一個狀態。
右鍵點擊一個狀態,Make Transition 後選擇另一個狀態即可建立過渡,在過渡中可以新增相對應的條件。
| 名稱 | 描述 |
|---|---|
| Solo | 選取則只生效目前過渡,其他將被停用 |
| Mute | 選取則停用目前過渡 |
如果同時選取 Solo 和 Mute,Mute 會優先權生效。
多個出口過渡時可調整位置(上下)以實現優先權(上方優先權高於下方)。
| 名稱 | 描述 |
|---|---|
| Name Field | 名稱欄位可以為過渡命名,用於區分兩個狀態之間的多條過渡時很有用 |
| Has Exit Time | 是否有結束時間(Exit Time)為條件 |
結束時間(Exit Time)是一種特殊的過渡條件,它不依賴參數,而是根據設定的結束時間點作為條件進行狀態轉換。
Settings
Section titled “Settings”過渡的一些參數設定。
| 名稱 | 描述 |
|---|---|
| 結束時間(Exit Time) | 如果勾選了 Has Exit Time,該參數可以設定,設定動畫退出的單位化時間(單位:前一狀態動畫長度,如為物件開啟動畫/空動畫可當成以秒為單位)。例如設定為 0.75,代表動畫播放到 75% 時為 true,如果沒有其他條件,會直接切換到下一個狀態。如果 exit time 小於 1,那麼狀態每次循環到對應位置的時候(不管動畫是否設定為循環,狀態總是循環的),該條件都會為 true。比如第一次播放到 75%,第二次播放到 75%……時結束時間條件都會為 true。 如果 exit time 大於 1,該條件只會檢測一次。比如 exit time 為 3.5,state 的動畫會在循環 3 次後,在播放到第 4 次的 50% 時為 true。 |
| 固定持續時間(Fixed Duration) | 勾選,下一項「過渡持續時間(Transition Duration)」以秒為單位。 取消勾選,下一項「過渡持續時間(Transition Duration)」以前一個狀態的百分比計數,1 為 100%。 |
| 過渡持續時間(Transition Duration) | 過渡的時間。兩個狀態在轉換時,一般不會瞬間從一個狀態轉換到另一個狀態,而是會經過平滑混合,這個屬性就是設定了平滑混合的時間。 |
| 過度偏移(Transition Offset) | 狀態開始播放時的時間偏移。即後一個狀態從何處開始,值為後一個狀態的百分比,1 為 100%。 例如設定為 0.5,則轉換到下一個狀態時,會從 50% 的位置開始播放。 |
上面的參數不僅可以手動修改,也可以透過過渡圖預覽和修改。

中斷源(Interruption Source)
Section titled “中斷源(Interruption Source)”可以打斷狀態的過渡,但儘量避免使用,比較複雜。
例如以下圖層:

Current State (目前狀態)
Section titled “Current State (目前狀態)”預設情況下,當 A 到 C 的切換觸發後,狀態機開始切換到 C,在切換到 C 之前無法被改變。但是,如果將 A->C 的過渡的 中斷源(Interruption Source) 改為 Current State,A->C 的過渡就可以被 A 上的一些過渡中斷。
在狀態 A 上的過渡如下:

「一些」的原因:若勾選 Ordered Interruption,則只有優先權比 A->C 高的(例如 A->B)才能打斷。
過渡的優先權從上到下依次降低,即優先權 A->B > A->C > A->D。
-
如果勾選
Ordered Interruption:如果此時 A->B 的切換觸發,則會中斷 A->C,觸發 A->B。
但如果此時 A->D 的切換觸發,不會中斷 A->C,還是觸發 A->C。
-
如果不勾選
Ordered Interruption:此時 A->B 或 A->D 的切換觸發都會中斷 A->C。
如果 A->B 和 A->D 同時觸發,則會優先啟動 A->B,因為優先權較高。
Next State (下一狀態)
Section titled “Next State (下一狀態)”如果將 A->C 的過渡的 中斷源(Interruption Source) 改為 Next State,A->B 和 A->D 就不能中斷 A->C 了。
如果我們啟動 A->C 後,在切換到 C 的過程中又啟動了 C->D,那麼 A->C 的過渡會被中斷,轉而切換到 D。
狀態 C 上的過渡順序也會有影響,但此時 Ordered Interruption 無法勾選(因為 A->C 是在狀態 A 上,不在狀態 C 上,不參與 C 的排序)。狀態 C 上的過渡順序會決定同時觸發時會使用哪一個過渡,例如下圖過渡:

如果 C->B 和 C->D 同時觸發,則優先執行 C->B。
Current State Then Next State (目前狀態然後下一狀態)
Section titled “Current State Then Next State (目前狀態然後下一狀態)”如果將過渡的 中斷源(Interruption Source) 改為 Current State Then Next State,則目前狀態與下一狀態的過渡都會被考慮在內。
Next State Then Current State (下一狀態然後目前狀態)
Section titled “Next State Then Current State (下一狀態然後目前狀態)”與上一個相反。
| 名稱 | 描述 |
|---|---|
| Ordered Interruption | 優先權高於目前過渡才可以打斷 |
| 無(None) | 不可打斷 |
| Current State | 從前一個狀態開始的狀態過渡可以打斷正在進行的狀態過渡 |
| Next State | 從後一個狀態開始的狀態過渡可以打斷正在進行的狀態 |
| Current State Then Next State | 決定哪個動畫狀態(State)上的過渡節點優先權更高,先看前一個狀態的優先權,如果沒有被觸發,再看後一個狀態的優先權,來達到不同的融合與打斷效果 |
| Next State Then Current State | 決定哪個動畫狀態(State)上的過渡節點優先權更高,與上一個相反 |
Condition (條件)
Section titled “Condition (條件)”過渡條件,一個過渡可以有一個條件,也可以有多個條件,甚至沒有條件。
-
如果沒有條件,但是勾選了
Has Exit Time,那麼Exit Time會被作為狀態結束的條件,到達Exit Time時,會切換到下一個狀態。 -
如果有一個或多個條件,需要同時滿足這些條件才能切換到下一個狀態。
條件可以透過參數設定,具體如下:
| 參數類型 | 描述 |
|---|---|
| Int 型 | 可選擇 Greater(>)、Less(<)、Equals(==)、NotEqual(!=)指定的數作為過渡條件 |
| Float 型 | 可選擇 Greater(>)、Less(<)指定的數作為過渡條件 |
| Bool 型 | 可選擇指定值(true 或 false)作為過渡條件 |
| Trigger | 條件為 true 時觸發狀態過渡 |
如果 Has Exit Time 勾選了,並且過渡還有一個或多個條件,那麼過渡需要同時滿足到達 Exit Time,且條件全為 true,才會切換到下一個狀態。
一個過渡至少要有一個條件(Has Exit Time 可以作為一個條件),否則過渡將會被忽略(不會被執行進入下一個狀態)。
註:Trigger 貌似在 VRChat 中沒有作用,至少我不知道。