Mecanim

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)如下: 

[csharp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class IdleRunJump : MonoBehaviour {  
  5.   
  6.   
  7.     protected Animator animator;  
  8.     public float DirectionDampTime = .25f;  
  9.     public bool ApplyGravity = true;   
  10.   
  11.     // Use this for initialization  
  12.     void Start ()   
  13.     {  
  14.         animator = GetComponent<Animator>();  
  15.           
  16.         if(animator.layerCount >= 2)  
  17.             animator.SetLayerWeight(1, 1);  
  18.     }  
  19.           
  20.     // Update is called once per frame  
  21.     void Update ()   
  22.     {  
  23.   
  24.         if (animator)  
  25.         {  
  26.             AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);            
  27.   
  28.             if (stateInfo.IsName("Base Layer.Run"))  
  29.             {  
  30.                 if (Input.GetButton("Fire1")) animator.SetBool("Jump"true);                  
  31.                     }  
  32.             else  
  33.             {  
  34.                 animator.SetBool("Jump"false);                  
  35.                  }  
  36.   
  37.             if(Input.GetButtonDown("Fire2")&&animator.layerCount >= 2 )  
  38.             {  
  39.                 animator.SetBool("Hi", !animator.GetBool("Hi"));  
  40.             }  
  41.               
  42.           
  43.                 float h = Input.GetAxis("Horizontal");  
  44.                 float v = Input.GetAxis("Vertical");  
  45.             animator.SetFloat("Speed", h*h+v*v);  
  46.                     animator.SetFloat("Direction", h, DirectionDampTime, Time.deltaTime);     
  47.         }               
  48.     }  
  49. }  

6. 爲Mecanim系統創建角色

    爲Mecanim系統創建角色主要包括以下三個階段:

    1) 建模

         角色模型有合理的拓撲結構;模型導出設置;模型導入Unity3D;使角色處於T-Pose;去掉不需要的面、頂點及隱藏的面、頂點;

    2) 骨骼設置

    3) 蒙皮

         把多邊形的網格頂點綁定到骨骼上的過程。

7. 肌肉設置與身體遮罩的區別

    1) 肌肉設置:是對Avatar進行設置,所以它修改了Avatar的輸入設置,對所有動畫有效。

    2) 身體遮罩:是對動畫進行設置(每個Animation Clip有一個Body Mask),只修改本動畫的屬性,即只對本動畫有效。

    




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章