對 Unity 動畫系統 Mecanim 的調研


有一個對 Mecanim 進行介紹的 很好 的一個視頻 → http://www.58kaifa.com/course/24,在看完這個視頻根據 Unity 聖典進行了下文整理時, 讓我理解更加深刻,以后實踐時會更加得心應手。

Unity 有一個豐富並且精密的動畫系統叫做 Mecanim。

1. 相關術語整理 #

Animation Clip 相關

  • Animation Clip 動畫剪輯:可以用於角色或者簡單動畫的動畫數據。它是動作的簡單“單元”,諸如(特別的實例)"Idle" 空閑、"Walk" 走路、"Run" 跑步、等等;
  • Body Mask 身體蒙版:一個用於包括或排除身體部位骨骼的規格;[Asset (.mask),在動畫分層和導入器中使用];
  • Animation Curves 動畫曲線:曲線可以附加到各種動畫剪輯並且被游戲中的各種參數來控制;

Avatar 相關

  • Avatar 阿凡達:從一個骨架重定向到另外一個骨架的界面;
  • Retargeting 重定向:把為一個模型創建的動畫應用到另外一個模型;[在外部工具中完成,比如 Max 或者 Maya]
  • Skinning 蒙皮:把骨骼關節綁定到角色網格或者“皮膚”的過程;[在外部工具中完成,比如 Max 或者 Maya]
  • Muscle Definition 肌肉定義:一個 Mecanim 概念,它允許你更直覺化地控制 Avatar。當一個 Avatar 准備好了之后,Mecanim 工作在肌肉空間,這比骨骼空間更直覺化;
  • T-pose T 字姿勢:角色雙臂平身形成一個“T”字的姿勢。角色必須保持這個姿勢來制作 Avatar;
  • Bind-pose 綁定姿勢:角色在建模過程中的姿勢;
  • Human template 人形模板:一個預先定義的骨骼映射;[Asset (.ht),用於從 FBX 文件中匹配骨骼到 Avatar]

Animator and Animator Controller 相關

  • Animator Component 動畫組件:在模型上使用 Mecanim 動畫系統的組件。這個組件引用一個控制動畫的 Animator Controller 資源;
  • Root Motion 根動作:角色根級的動作,它可以被動畫本身或者外部控制;
  • Animator Controller (Asset) 動畫控制器(資源):動畫控制器通過動畫層中的動畫狀態機,還有被參數控制的混合樹來控制動畫。同一個 Animator Controller 可以被多個模型使用 Animator 組件引用;[Asset (.controller)]
  • Animator Controller (Window) 動畫控制器(窗口):動畫控制器在其中被可視化並編輯的窗口;
  • Animation Layer 動畫層:每個動畫層包含一個控制整個模型或者部分模型的動畫狀態機。例如全身層可控制走路、跳躍並且更高的層面控制上半身動作比如投擲、跳躍。更高層對於身體部位有更高的控制權;
  • Animation State Machine 動畫狀態機:一個控制動畫狀態之間交互的圖。每個狀態引用一個混合樹或者單一動畫剪輯;
  • Animation Blend Tree 動畫混合樹:基於浮點動畫參數,用於連續在多個近似的動畫剪輯之間進行混合;
  • Animation Parameters 動畫參數:用於在腳本和 Animator Controller 之間通信。一些參數可以在腳本中設定並且在控制器中被引用,另外一些參數是基於在動畫剪輯中的自定義曲線並且可以使用腳本 API 來采樣;
  • Inverse Kinematics (IK) 反向動力學:基於世界中各種對象來控制角色身體部分的能力;
  • Animation Component 動畫組件:使用非 Mecanim 動畫時需要的組件;

2. Mecanim 提供的功能 #

Mecanim 提供了:

  • 用於人類角色設計的簡單工作流;
  • 動畫重定向 -- 能夠把一個動畫應用到多個不同模型的能力;
  • 用於對齊影片剪輯的簡化的工作流;
  • 方便的影片剪輯預覽,變換和交互。這使得動畫師的工作可以更多地獨立於程序員,方便在游戲邏輯代碼掛接之前建立原型和預覽;
  • 使用一個可視化編程工具來管理動畫之間復雜的交互;
  • 對身體不同的地方使用不同的邏輯進行動畫控制;

3. Mecanim 工作的流程 #

Mecanim 的工作流可以被分割為如下 3 個主要的階段:

  1. 資源預備和導入。這是由美工或者動畫師完成的工作,使用第三方的工具,比如 3D Max 或者 Maya。這一步獨立於 Mecanim 的特性;
  2. 為 Mecanim 設定角色,有 2 種途徑:(1)類人角色配置。Mecanim 對於類人角色有一個特別的工作流,使用擴展后的 GUI 和重定向。配置包含創建和設定一個 Avatar 並且調整肌肉定義。(2)通用角色配置。這是為任何東西像是人、有動畫的柱子、四足動物之類設計的。重定向在這里是不支持的,但是你仍然可以得到后文中描述的 Mecanim 的好處。
  3. 讓角色動起來。這包括設定動畫剪輯和它們之間的交互,還包括狀態機和混合樹,列出動畫參數,還有從代碼中控制動畫;

4. 資源准備和導入 #

4.1. 類人網格 Humanoid Meshes ##

為了應用 Mecanim 的類人動畫系統和重定向的所有好處,你需要有一個綁骨並蒙皮的類人網格。

  1. 一個角色模型通常是由 3D 包組成或者從一個導出前更加復雜的網格類型轉換為多邊形或者三角網格;

  2. 一個定義了一組網格內的骨骼和他們的之間的運動關系的關節體系或者骨架,必須是為了控制角色的運動而創建的。眾所周知創建這樣關節體系的過程稱作搭骨架(rigging);

  3. 一個網格或者皮膚必須被鏈接到關節體系來定義這個給定關節被動畫化時角色的某一部分網格如隨之運動。這個鏈接骨架和網格的過程就是蒙皮;

PS 蒙皮網格 - 建模后,模型就會有紋理並且已三角化

總結:預備角色的步驟 →

建模 -> 搭骨架 -> 蒙皮

Modelling 建模 ###

這是在 3D 建模工具包 - 3DSMax,Maya,Blender,諸如此類來建立你自己的類人網格的過程。盡管這是一個屬於它們(建模工具)自己的主題,這里有一些你可以遵循的指導原則來保證一個模型可以很好的在 Unity 的動畫系統中使用。

  • 遵循合理的拓撲結構。一個“合理” 的網格結構的精確意義是非常微妙的,不過通常情況下,你應該牢記模型的頂點和三角面在動畫化之后會怎樣變形。一個不好的拓撲結構會讓網格變形地非常難看。你可以從已有的 3D 角色網格學習很多拓撲結構是如何安排的以及這樣安排的原因。
  • 注意網格的縮放比例。做一次導入測試,比較導入的模型和一個“米立方”(大多情況下是一個邊長 1 米的 Unity 標准立方體元素)。檢測你的 3D 建模工具包使用的單位並且調整導出設定使得模型的尺寸處在相對這個立方體合適的比例。你必須小心,很容易創建出沒有任何標注的縮放比例的模型並且最終會造成一些導入進 Unity 之后不成比例的物體。
  • 安放角色使得角色的腳站在坐標原點或者模型的“錨點”。角色通常是豎直地走在地面上,如果角色的錨點(也就是他的變換中心)在地面上會更容易控制。
  • 如果你會的話,使用 T 字姿態建模。這會對在三維空間中細化化多邊形細節(比如,腋下)有幫助。這也會使得放置骨架到網格中更容易。
  • 清理你的模型。只要可能的話,覆蓋孔洞,焊接頂點並且移除隱藏的面,這會對蒙皮有幫助,特別是自動蒙皮過程。

Rigging 搭骨架 ###

這是創建骨架上的關節來控制你的模型進行運動的過程。3D 建模工具包提供了各種方法為類人骨架創建關節。從已經構建好的可以縮放后放入網格的兩足動物骨架,到創建特別骨骼的工具還有父子化骨骼結構。盡管這方面的細節超出了 Unity 的范圍,這里還是有一些通用的准則:

  • 學習已有的類人骨架體系(比如,兩足動物)並且在可能的地方盡量模仿這樣的骨骼架構;
  • 確保臀部是整個骨架的根節點;
  • 在骨架中至少要有 15 個骨骼;
  • 角色的關節點/骨骼結構應該按照自然的結構建立。手臂和腿成對出現,你應該對骨骼使用一致的命名(比如“arm_L”命名左臂”“arm_R”命名右臂,諸如此類)。一個體系結構可能包含:(1)HIPS - spine - chest - shoulders - arm - forearm - hand 即,臀部 - 脊椎 - 胸部 - 肩膀 - 手臂 - 前臂 - 手 (2)HIPS - spine - chest - neck - head 即,臀部 - 脊椎 - 胸部 - 脖子 - 頭 (3)HIPS - UpLeg - Leg - foot - toe - toe_end 即,臀部 - 大腿 - 小腿 - 腳 - 腳趾 - 腳趾尖

Skinning 蒙皮 ###

這是給骨架附加網格的過程。蒙皮過程包括在你的網格中綁定頂點到骨骼,還有直接指定(硬綁定)或者混合多塊骨骼的影響(軟綁定)。不同的軟件包使用不同的辦法,比如,賦值給特別的頂點權重並且在網格上逐骨骼繪制影響到的頂點。最初的設定通常是自動化的,通過找最近的影響頂點或者使用“熱度圖”。蒙皮通常需要大量的工作並且使用動畫測試來確保獲得滿意的皮膚變形效果。這個過程的一些指導准則如下:

  • 最開始使用自動蒙皮過程來設定皮膚(查看 3DS Maya 之類的相關教程);
  • 為你的骨骼創建一個簡單的動畫或者導入一些動畫數據作為一個蒙皮結果的測試。這給你一個快捷的辦法來評估你的蒙皮是否在運動中看起來很好;
  • 增量地編輯和細化你的蒙皮方案;
  • 堅持在軟綁定的時候每個頂點最多使用 4 個骨骼,這是 Unity 支持的數目上限。如果超過 4 個骨骼,那么在 Unity 播放骨骼動畫時至少會有一些信息被丟失;

4.2. 導入動畫 Importing Animations ##

操作即知

4.3. 分割動畫 Splitting Animations ##

一個動畫化的角色典型地會在游戲中不同的情況有多個不同的動作。這些動作稱為動畫剪輯。比如,我們可能針對走路,跑步,跳躍,投擲,死亡之類有不同的動畫剪輯。依賴於模型被動畫化的方法,這些分離的動作可能作為不同的動畫剪輯導入,或者當每個動作是簡單的之前動作的延續時作為單個動畫剪輯導入。在只有一個動畫剪輯的情況下,這個剪輯必須用 Unity 分割成它的子組件剪輯,這會在你的工作流中引入一些其他步驟。

使用含有預先分割的動畫的模型工作 ###

使用起來最簡單的模型類型是那些包含了預分割動畫的。如果你有一個像那樣的動畫,你將會看到一列可以在播放窗口中(inspector右下角)點擊播放來預覽的的動畫剪輯,如果需要,幀范圍可以被修改。動畫導入器的 Inspector 中動畫標簽頁會看起來像這樣:

使用含有未分割動畫的模型工作 ###

對於那些剪輯作為一個連續動畫提供的模型,動畫導入器 Inspector 中的動畫標簽頁會看起來像這樣:

像這樣4合1的情況,你可以定義符合分離動畫序列(走,跳之類)的幀范圍。你可以通過按下+創建一個新的動畫剪輯並且選擇包含動畫的幀范圍。例如,走路動畫在幀 0-33;跑動畫在幀 41-57;踢動畫在幀 81-97;

在導入設定中,分割動畫表是你告訴 Unity 哪些在你資源文件中的幀構成一個動畫剪輯的地方。你在這里指定的名字將會在你的游戲中用來激活它們。

PS:關於動畫剪輯 Animation Clip ###

在項目視圖中選擇一個導入的動畫

動畫剪輯存儲着所有可使用於角色動畫或簡單動畫的動畫數據,它們只有一個屬性而且不能修改:采樣率。這是創建剪輯的采樣率。請注意,導入動畫時,Unity 運行關鍵幀減少,因此這不是幀的數量。

注:導入動畫無法在動畫視圖中進行編輯,但如果你在 Unity 復制一個導入動畫,復制的導入動畫可以編輯。

增加模型不包含的動畫 ###

即使對那些沒有肌肉定義的模型(也就是非 Mecanim),你也可以增加動畫剪輯到動畫組件中。你需要在動畫屬性中指定默認的動畫剪輯,並且在 Animation 屬性中指定可用的動畫剪輯。你在這個非 Mecanim 模型中指定的動畫也需要使用非 Mecanim 的方式(也就是說,肌肉定義屬性應該被設置為 None)。

對於含有肌肉定義的模型(Mecanim),流程是不一樣的:

  1. 創建一個新的動畫控制器;
  2. 打開動畫控制器窗口;
  3. 拖放想要的動畫剪輯到動畫控制器窗口;
  4. 拖放模型資源到層級視圖;
  5. 增加動畫控制器資源到資源的動畫組件;

使用多個模型文件導入動畫 ###

另外一種導入動畫的方法是使用一個 Unity 允許的針對動畫文件的命名方式。你創建不同的模型文件並且使用“模型名@動畫名.fbx”的命名約定。比如,對一個叫“goober”的模型,你可以分別導入空閑,走路,跳躍和踢牆跳躍動畫使用命名為“goober@idle.fbx”,“goober@walk.fbx”,“goober@jump.fbx”和“goober@walljump.fbx”的文件。這些文件中只有動畫數據會被使用,即使原有文件是同網格數據一起導出的。

Unity自動導入所有4個文件並且收集所有的動畫到沒有@標記的文件中。在上面的例子中,goober.mb文件將會自動建立到空閑,跳躍,走路和踢牆跳的引用。對於FBX文件,簡單的導入一個沒有動畫的模型文件(也就是,goober.fbx)和4個命名為goober@動畫名.fbx的剪輯,為每個文件導出想要的幀(在FBX對話框中選擇)。

4.4. 如何獲取類人模型 ##

這里有三種重要的途徑來獲取用於 Mecanim 動畫系統的類人模型:

  1. 使用一個程序化角色系統或者角色生成器諸如 Poser,Makehuman 或者 Mixamo。其中一些系統會為你的網格搭骨架和蒙皮(比如,Mixamo)但是另外一些不會。此外,這些方法可能需要你減少原有網格上的面數來適應 Unity;
  2. 從 Unity Asset Store 購買演示示例和角色內容;
  3. 可以從草圖開始准備自己的角色;

4.5. 導出和驗證 ##

Export & Verify

Unity 可以導入大量各式各樣通用的本地 3D 文件格式。我們推薦的導出和驗證你模型的格式是 FBX2012 因為這樣可以:(1)導出帶骨架層級的網格,法線,紋理和動畫;(2)重新導入進你的 3D 包來更驗證你的動畫模型;(3)導出不帶網格的動畫;

5. 創建 Avatar #

在FBX導入之后,你可以在 FBX 導入器選項中的 rig 標簽頁指定是哪種類型的骨架。

5.1. 類人動畫 Humanoid animations ##

對於類人骨架,選擇 Humanoid 然后單擊 Apply.Mecanim 將會嘗試匹配你的骨骼結構到 Avatar 骨骼結構。在大多情況下,它可以自動地分析骨骼之間的鏈接來完成這一過程。如果匹配成功,你將會在 Configure... 按鈕旁邊看到一個對號

並且,在成功匹配的情況下,一個 Avatar 子資源會被增添到 FBX 資源,可以在項目視圖中看到它。

如果 Mecanim 不能創建 Avatar,你將會看到一個叉號出現在 Configure... 按鈕旁邊,並且沒有 Avatar 子資源被添加。當這種情況發生的時候,你需要手動配置 Avatar。

5.2. 非類人動畫 Non-humanoid animations ##

提供了 2 種非類人動畫:通用和舊版。通用動畫是使用 Mecanim 系統導入但是不會獲得類人動畫的額外好處。舊版動畫是使用 Unity 在 Mecanim 之前提供的動畫系統。還有一些情況下舊版動畫系統是有用的(大多是你不想完全更新項目的情況)但是他們很少在新的項目中使用。

6. 配置 Avatar #

Avatar 是 Mecanim 的一個如此重要的部分,它需要被配置以符合你的模型。因此不論自動 Avatar 的創建失敗或者成功,你都需要進入 Avatar 配置模式來確保你的 Avatar 是有效並且合適地配置了。你的角色骨骼匹配 Mecanim 的預定義骨骼結構並且模型是 T 字形姿勢是非常重要的。

如果自動 Avatar 創建失敗,你將會看到一個叉號出現在 Configure 按鈕旁邊。

如果它成功了,你將會看到一個對號出現在 Configure... 按鈕旁邊:

在這里,成功僅僅意味着需要的骨骼被匹配上了,但是為了獲得更好的結果,你可能會想也匹配上可選的骨骼以及讓模型進入一種合適的 T 字姿勢。當你進入 Configure... 按鈕,編輯器將會問你是否保存場景。之后進入 Configure 模式,場景視圖用來單獨顯示指定模型的骨骼,肌肉和動畫信息,不顯示場景的其他部分。一旦你保存了場景,你就會看到一個帶有骨骼映射的新 Avatar 配置檢視器。

檢視器顯示哪些骨骼是需要的還有哪些骨骼是可選的 - 可選的骨骼的運動可以自動用插值計算出來。為了讓 Mecanim 產生有效的匹配,你的骨架需要至少含有必須的骨骼在適當的位置。為了提高查找匹配 Avatar 的機會,可以使用反映身體部位的名稱命名你的骨骼(像 “LeftArm”“RightForearm” 這樣的名稱都是合適的)。

如果模型沒有產生一個有效的匹配,你可以手動按照類似 Mecanim 內部的處理方式做一下:

  1. Sample Bind-pose 采樣綁定姿勢(嘗試讓模型更接近它建模時候的姿勢,一個合理的最初姿勢);
  2. Automap 自動映射(從最初的姿勢創建一個骨骼映射);
  3. Enforce T-pose 強制 T 字姿態(強制讓模型更接近 T 字姿態,這是 Mecanim 使用的默認姿勢);

如果自動映射(Mapping->Automap)完全或者部分失敗,你可以通過從場景或者體系結構視圖拖拽它們來賦值到骨骼。如果 Mecanim 認為骨骼合適,它會用綠色在 Avatar 檢視器中顯示,否則會以紅色顯示。最后如果骨骼被正確賦予了,但是角色不是在正確的姿勢,你將會看到消息 “Character not in T-Pose(角色不是在T字姿態)”。你可以嘗試 Enforce T-pose(強制 T 字姿態)或者旋轉余下的骨骼到 T 字姿態。

7. 肌肉設定 Muscle setup #

Mecanim 允許你使用肌肉(Muscles)控制不同骨骼上的各種動作尺度。一旦 Avatar 正確配置了,Mecanim 將會“理解”骨骼的結構並且允許你開始在 Avatar 檢視器中的 Muscle 是標簽欄中開始工作。這里,很容易調整角色的動作尺度並且確保角色使用逼真的方式扭曲,避免過度造作和自我重疊。你可既可以在 body (視圖下部)來調整單獨的動畫或者使用預先定義的一次操作若干骨骼的扭曲(視圖上部)來操作角色。

Muscle Clips 肌肉剪輯

在 Animation 標簽欄,你可以建立肌肉剪輯(Muscle Clips),它是針對特定肌肉或者肌肉組的動畫。

你也可以定義肌肉動畫應用到身體的哪個部分。

8. 阿凡達(替身)身體遮罩 Avatar Body Mask #

在動畫中,身體的特定部分可以被有選擇性的激活或禁用,這就是所謂的身體遮罩。身體遮罩在模型導入檢視面板中的動畫選項卡中和 Animation Layersd (動畫圖層)中被應用。身體遮罩可以讓你通過對角色的動畫編輯去適應一些特殊需求,使角色更接近特殊需求。比如說,你可能有一個站立行走動畫包含了手和腳的運動,但是如果角色是用雙手抬着一個超大的東西然后你不想他在走路的時候手臂擺動。無論如何,你還是可以使用站立行走動畫然后在身體遮罩功能中屏蔽掉手部動作。

身體包括這些部分:頭部,左手臂,右手臂,左手,右手,左腿,右腿和根部(根部表示為腳底的影子那部分)。在身體遮罩中,你還可以選擇給手和腳添加反向動力學(IK),這將會決定 IK 曲線是否會被包含在動畫混合中。

  • 點擊身體部分切換包含或排除(綠/紅);
  • 在身體周圍的空白區域雙擊來切換所有身體遮罩在身體遮罩檢視面板中(手臂已經排除了);

在網格導入檢視面板的動畫標簽中,你會看到一個名為 Clips 的列表,它包含所有對象的動畫剪輯。當你選擇列表的其中一項時,會有選項顯示出來,包括身體遮罩編輯器。當然你也可以創建一個身體遮罩資源(Assets->Create->Avatar Body Mask),文件在磁盤中后綴是.mask 身體遮罩資源可以在動畫控制器中被重復使用,當指定了動畫圖層時。

使用身體遮罩的好處是他有助於減少內存開銷,因為不活躍的部位不需要激活相關的動畫曲線。而且,未使用的曲線,不需要在動畫播放過程中計算了,這往往會減少動畫播放中的 CPU 開銷。

9. 為類人動畫重新定位目標 Retargeting of Humanoid animations #

Mecanim 的最強大的功能之一:重定目標的仿人機器人動畫。這意味着你可以相對輕松的把相同的動畫應用到各種角色模型上。重定目標才有可能為人形機器人的模型,在哪里阿凡達已配置,因為這給了我們的模型的骨骼結構之間的對應關系。

Recommended Hierarchy structure 推薦的層次結構, 使用 Mecanim 的動畫時,你可以預料你的場景包含以下元素:

  • 導入的角色模型,附帶了一個 Avatar;
  • 動畫設計組件,引用了一個動畫設計控制器資源;
  • 一個動畫剪輯,引用自動畫設計控制器;
  • 為角色編寫的多個腳本;
  • 與角色相關的組件,比如角色控制器;

項目還應包含不同的角色模型,並且模型上附帶着一個有效 Avatar。

9.1. 推薦的設置 ##

  1. 在層級面板中創建一個包含角色相關組件的 GameObject;
  2. 把模型作為 GameObject 的子物體,賦予動畫設計組件;
  3. 確保腳本引用到子物體上的動畫設計組件而不是根部上的;使用 GetComponentInChildren () 代替 GetComponent ();

然后,為了重用另一個模型的動畫,需要這樣做:

  1. 禁用掉原始模型;
  2. 把所需的模型扔給 GameObject 作為子物體(下圖中的 MainChar 物體);
  3. 請確保為新模型的動畫設計控制器引用相同的控制器資源文件(下圖中第一個屬性);
  4. 在頂級的 GameObject 中稍微調整一下角色控制器、 變換和其他屬性,並確保動畫順利工作在的新模式;

10. 為角色賦予生命 Bringing Characters to Life #

10.1. 循環動畫剪輯 Looping animation clips ##

每個使用動畫的人都需要執行一個基本的操作,那就是確保他們的循環是正確的。這十分重要。舉個例子來說,當一個動畫剪輯是用來表示行走循環的,那么開始幀和結束幀需要是同樣的一個造型(比如左腿在地面上),確認腳底沒有滑動,或者一些奇怪或愚蠢的動作。Mecanim 為檢查這些提供了一些方便的工具。動畫剪輯可以給予造型,旋轉和位置進行循環。

如果你在動畫剪輯上拖拽開始或結束點,你將會看到對於每個可能的循環參數,Mecanim 都提供了一套合理的循環曲線。如果你在那些綠色的曲線位置放置了開始/結束標識,那么這個動畫就更可能會正確的循環。循環匹配指示器(loop match)會檢測你所選擇的范圍有多符合正確的標准。當循環匹配指示器是綠色的時候,激活 Loop Pose(比如)將會確保這個造型看起來是自然的。下面右邊為正確的循環。

10.2. 動畫組件和動畫控制器 Animator Component and Animator Controller ##

任何一個擁有 avatar 的 GameObject 都將擁有一個 Animator 組件用來連接角色和他的行為。

Animator 組件聲明了一個 Animator 控制器,用來設置角色上的行為。這些包括狀態機、混合樹和通過腳本控制的事件。

有以下屬性:

  • Controller 控制器 : 添加在當前角色上的Animator控制器;
  • Avatar 阿凡達 : 當前角色的Avatar系統;
  • Apply Root Motion 使用根運動 : 是否使用角色自身動畫運動屬性移動角色位置或者使用腳本控制;
  • Animate Physics 物理動畫 : 動畫是否使用物理交互;
  • Culling Mode 剔除模式 : 動畫的剔除模式;
  • Always animate 總是使用播放動畫 : 總是播放動畫,不做任何剔除;
  • Based on Renderers 基於渲染器 : 當渲染器不見時,只有根運動被執行。身體的其他部分在角色不可見時都保持靜止;

可以從動畫控制器視圖(菜單:Window > Animator Controller)預覽和設置角色行為 : Animator 控制器可以從工程視圖內創建(菜單: Create -> Animator Controller)。在狀態機設置完畢后,可以拖拽這個控制器到任意一個檢視器中擁有 avatar 角色的 Animator 組件內。

動畫控制器窗口包括:

  • 動畫層組件;
  • 事件參數組件;
  • 狀態機自身的可視化窗口;

注意一點,Animator 控制器窗口總是會顯示最近選擇的資源中的 .controller 狀態機,無論當前是哪個場景被載入。(根據測試,控制器窗口也會在選擇附加了 Animator 組件的 GameObject 上的控制器時進行切換)

10.3. 動畫狀態機 Animation State Machines ##

一個角色擁有多個可以在游戲內在不同狀態下調用的不同動作是一件很普遍的事。比如,一個角色可以在等待時呼吸或者搖擺,在得到命令時行走或者從一個平台掉落時驚慌地伸手。當這些動畫進行回放時,使用腳本控制它們可能是一個潛在的復雜工作。Mecanim 借用了電腦工程師熟知的一個概念 —— 狀態機 —— 來簡單的控制和序列化角色動畫。

一個最基本的觀點是:一個角色應該在任何給定的時刻執行某些特定的動作。這些動作是否可用是基於游戲進程的,但是典型的動作包括等待,移動,跑動,跳躍等。這些動作被稱為狀態。在場景中當角色正在行走、等待或者做其他什么的時候都會處於某一個狀態。一般來說,角色在進入下一個狀態時會被限制,而不是可以從任意一個狀態跳轉至另一個任意狀態。比如,一個“跑動跳躍”動作只可以在角色正在跑動時執行而不是當角色正在站立的時候。你永遠不應該從等待動作中直接跳轉到跑動跳躍動作狀態。讓角色從正確跳轉狀態的選項被稱為狀態轉移。而將上面這些(狀態的集合,狀態轉移的集合和一些用於記錄正確狀態的變量)整合起來的東西就是一個狀態機。

狀態和狀態轉移可以使用圖形界面描述,在這個界面里,節點用來描述狀態而帶箭頭的線段用來描述狀態轉移。你可以認為當前的狀態(被標記或高亮的某個節點)只可以沿着這些箭頭方向轉移至其他狀態。

狀態機對於動畫的重要性在於他們可以很簡單地通過相對較少地編碼完成設計和更新。每個狀態都有一個當前狀態機在那個狀態下將要播放的動作集合。這將允許動畫師和設計師不使用代碼而定義可能的角色的動畫和動作序列。

Mecanim狀態機 : Mecanim 的動畫狀態機提供了一種可以預覽某個獨立角色的所有相關動畫剪輯集合的方式,並且允許你能夠在游戲中通過不同的事件觸發不同的動作。動畫狀態機可以通過動畫狀態機窗口進行設置,而這個窗口看起來像是這樣:

狀態機包括狀態、狀態轉移和事件,並且在大的狀態機中可以設置一個小的子狀態機。

動畫狀態 Animation States ###

動畫狀態是動畫狀態機中內建的基本模塊。每個狀態包含一個在該狀態下角色所能播放的獨立的動畫序列(或是一棵動畫混合樹)。當游戲中觸發一個狀態轉移事件時,角色將會轉移至動畫序列指定的下一個狀態中。當你在動畫控制器中選擇一個狀態時,你將會在檢視器中看到一些關於這個狀態的參數。

  • Speed 速度 : 動畫的默認速度;
  • Motion 動作 : 這個狀態的動畫剪輯;
  • Foot IK 腳部動畫約束 : 是否在這個動作使用腳部動畫約束;
  • Transitions 狀態轉移 : 從這個狀態產生的狀態轉移;

當狀態機第一次被激活時將會自動跳轉至使用褐色顯示的默認狀態。如果必要的話你可以更改默認狀態,在另一個狀態上右擊,並在彈出菜單中選擇“設置為默認狀態”(Set As Default)。每個狀態轉移后的 solo 和 mute 復選框用來控制動畫預覽的行為. 你可以在動畫控制器窗口的空白區域右擊,並在彈出菜單中選擇“建立狀態”->“控狀態”(create state -> empty)來創建任意一個新的狀態。或者你也可以通過向動作控制窗口拖拽一個新的動畫來創建一個包含該動畫的動畫狀態。(注意:你只能拖拽一個 Mecanim 系統動畫,非 Mecanim 系統動畫將被狀態機拒絕)動畫狀態也可以包含一顆動畫混合樹(Blend Tree)。

任意狀態是- 一個一直存在的特殊狀態。他的存在是為了保證你在無意轉移至某個你當前正處於的特殊狀態而准備的。為你的狀態機中的每個狀態設置相同的對外轉移是一個快捷的方式。注意:這里 Any State 所暗示的特殊含義是指:它不能成為一個狀態轉移的終點。(比如,跳轉至“任意狀態”不是做選擇一個隨機狀態跳轉)。

動畫狀態轉移 Animation Transitions ###

動畫轉移發生在:在你從一個動畫狀態跳轉至另一個動畫狀態時。在任意時刻只可能有一個動畫狀態轉移被激活。

  • Atomic 原子操作 : 這個轉移是否是一個原子操作(不可被中斷的);
  • Conditions 觸發條件 : 這里我們決定什么時候這個轉移被觸發;

觸發條件包括 :

  • 一個參數條件, 你可以使用“結束時刻(Exit Time)”作為一個參數,並且聲明一個表示為源狀態標准時間參數(比如,0.95 表示這個狀態轉移將會在原動畫播放至 95% 的時刻觸發)。
  • 一個條件謂詞(如果需要的話,比如使用float作為參數時可以使用小於/大於(Less/Greater))。
  • 一個條件值(如果需要的話)。

可以通過拖拽開始或結束之間的重疊區域來調整這個狀態轉移。

動畫參數 Animation Parameters ###

參數可以使用腳本通過 Animator 類的:SetVector, SetFloat, SetInt 和 SetBool 進行設置。這是一個通過用戶輸入修改參數的例子。

using UnityEngine;
using System.Collections;

public class AvatarCtrl : MonoBehaviour {

	protected Animator animator;

	public float DirectionDampTime = .25f;

	void Start ()
	{
		animator = GetComponent<Animator>();
	}

	void Update ()
	{
		if(animator)
		{
			//get the current state
			AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);

			//if we're in "Run" mode, respond to input for jump, and set the Jump parameter accordingly.
			if(stateInfo.nameHash == Animator.StringToHash("Base Layer.RunBT"))
			{
				if(Input.GetButton("Fire1"))
					animator.SetBool("Jump", true );
			}
			else
			{
				animator.SetBool("Jump", false);				
			}

			float h = Input.GetAxis("Horizontal");
			float v = Input.GetAxis("Vertical");

			//set event parameters based on user input
			animator.SetFloat("Speed", h*h+v*v);
			animator.SetFloat("Direction", h, DirectionDampTime, Time.deltaTime);
		}		
	}   		  
}

10.4. 混合樹 Blend Trees ##

一個游戲動畫的基本任務就是將兩個或多個相似的動作混合。也許最廣為人知的例子就是依照任務行動的速度將行走和跑動動畫混合起來了。另一個例子就是角色在跑動中向左或向右轉身。區分狀態轉移和混合樹是很重要的。雖然兩者都被用來制作平滑動畫,但是他們是分別在不同的情況下使用的。

  • 狀態轉移是在確定的時間內從一個動畫狀態平滑的轉移至另一個時使用的。狀態轉移被認定為動畫狀態機的一部分。如果一個動作跳轉到另一個完全不同的動作耗時很短,那么狀態轉移通常的表現令人滿意。
  • 動畫混合樹是通過使用不同的角度將角色不同的部分混合達到平滑混合不同的動畫的目的的。他會用一個有動畫控制器有關的、可量化的混合參數來控制各個動作相對於最終的效果的權重。為了使混合過后的動作起作用,必須混合造型和時間相近的動作。動畫混合樹在動畫狀態機中是一個特殊類型的狀態。

一個相似動畫可以被多樣化的例子就是走動與跑動動畫。為了讓混合工作良好,需要在標准時間下確保動畫剪輯是在相同的點發生轉移的。比如,走動和跑動可以都在腳與地板接觸的時刻進行連接(比如,左腳在 0.0 時刻而右腳在 0.5 時刻)。標准時間之所以被使用,是因為這樣就可以無視動畫剪輯是不同長度這件事了。

使用混合樹進行工作,你需要 :

  1. 在動畫控制器窗口的空白處右擊;
  2. 在彈出菜單中選擇“新建狀態”-> “通過新的混合樹創建”(Create State –>From new Blend);
  3. 雙擊混合樹后進入混合樹界面;

現在動畫控制器界面展示了整棵混合樹,而檢視器則顯示了當前選中的節點和他的直系子節點。下面的動畫控制器窗口展示了一個完整的混合樹。左半部分是一個只有根節點的混合樹,右半部分是一個擁有一個根節點和三個子節點(三個動畫剪輯)的混合樹。

這里顯示了一個可視化窗口,這個窗口演示了如何通過調整參數值來改變動畫之間的混合的(當你拖拽滾動條的時候,混合樹根上的箭頭會通過調整連線的光影效果來表示動畫剪輯之間的影響權重)。

你可以選擇一個混合樹上的任意一個節點,從而在檢視器上檢視該節點。如果你選擇了一個動畫剪輯節點,那么檢視器上將會顯示一個動畫剪輯。這些從模型上導入的動畫剪輯信息是只讀的。如果你選擇的是一個混合樹節點,那么檢視器上將會顯示混合樹信息。

混合模式下拉菜單是用來選擇這個混合樹是使用一個參數或兩個參數來進行混合的。

一維混合 1D Blending ###

混合節點在檢視器中的第一個選項是混合類型。這個下拉菜單是用來選擇使用一個或兩個參數進行混合的混合模式。1D 混合使用一個參數對子行動進行混合。在設置完混合模式后,你需要做的是選擇一個你要在混合樹中控制的動畫參數。比如,方向(direction)參數需在 -1.0(左)和 +1.0(右),使用 0.0 將會向正前方跑動。之后你可以通過點擊“添加動作區域”(Add Motion Field)來為混合樹添加一個單獨的動畫剪輯。當你完成后,可能檢視器看起來像是這樣:一個擁有三個動畫剪輯的1D混合節點。

這個動作示意區域顯示了每一個子動作在調整參數處在該子動作最小值和最大值的之間時,該子動作對整個動作提供的影響。每一個動作被顯示為一個藍色小金字塔(第一個和最后一個動作只顯示了一半),如果你在其中一個上點住鼠標,你會發現其對應的動作會在下面的動作列表里被高亮。每個小金字塔的峰值表示這個子動作在這時對整個動作產生完整的影響,或者意味着這時候動畫的權重為1並且其他所有動畫的權重為0.這也被稱為整個子動作的臨界值。混合節點檢視器窗口中,根據參數的范圍將各個子動作的權重可視化。

紅色的豎直條標識了參數的值。如果你點擊檢視器底部預覽框上的播放按鈕,並在動作示意區域左右拖動紅色豎直條,你可以發現那些參數值是如何在不同的動作間通過不同的參數調整混合的。

在混合節點示意區域下面顯示的左右兩個數字就是調整參數的范圍。他們中的每一個值都可以通過點擊拖拽鼠標進行更改。注意:這個值需要符合動作列表中第一個和最后一個子動作的臨界值限制。

你可以通過在示意區域點擊和左右拖拽對應的藍色小金字塔來調整動作臨界值。如果“自動設置臨界值”(Automate Thresholds)選項沒有被勾選,你可以從動作列表中的對應子動作的臨界值編輯框內輸入調整臨界值。

在動作列表下面的是“自動設置臨界值”(Automate Thresholds)復選框激活他將會將臨界值均勻的分布在調整參數范圍內。比如,如果有五個動畫剪輯分布在 -90 到 +90 的范圍內,那么他們的臨界值會被分別設定為 -90,-45,0,+45 和 +90。“計算臨界值”(Compute Thresholds)下拉菜單可以通過擁有根動作的動畫剪輯所包含的數據設置臨界值。可用的選擇包括速度,X、Y、Z 方向分量速度和使用弧度或角度計算的角速度。如果你的參數符合上述某個屬性,你可以選擇下拉菜單中的某項。

  • Speed 速度 : 根據速度設置臨界值(速度的大小)。
  • Velocity X X方向速度 : 根據x方向分量速度設置臨界值。
  • Velocity Y Y方向速度 : 根據y方向分量速度設置臨界值。
  • Velocity Z Z方向速度 : 根據z方向分量速度設置臨界值。
  • Angular Speed (Rad) 角速度(弧度): 根據每秒轉過的弧度計算臨界值。
  • Angular Speed (Deg) 角速度(角度): 根據每秒轉過的角度計算臨界值。

打個比方說:你有一個走動動畫,他每秒移動 1.5 個單位,而一個慢跑動作每秒移動 2.3 個單位,而一個跑動動作每秒移動4個單位。選擇下拉列表中的“速度”(Speed)選項可以基於這個值為三個動畫配置參數范圍。所以你看到參數設置為了 3.0,混合了慢跑和跑動動畫,並且(臨界值)稍微偏向慢跑一些。

二維混合 2D Blending ###

混合節點在檢視器中的第一個選項是混合類型。這個下拉菜單是用來選擇使用一個或兩個參數進行混合的混合模式。2D 混合使用兩個參數對子行動進行混合。

2D 混合類型使用了一套適應自身的不同使用方法。他的不同點在於:每個子動作都在對整個動作產生影響。

  • 2D 簡單定向 2D Simple Directional : 當你的動作表現為不同的方向(就像“向前走”、“向后走”、“向左走”和“向右走”,或“”“朝向上”、“朝向下”、“朝向做”和“朝向右”)時,你可以使用這個混合類型。當然你可以選擇“等待”或者“朝向前”作為原點動作。在簡單定向模式中應該盡量避免使用相同朝向的動作,比如“向前走”和“向前跑”。
  • 2D 自由定向 2D Freeform Directional : 這個混合類型同樣也用於混合朝向不同的動作,雖然你也可以混合像“向前走”和“向前跑”這樣的動作。在自由定向模式下,動作集合一般都應該有一個位於原點的動作,比如“等待”。
  • 2D 自由笛卡爾坐標 2D Freeform Cartesian : 這種模式最好使用在你的各個動作間沒有明顯朝向區別的時候。在使用自由笛卡爾坐標時,你可以在X軸和Y軸上分別使用不同的定義,比如“角速度”和“線速度”。比如這樣一些子動作:“向前走動不轉彎”、“向前跑動不轉彎”、“向前走動轉向右”、“向前跑動轉向右”等。

在設置完畢混合模式之后,你需要做的第一件事就是選擇兩個動畫參數來控制這棵混合樹。在例子中,選擇的參數是 X 方向速度分量(旋轉)和Z方向速度分量(向前速度)。你可以通過點擊 “+”-> 添加動作區域(Add Motion Field)來為混合樹添加一個動畫剪輯。當你完成這些以后,你可以看到想這樣的一個檢視器 : 這是一個由五個動畫剪輯的2D混合節點。

2D 混合中的位置(position)就像是 1D 混合中的臨界值(thresholds)一樣(除了 2D 中使用兩個參數代替了 1D 中的一個以外)。位置中的水平 X 軸對應第一個參數,而垂直 Y 軸對應第二個參數。一個向前移動動畫可能有 0 速度的 X 分量和 1.5 速度的 Z 分量,所以應該把這些值寫在動作 Pos X 和 Pos Y 的對應數值區域內。

The 2D Blending Diagram 2D 混合示意區域

在檢視器的 2D 混合區域頂部是顯示所有子動作位置的示意區域。子動作被顯示為一個藍色的點。那些沒有動畫剪輯加載或對混合樹沒有影響的點被顯示為灰色的點。你可以通過點擊示意區域中的那些點選擇一個子動作。一旦你選擇了某個子動作,那個子動作的對整個動作的影響將會用藍色的區域顯示。越接近動作點所在位置的區域,該子動作的影響越強烈。當參數點處於動作點時,該子動作(對整個動作)產生完整影響,這意味着這個動畫剪輯的權重是 1 而其他任何動畫剪輯的權重都是 0。

紅色的點標識了兩個參數。如果你點擊檢視器底部預覽框上的“播放”(Play)按鈕,並且四處拖動這個紅色的點,你就能看到這個參數的值是控制不同動作值之間的混合的。在示意圖中你可以看到每個動作的影響力被顯示成一個以動作點為圓心的圓形。如果你移動那個紅色的點到某個藍色的動作點上,那么這個藍色點上的圓的半徑編程最大,而其他的點上的圓形都消失了。而(將紅色的點置於)一些動作的中間的位置的時候,越靠近紅色的點的子動作在混合過程中占據更大的影響。如果你為了看到某個動作的影響區域選定一個子動作后,當你拖動紅色的點時,(你會看到)該動作上對應的圓圈的大小和紅色點所處位置的影響區域強度是對應的關系。

當沒有動作被選擇的時候,示意區域顯示了一個所有影響區域疊加的效果 : 藍色很深的位置被一個單獨的動作控制,而藍色較淺的部分則通過多個動畫混合。

** Position 位置 **

你可以通過點擊拖動某個示意區域中的藍色動畫點來改變他的“位置”。你也可以通過編輯動作列表中的 Pos X 和 Pos Y 列中的數字來直接改變他們。

“計算位置”(Compute Positions)下拉菜單將會設置根據你導入模型中的根動作自動選擇設置位置的值。可選的數據包括速度,x、y、z 方向速度分量,和基於角度或弧度的角速度。如果一個或者全部兩個參數符合上面那些屬性,你可以使用“計算位置”下拉菜單計算 Pos X 和 / 或 Pos Y 的值。

  • Velocity XZ XZ速度 : 每個動作的 Pos X 根據 X 方向分量設置;Pos Y 根據 Z 方向分量設置。
  • Speed And Angular Speed 速度和角速度 : 每個動作的Pos X根據角速度(每秒角度)設置;Pos Y 根據速度設置。

另外,你可以通過只選擇“計算位置” ->“ 從…計算X位置”(X Position From)和/或 “計算位置” ->“ 從…計算Y位置”(Y Position From)分別計算每個分量,並保持另一個分量不變。

舉個例子,你可以根據側向移動和前向移動分別設置兩個參數,這樣你就會在平均速度(0, 0, 0)處得到一個等待動畫,在(0, 0, 1.5)處得到一個走動動畫,並且在(-1.5,,0, 0)和(1.5, 0, 0)處得到兩個平移動畫。從下拉菜單中選擇 “XZ速度”(Velocity XZ)選項將會根據 X 和 Z 方向分量速度設定動作的位置。

11. Mecanim 進階主題 Mecanim Advanced topics #

11.1. 使用 Mecanim 的動畫曲線 ##

動畫曲線可以在動畫導入設置的動畫標簽中添加進動畫剪輯。

曲線的X周標識為標准時間並且他的值總是處於 0.0 到 1.0(僅根據各自動畫剪輯的開始或結束確定,忽略動畫本身的持續時間)。

雙擊動畫曲線會打開可以為曲線添加關鍵幀的標准 Unity 曲線編輯器(如下圖)。關鍵幀是一些沿着動畫曲線分布在時間軸上的點,這些點可以通過 Animator 直接精確調整來代替直接插值。關鍵幀在標記某些重要的點時十分有效。比如對於一個走動動畫,你可以標記左腳着地的點,之后是兩腳都在地上,再然后是右腳在地上等等。當關鍵幀被建立起來后,你可以通過點擊 “前一/后一關鍵幀” 按鈕在兩幀間切換;你在文本框中輸入的值會被設置為所選中的關鍵幀的值。

如果你有一個 Animator 控制器參數同名的曲線,那么這個參數會根據曲線的時間線調整這個參數的值。例如,你有一個腳本調用了 GetFloat,那么返回值會等於調用時刻曲線上的值。注意:在任意時刻可能都會有多個動畫剪輯試圖通過相同的控制器設置相同的參數。這時,曲線的值會通過各個動畫剪輯混合。如果一個動畫沒有為某個參數設定任何曲線,那么混合將使用這個參數的默認值。

11.2. 子狀態機 Sub-State Machines ##

一個角色擁有某些由多個狀態組成的復雜動作是很普遍的。與其將這些事件制作成一個狀態,一個更有效的辦法是標記這些獨立的狀態,並且將每個狀態分開。比如,一個角色可能有一個被稱為 “Trickshot” 的動作:首先下蹲瞄准,然后射擊,最后重新站起來。( “Trickshot” 動作狀態序列 )

盡管這樣做能夠達到控制的目的,但是之后狀態機會變得很龐大,並且隨着更多的復雜動作地添加將會變得越來越臃腫。當然,你可以利用編輯器里的空白區域將相關的狀態簡單的分開。然而 Mecanim 的功能在這些的基礎上會更進一步:你可以在狀態機中將一組狀態輕松的收縮至一個單獨命名的控件里。這組被收縮的狀態被稱為 子狀態機

你可以在 Animator 控制窗口的空白區域右擊,從彈出菜單中選擇“創建子狀態機”(Create Sub-State Machine)從而創建一個新的子狀態機。子狀態機使用一個長的六角形表示,以區別於其他普通的狀態。下圖是一個子狀態機 :

當雙擊那個六角形時,編輯器會刷新以便你像編輯一個完全分離的狀態機那樣編輯這個子狀態機。在頂部顯示的一個“導航路徑”顯示了當前所編輯的子狀態機(注意:你可以為子狀態機創建新的子狀態機)。點擊某個條目將會使編輯器轉至那個子狀態機。

External transitions 外部狀態轉移

就像之前提到的那樣,子狀態機是一個將一組相關狀態在編輯器中收縮起來的一個途徑。所以當你將狀態轉移至一個子狀態機時,你必須選擇一個你希望連接的狀態(以供連接)。

你會發現在子狀態機中有一個以“上層”(Up)作為前綴的額外狀態。

這個“上層”(Up)表示“外部世界”,在視圖中狀態機包含整個子狀態機。如果你為子狀態機的某個狀態添加一個指向“上層”(Up)狀態的狀態轉移,你需要指定一個外部狀態機的狀態以供連接。下圖為連接至外部狀態機的狀態。

11.3. 動畫層 Animation Layers ##

Unity 使用“動畫層”來管理身體不同部分的復雜狀態機。比如:你可以使用下半身(動畫)層來管理走動/跑動;使用上半身(動畫)層來控制投擲/設計動作。可以使用Animator控制器左上角的層權重來管理動畫層.

你可以點擊控件上的“+”添加新的動畫層。你可以在每層上指定特定的身體蒙皮(將會應用動畫的身體部分)和混合類型。(混合類型中的)“重載”(override)表示其他層的信息會被忽略;“附加”(additive)表示這些動畫將被附加在之前的層上。

“蒙皮”(Mask)選項用來指定該層使用的身體蒙皮。比如:如果你希望當角色走動或跑動的時候,讓上半身完成投擲動作,你可以使用上半身蒙皮。就像這樣:

Animation Layer syncing 動畫層同步

有些時候在不同層中能夠重用一些相同的狀態機是很有用的。比如:如果你希望模擬一個“負傷”的行為,並且這個“負傷”的動畫是為代替走動/跑動/跳動中“健康”(的動畫)。你可以點擊某個層上的“同步”(Sync)復選框,並且選擇你希望同步的那一層。這樣的話,這些狀態機結構將會保持一致,但是實際的動畫剪輯會有區別。

11.4. 動畫狀態機預覽(獨立 和 關閉) Animation State Machine Preview (solo and mute) ##

Solo 和 Mute 的功能 ###

  1. 如果選擇了mute,那么被選擇的狀態轉移一定會被禁用;
  2. 如果不選擇solo,在沒有變量控制(結束條件為“exit time”)的情況下,該狀態優先選擇動作列表中最前(或者說最上的)的狀態轉移;
  3. 如果選擇了某個solo,那么在沒有變量控制(結束條件為“exit time”)的情況下,優先選擇標記solo的狀態轉移;
  4. 如果有多個狀態轉移選中了solo,那么優先選擇這些已選中solo的狀態轉移中,在動作列表中靠前的狀態轉移;
  5. 暫未實驗使用參數控制的轉移情況。

solo 狀態轉移被顯示為綠色,mute 狀態轉移被顯示為紅色,就像這樣:

在上面的例子中,如果你處於狀態 0 中,那么只有狀態 A 和狀態 B 可以使用。

  • 基本的原則是,如果一個狀態被標記為 solo,那么其余的狀態轉移將被視為選中 mute;
  • 如果 solo 和 mute 同時被選中,那么 mute 的優先級更高(即視為只選中了 mute);

PS : 現在的控制視圖並不總是響應引擎的內部 mute 狀態

11.5. 目標匹配 Target Matching ##

在游戲中,有一種情況經常發生,就是在某個時刻你需要某個角色的手或者腳到達某個特定位置。比如說,某個角色需要在跳過踏板的時候抓住頭頂上的某個橫梁。你可以用 Animator.MatchTarget 函數來解決這種情況。比如說,你有一個叫做“跳躍起來”(jump up)希望處理一個角色跳到平台上的情況時,你可以嘗試下面的做法:

  • 找到角色在動畫剪輯中跳起時刻的位置。注:在這個例子中(這個位置是)畫片段標准時間的0.141或者總動畫時間的14.1%。

  • 找到角色在動畫剪輯中叫着地的位置。注:這個例子中(這個位置的)值是 78.0% 或者 0.78。

  • 建立一個名為(TargetCtrl.cs)的腳本,這個腳本產生一個 MatchTarget 函數調用,就像這樣:

    using UnityEngine;
    using System;
    
    [RequireComponent(typeof(Animator))]  
    public class TargetCtrl : MonoBehaviour {
    
    	protected Animator animator;
    
    	//the platform object in the scene
    	public Transform jumpTarget = null;
    	void Start () {
    		animator = GetComponent<Animator>();
    	}
    
    	void Update () {
    		if(animator) {
    			if(Input.GetButton("Fire1"))		       
    				animator.MatchTarget(jumpTarget.position, jumpTarget.rotation, AvatarTarget.LeftFoot,
                                                           new MatchTargetWeightMask(Vector3.one, 1f), 0.141f, 0.78f);
    		}		
    	}
    }
    

將這個腳本附加在 Mecanim 模型上。

這個腳本將會移動角色,這樣他就能從正確的位置起跳,並且他的左腿會落在目標點上。記住:目標匹配通常只有在游戲運行的正確位置調用才會生效。

11.6. 根動作-如何工作 Root Motion - how it works ##

身體變換是角色的質心(質量中心)。它被 Mecanim 用來做引擎重定向和支持大多數穩定的可替換模型。身體方向是根據 Avatar 系統中 T 姿勢的上半身和下半身方向平均值得到的。身體變換位移和角度被存儲在動畫剪輯中(使用 Avatar 系統的肌肉定義設定完成)。而且只在動畫剪輯中保存世界空間曲線。其他還包括:既有曲線和目標 IK(手和腳的)都被存儲在身體變換中。

Root Transform 根變換 ###

根變換是一個預測位置,他會根據身體 Y 平面預測並且在運行時計算的。根變換會在每一幀中被計算。並且他會在 GameObject 令他移動時改變。

Animation Clip Inspector 動畫剪輯檢視器 ###

動畫剪輯編輯器可以通過設置“根旋轉變換”、“根位置變換(Y)”和“根位置變換(XZ)”讓你可以根據身體變換來控制根變換的預期位置。根據這些設定,某些身體變換可能就是根變換。比如,在某個動作中Y的位置是根動作(軌道)或者某個已知被烘焙進姿勢(身體變換)的一個部分時。

Root Transform Rotation 根旋轉變換 ###

烘焙進姿勢(Bake into pose):旋轉需要保留在身體變換(或姿勢)中。根旋轉需要是連續的並且步長相同。這意味着 GameObject 不能在任意的動畫剪輯中被旋轉。

只有擁有相似根方向起點和終點的動畫剪輯可以使用這個選項。你需要在界面上顯示一個綠燈,這樣就說明這個動畫剪輯是一個可用的備選片段。一個合適的備選片段例子:一個向前行走(片段)和一個奔跑(片段)

基於(Based Upon):這允許你設置片段的旋轉。通過使用身體朝向,動畫剪輯會跟隨身體朝向向量旋轉。這個默認設置在大多數類似走動、跑動和跳躍之類的捕捉動作數據中會很好的工作,但是他將會在類似掃射這種和身體朝向向量垂直的動作中失效。在那些情況下你可以手動調整偏移(Offset)設置。最終你可以自動添加導入片段的作者創建的原件。通常情況下,這是根據美工設定的基於旋轉的關鍵幀數據來使用的。

偏移:當使用“基於”選項時手動添加的偏移值。

Root Transform Position (Y) 根位置變換(Y) ###

這個選項使用和根旋轉變換相同的概念。

烘焙進姿勢:動作的 Y 組件將會保留在身體變換(姿勢)中。根變換中的Y組件將會保持不變,根位置中的Y的步進值將會是0.這意味着這個片段不會改變 GameObject 的高度。同樣的你需要看到一個綠燈來告訴你這樣烘焙Y動作進姿勢是一個可用的備選。

大部分動畫剪輯會激活這個設定。只有那些需要改變 GameObject 高度的拍那段才需要關閉這個選項,比如跳起或跳落。

Animator.gravityWeight 是根據烘焙進姿勢的Y位置驅動的。當啟用時,gravityWeight = 1;當停用時,gravityWeight = 0。gravityWeight 是動畫狀態轉移時用來混合片段的。

基於:類似Root Transform Rotation的方式,你可以從Original 或 Mass Center (Body)選擇。還有一個Feet的選項用於動畫剪輯修改高度是非常方面的(烘焙姿勢被禁用)。當時使用Feet根變換位置Y將匹配所有幀最多的腳Y。因此,混合點始終在Feet周圍,當混合或變換時,防止浮動的問題。

偏移:和根旋轉變換相似,你可以手動的調整動畫剪輯中高的偏移值。

Root Transform Position (XZ) ###

再次,這個(選項)使用了和根旋轉變換和根位置變換(Y)相同的概念。烘焙進姿勢通常被用於當你希望將 xz 坐標位置偏移強制設定為零的“等待”時。他將會阻止大量計算中的積累誤差。這個同樣可以根據美工已設定的用來關鍵幀片段來使用。

Loop Pose 循環姿勢 ###

循環姿勢(就像是混合樹中的混合姿勢或是狀態轉移中的)的產生發生在根變換的定義過程中。一旦根變換被計算完成,這個姿勢將會和他相關聯。在開始和結束幀之間不同的相關姿勢將被計算,而在動畫剪輯范圍(0-100%)之外的相關姿勢將會被創建。

Generic Root Motion and Loop Pose. 一般的根動作和循環姿勢 ###

這些從本質上講和人形根動作相同,但是使用身體變換代替計算/預測根節點中設置的根變換。姿勢(所有在根動作骨骼之下的那些骨骼)通過關鍵根變換被創建。

End.

學習自 58開發網 和 Unity聖典社區


見獵心喜 淺嘗輒止 偶有所得 不足為法 & 溫故而知新

紙上得來終覺淺 絕知此事要躬行 & 努力奮斗


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM