1. 簡介
Mecanim把遊戲中的角色設計提高到了一個新的層次,使用Mecanim可以通過Retargeting(重定向)來提高角色動畫的重用性。在處理人類角色動畫時,用戶可以使用動畫狀態機來處理動畫之間的過渡及動畫之間的邏輯。
Mecanim支持運動重定向(Retargeting)功能:即把動畫從一個角色模型應用到另一個角色模型上的功能。
2. Animator關鍵元素
2.1 Animator組件
有Animator動畫的Gameobject必須有Animator組件,Animation組件如下圖所示:
Animator組件負責把動畫分配給GameObject。Animator包含以下兩個關鍵元素:
1) Animator Controller
2) Avatar (僅當GameObject是人形角色時,才定義Avatar)
下圖示意:一個遊戲對象的Animator組件如何把Animation Clips、Animator Controller和Avatar資源組合在一起。
2.2 Avatar
創建動畫的一個基本步驟就是建立一個從Mecanim系統的簡化人形骨架結構到用戶實際提供的骨架結構的映射,這種映射關係稱爲Avatar。
2.2.1 創建Avatar
創建Avatar是使用Mecanim的關鍵步驟。Avatar的創建過程,就是分析導入的角色資源的骨骼結構,其內部過程就是與Mecanim中已有的、簡化的、標準的人類骨骼進行對比,最後將其轉換或標識爲Mecanim可以識別的骨骼結構。
通過Avatar的創建,可以實現角色之間的Retargeting。
1)導入角色模型文件(如FBX)之後,在Project窗口中選中導入的角色,然後在其Inspector窗口中指定模型的的Rig爲Humanoid,然後點【Apply】按鈕
2)點【Apply】之後,Mecanim嘗試把角色已經存在骨骼結構匹配到Avatar的骨骼結構(在大部分情況下,Mecanim能自動完成),如果匹配成功,在【Configure】旁邊有一個“V”的符號,如下圖所示:
3)在成功匹配之後,Avatar子資產被增加到模型資產的下面,其在Project窗口中如下圖所示:
4)選中Avatar子資產(如上圖中的EthanAvatar),Inspector窗口如下圖所示,點【Configure Avatar】之後,可配置Mapping和Muscles。
2.2.2 配置Avatar
Avatar是Mecanim系統中極爲重要的模塊,因此爲模型資源正確地設置Avatar也就變得至關重要。不管Avatar的自動創建是否成功,用戶都需要進入到Configure Avatar界面中去確認Avatar的有效性,即確認用戶提供的骨骼結構與Mecanim預定義的骨骼結構已經正確匹配起來,並且模型已經處於T形姿態。
1) 實線圓圈:骨骼是必須匹配的
2) 虛線圓圈:骨骼是可選匹配的可選匹配骨骼的運動會根據必須匹配骨骼的狀態來自動插值計算。爲了方便Mecanim進行骨骼匹配,用戶提供的骨架中應包含所有必須匹配的骨骼。爲了提高匹配的機率,應儘量通過骨骼代表的部位給骨骼命名(如:左手命名爲LeftArm)。
3) Avatar自動創建成功,其界面如下:
4) Avatar自動創建失敗,其 界面如下:
5) Avatar Configure Inspector (骨骼映射)
6) 如果auto-mapping(Mapping->Automap)部分或完全失敗,可以在Scene中拖動骨骼以進行分配。如果Mecanim認爲骨骼合理,則在Avatar Inspector中以綠色顯示,否則以紅色顯示。
7) 如果骨骼綁定正確,但是角色姿勢不對(不是標準的T形),在Scene中可看到消息“Character not in T-Pose”,解決此問題可通過Pose->Enforce T-Pose或旋轉其它的骨骼。
2.2.3 肌肉設定
1) Mecanim允許使用“肌肉”來控制不同骨骼的運動範圍。
2) 當Avatar被創建且被成功配置之後,Mecanim可理解骨骼結構,且允許在Avatar Inspector的【Muscles】選項卡中調節相關參數。在此可以調整角色的運動範圍,以確保骨骼運動起來真實、自然。
詳細使用方法參見:http://www.unitymanual.com/thread-1211-1-1.html
3) 通過設置各個關節的旋轉範圍來控制不現骨骼的運動範圍。
2.3 Animator Controller
負責定義使用哪些動畫素材,以及何時、如何播放(融合<blend>和過渡<transition>)這些動畫素材。
Animator Controller以狀態機(State Machine)的方式維護一系列動畫,且當隸屬的角色發生特定事件時,切換播放的動畫。
2.3.1 創建Animator Controller
在Project窗口中,創建Animator Controller,然後雙擊剛創建的Animator Controller可在Animator窗口中進行編輯。創建Animator Controller如下圖所示:
2.3.2 編輯Animator Controller
2.3.2.1 創建狀態節點
把Animation Clip從Project窗口中拖到Animator窗口,則自動創建了一個對應的狀態節點,第一個拖入的Animation Clip爲默認狀態節點,如下圖所示:
2.3.2.2 設置狀態變換
狀態變換:即從一個狀態變換到另一個狀態,如從IdleShort狀態變換到Jump狀態。
2.3.2.2.1 角色自動運動
簡單且不用編程的狀態變換,程序不能控制
從一個狀態變換到另一個狀態的帶箭頭的線表示:這些箭頭線用於設置變換條件,如:在什麼條件下才從IdleShort狀態變換到Jump狀態。
設置狀態變換時,先選中箭頭線,然後在Inspector中設置變換條件,如下圖根據播放的百分比來設置變換條件。
當IdleShort狀態播放到90%時,則切換到Run狀態。
設置完之後,關閉Animator窗口中。至此,一個簡單的且不用編程的Animator Controller已經設置完成。
2.3.2.2.2 程序控制角色運動
1. 創建混合樹
1) 若一個狀態節點支持多種運動(如:Run支持RunDirect、RunLeft、RunRight),選中此節點點右鍵,然後點【Create new BlendTree in State】,則此狀態節點的Motion爲:Blend Tree
2) 創建BlendTree之後,雙擊此狀態節點,則進入混合樹的編輯。
3) 選中混合樹,在其Inspector面板中,點按鈕【+】然後點【Add Motion Field】增加3個Motion,然後並設置對應的Motion,其結果如下:
2. 創建控制參數並設置變換條件
1) 創建控制參數
2) 設置箭頭線變換條件
首先選中箭頭線,然後設置此箭頭的變換條件。
3) 設置混合樹變換條件
Direction:
-1: 播放動畫RunLeft
0: 揪放動畫Run
1:播放動畫RunRight
Blend Type: 1D(表示一個參數控制混合樹的動畫播放)
2.3.2.3 動畫合成
比如角色一邊跑,一邊揮劍,則需要把兩個動畫進行合成。要實現兩個動畫的合成,需要單獨創建一個動畫層。
Weight:動畫層的權重值
Mask: 本層的動作影響身體的哪一部分(遮罩)
1) 創建Avatar Mask:在Project窗口中創建一個Avatar Mask
2) 點擊不受影響的部位,使之變紅,如下圖只有右手的運動才參與計算,即只有右手的動作才發生作用,從而達到屏蔽身體其它部位的目的,從而提高了效率(IK:表示把風向動力學)
3) 把Avatar Mask應用於特定的動畫層
4) 在腳本中設置狀態變換條件,然後再把此腳本綁在角色身上。
總結:一個Animator Controller中可包含多個動畫層,每個動畫層按照其設定的狀態機單獨進行運行,然後根據其Weight把各動畫層進行合成,後面的動畫層(除Base Layer)只顯示其Avatar Mask綠色的部分。
2.3.3 應用Animator Controller
1) 在Hieratchy窗口中選擇需要Animator動畫的角色
2) 把Project中的Animator Controller資源拖到角色對象的Animator組件的Controller輸入框,或點旁邊的按鈕進行選擇
3. Animator重定向功能
重定向功能:就是把應用在一個角色上的動作應用到另一個角色身上。
即同一個Animator Controller可用於不同的Animators。
4. Animator詳細參數
Animator詳細參數參見:http://docs.unity3d.com/ScriptReference/Animator.html
http://edu.china.unity3d.com/learning_document/getData?file=/Manual/MecanimAnimationSystem.html
5. 設置動畫狀態過渡代碼
設置動畫狀態過渡代碼例子(IdleRunJump.cs)如下:
- using UnityEngine;
- using System.Collections;
- public class IdleRunJump : MonoBehaviour {
- protected Animator animator;
- public float DirectionDampTime = .25f;
- public bool ApplyGravity = true;
- // Use this for initialization
- void Start ()
- {
- animator = GetComponent<Animator>();
- if(animator.layerCount >= 2)
- animator.SetLayerWeight(1, 1);
- }
- // Update is called once per frame
- void Update ()
- {
- if (animator)
- {
- AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);
- if (stateInfo.IsName("Base Layer.Run"))
- {
- if (Input.GetButton("Fire1")) animator.SetBool("Jump", true);
- }
- else
- {
- animator.SetBool("Jump", false);
- }
- if(Input.GetButtonDown("Fire2")&&animator.layerCount >= 2 )
- {
- animator.SetBool("Hi", !animator.GetBool("Hi"));
- }
- float h = Input.GetAxis("Horizontal");
- float v = Input.GetAxis("Vertical");
- animator.SetFloat("Speed", h*h+v*v);
- animator.SetFloat("Direction", h, DirectionDampTime, Time.deltaTime);
- }
- }
- }
6. 爲Mecanim系統創建角色
爲Mecanim系統創建角色主要包括以下三個階段:
1) 建模
角色模型有合理的拓撲結構;模型導出設置;模型導入Unity3D;使角色處於T-Pose;去掉不需要的面、頂點及隱藏的面、頂點;
2) 骨骼設置
3) 蒙皮
把多邊形的網格頂點綁定到骨骼上的過程。
7. 肌肉設置與身體遮罩的區別
1) 肌肉設置:是對Avatar進行設置,所以它修改了Avatar的輸入設置,對所有動畫有效。
2) 身體遮罩:是對動畫進行設置(每個Animation Clip有一個Body Mask),只修改本動畫的屬性,即只對本動畫有效。