二、Unity5.x Mecanim Animator使用詳解

轉(zhuǎn)自:http://blog.csdn.net/yupu56/article/details/53468023

1. 簡介

Mecanim把游戲中的角色設(shè)計提高到了一個新的層次坏瞄,使用Mecanim可以通過Retargeting(重定向)來提高角色動畫的重用性扬跋。在處理人類角色動畫時,用戶可以使用動畫狀態(tài)機來處理動畫之間的過渡及動畫之間的邏輯拓春。

Mecanim支持運動重定向(Retargeting)功能:即把動畫從一個角色模型應(yīng)用到另一個角色模型上的功能释簿。

2. Animator關(guān)鍵元素

2.1 Animator組件

 有Animator動畫的Gameobject必須有Animator組件,Animation組件如下圖所示:
image

Animator組件負責(zé)把動畫分配給GameObject硼莽。Animator包含以下兩個關(guān)鍵元素:
1) Animator Controller
2) Avatar (僅當(dāng)GameObject是人形角色時庶溶,才定義Avatar)

下圖示意:一個游戲?qū)ο蟮腁nimator組件如何把Animation Clips、Animator Controller和Avatar資源組合在一起懂鸵。
image

2.2 Avatar

創(chuàng)建動畫的一個基本步驟就是建立一個從**Mecanim系統(tǒng)的簡化人形骨架結(jié)構(gòu)**到**用戶實際提供的骨架結(jié)構(gòu)**的映射偏螺,這種映射關(guān)系稱為Avatar。
image

2.2.1 創(chuàng)建Avatar

 ** 創(chuàng)建Avatar是使用Mecanim的關(guān)鍵步驟匆光。Avatar的創(chuàng)建過程套像,就是分析導(dǎo)入的角色資源的骨骼結(jié)構(gòu),其內(nèi)部過程就是與Mecanim中已有的终息、簡化的夺巩、標(biāo)準(zhǔn)的人類骨骼進行對比,最后將其轉(zhuǎn)換或標(biāo)識為Mecanim可以識別的骨骼結(jié)構(gòu)周崭。**

** 通過Avatar的創(chuàng)建柳譬,可以實現(xiàn)角色之間的Retargeting。**

  1)導(dǎo)入角色模型文件(如FBX)之后休傍,在Project窗口中選中導(dǎo)入的角色征绎,然后在其Inspector窗口中指定模型的的Rig為Humanoid,然后點【Apply】按鈕
image

2)點【Apply】之后,Mecanim嘗試把角色已經(jīng)存在骨骼結(jié)構(gòu)匹配到Avatar的骨骼結(jié)構(gòu)(在大部分情況下人柿,Mecanim能自動完成)柴墩,如果匹配成功,在【Configure】旁邊有一個“V”的符號凫岖,如下圖所示:

image

3)在成功匹配之后江咳,Avatar子資產(chǎn)被增加到模型資產(chǎn)的下面,其在Project窗口中如下圖所示:

image

4)選中Avatar子資產(chǎn)(如上圖中的EthanAvatar)哥放,Inspector窗口如下圖所示歼指,點【Configure Avatar】之后,可配置Mapping和Muscles甥雕。


image

2.2.2 配置Avatar

Avatar是Mecanim系統(tǒng)中極為重要的模塊踩身,因此為模型資源正確地設(shè)置Avatar也就變得至關(guān)重要。不管Avatar的自動創(chuàng)建是否成功社露,用戶都需要進入到Configure Avatar界面中去確認(rèn)Avatar的有效性挟阻,即確認(rèn)用戶提供的骨骼結(jié)構(gòu)與Mecanim預(yù)定義的骨骼結(jié)構(gòu)已經(jīng)正確匹配起來,并且模型已經(jīng)處于T形姿態(tài)峭弟。

  1) 實線圓圈:骨骼是必須匹配的

  2) 虛線圓圈:骨骼是可選匹配的
  可選匹配骨骼的運動會根據(jù)必須匹配骨骼的狀態(tài)來自動插值計算附鸽。為了方便Mecanim進行骨骼匹配,用戶提供的骨架中應(yīng)包含所有必須匹配的骨骼瞒瘸。為了提高匹配的幾率坷备,應(yīng)盡量通過骨骼代表的部位給骨骼命名(如:左手命名為LeftArm)。

  3) Avatar自動創(chuàng)建成功情臭,其界面如下:
image
  4) Avatar自動創(chuàng)建失敗省撑,其 界面如下:
image
 5) Avatar Configure Inspector (骨骼映射)
image
6) 如果auto-mapping(Mapping->Automap)部分或完全失敗,可以在Scene中拖動骨骼以進行分配谎柄。如果Mecanim認(rèn)為骨骼合理丁侄,則在Avatar Inspector中以綠色顯示惯雳,否則以紅色顯示朝巫。
image
7) 如果骨骼綁定正確,但是角色姿勢不對(不是標(biāo)準(zhǔn)的T形),在Scene中可看到消息“Character not in T-Pose”石景,解決此問題可通過Pose->Enforce T-Pose或旋轉(zhuǎn)其它的骨骼劈猿。 
image

2.2.3 肌肉設(shè)定

   1) Mecanim允許使用“肌肉”來控制不同骨骼的運動范圍。
   2) 當(dāng)Avatar被創(chuàng)建且被成功配置之后潮孽,Mecanim可理解骨骼結(jié)構(gòu)揪荣,且允許在Avatar Inspector的【Muscles】選項卡中調(diào)節(jié)相關(guān)參數(shù)。在此可以調(diào)整角色的運動范圍往史,以確保骨骼運動起來真實仗颈、自然。

       詳細使用方法參見:[http://www.unitymanual.com/thread-1211-1-1.html](http://www.unitymanual.com/thread-1211-1-1.html)

  3) 通過設(shè)置各個關(guān)節(jié)的旋轉(zhuǎn)范圍來控制不現(xiàn)骨骼的運動范圍。
image

2.3 Animator Controller

 負責(zé)定義使用哪些動畫素材挨决,以及何時请祖、如何播放(融合<blend>和過渡<transition>)這些動畫素材。

  Animator Controller以狀態(tài)機(State Machine)的方式維護一系列動畫脖祈,且當(dāng)隸屬的角色發(fā)生特定事件時肆捕,切換播放的動畫。

2.3.1 創(chuàng)建Animator Controller

  在Project窗口中盖高,創(chuàng)建Animator Controller慎陵,然后雙擊剛創(chuàng)建的Animator Controller可在Animator窗口中進行編輯。創(chuàng)建Animator Controller如下圖所示:
image

2.3.2 編輯Animator Controller

2.3.2.1 創(chuàng)建狀態(tài)節(jié)點

     把Animation Clip從Project窗口中拖到Animator窗口喻奥,則自動創(chuàng)建了一個對應(yīng)的狀態(tài)節(jié)點席纽,第一個拖入的Animation Clip為默認(rèn)狀態(tài)節(jié)點,如下圖所示:
image

2.3.2.2 設(shè)置狀態(tài)變換

    狀態(tài)變換:即從一個狀態(tài)變換到另一個狀態(tài)撞蚕,如從IdleShort狀態(tài)變換到Jump狀態(tài)胆筒。
2.3.2.2.1 角色自動運動
   **簡單且不用編程的狀態(tài)變換,程序不能控制**
image
    從一個狀態(tài)變換到另一個狀態(tài)的帶箭頭的線表示:這些箭頭線用于設(shè)置變換條件诈豌,如:在什么條件下才從IdleShort狀態(tài)變換到Jump狀態(tài)仆救。

   設(shè)置狀態(tài)變換時,先選中箭頭線矫渔,然后在Inspector中設(shè)置變換條件彤蔽,如下圖根據(jù)播放的百分比來設(shè)置變換條件。
image
   當(dāng)IdleShort狀態(tài)播放到90%時庙洼,則切換到Run狀態(tài)顿痪。

   設(shè)置完之后,關(guān)閉Animator窗口中油够。至此蚁袭,一個簡單的且不用編程的Animator Controller已經(jīng)設(shè)置完成。
2.3.2.2.2 程序控制角色運動

** 1. 創(chuàng)建混合樹**

   1) 若一個狀態(tài)節(jié)點支持多種運動(如:Run支持RunDirect石咬、RunLeft揩悄、RunRight),選中此節(jié)點點右鍵鬼悠,然后點【Create new BlendTree in State】删性,則此狀態(tài)節(jié)點的Motion為:**Blend Tree**
image
  2) 創(chuàng)建BlendTree之后,雙擊此狀態(tài)節(jié)點焕窝,則進入混合樹的編輯蹬挺。  
image
  1. 選中混合樹,在其Inspector面板中它掂,點按鈕【+】然后點【Add Motion Field】增加3個Motion巴帮,然后并設(shè)置對應(yīng)的Motion,其結(jié)果如下:
image
   **2\. 創(chuàng)建控制參數(shù)并設(shè)置變換條件**

   1) 創(chuàng)建控制參數(shù)
image
   2) 設(shè)置箭頭線變換條件

       首先選中箭頭線,然后設(shè)置此箭頭的變換條件榕茧。
image
  3) 設(shè)置混合樹變換條件
image
 Direction:

      -1: 播放動畫RunLeft

       0: 揪放動畫Run

       1:播放動畫RunRight

 Blend Type: 1D(表示一個參數(shù)控制混合樹的動畫播放) 

2.3.2.3 動畫合成

 比如角色一邊跑发乔,一邊揮劍,則需要把兩個動畫進行合成雪猪。要實現(xiàn)兩個動畫的合成栏尚,需要單獨創(chuàng)建一個動畫層。
image

Weight:動畫層的權(quán)重值

Mask: 本層的動作影響身體的哪一部分(遮罩)

  1. 創(chuàng)建Avatar Mask:在Project窗口中創(chuàng)建一個Avatar Mask

  2. 點擊不受影響的部位只恨,使之變紅译仗,如下圖只有右手的運動才參與計算,即只有右手的動作才發(fā)生作用官觅,從而達到屏蔽身體其它部位的目的纵菌,從而提高了效率(IK:表示把風(fēng)向動力學(xué))

image
  1. 把Avatar Mask應(yīng)用于特定的動畫層

  2. 在腳本中設(shè)置狀態(tài)變換條件,然后再把此腳本綁在角色身上休涤。

總結(jié):一個Animator Controller中可包含多個動畫層咱圆,每個動畫層按照其設(shè)定的狀態(tài)機單獨進行運行,然后根據(jù)其Weight把各動畫層進行合成功氨,后面的動畫層(除Base Layer)只顯示其Avatar Mask綠色的部分序苏。

2.3.3 應(yīng)用Animator Controller

    1) 在Hieratchy窗口中選擇需要Animator動畫的角色         

    2) 把Project中的Animator Controller資源拖到角色對象的Animator組件的Controller輸入框,或點旁邊的按鈕進行選擇

3. Animator重定向功能

    重定向功能:就是把應(yīng)用在一個角色上的動作應(yīng)用到另一個角色身上捷凄。

     即同一個Animator Controller可用于不同的Animators忱详。

4. Animator詳細參數(shù)

Animator詳細參數(shù)參見:[http://docs.unity3d.com/ScriptReference/Animator.html](http://docs.unity3d.com/ScriptReference/Animator.html)

http://edu.china.Unity3D.com/learning_document/getData?file=/Manual/MecanimAnimationSystem.html

5. 設(shè)置動畫狀態(tài)過渡代碼

設(shè)置動畫狀態(tài)過渡代碼例子(IdleRunJump.cs)如下:

[csharp] view plaincopy

<embed id="ZeroClipboardMovie_1" src="http://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=16&height=16" wmode="transparent" style="box-sizing: border-box; outline: 0px;">

[圖片上傳失敗...(image-5afd0c-1519718835744)]

  1. using UnityEngine;

  2. using System.Collections;

  3. public class IdleRunJump : MonoBehaviour {

  4. protected Animator animator;

  5. public float DirectionDampTime = .25f;

  6. public bool ApplyGravity = true;

  7. // Use this for initialization

  8. void Start ()

  9. {

  10. animator = GetComponent<Animator>();

  11. if(animator.layerCount >= 2)

  12. animator.SetLayerWeight(1, 1);

  13. }

  14. // Update is called once per frame

  15. void Update ()

  16. {

  17. if (animator)

  18. {

  19. AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);

  20. if (stateInfo.IsName("Base Layer.Run"))

  21. {

  22. if (Input.GetButton("Fire1")) animator.SetBool("Jump", true);

  23. }

  24. else

  25. {

  26. animator.SetBool("Jump", false);

  27. }

  28. if(Input.GetButtonDown("Fire2")&&animator.layerCount >= 2 )

  29. {

  30. animator.SetBool("Hi", !animator.GetBool("Hi"));

  31. }

  32. float h = Input.GetAxis("Horizontal");

  33. float v = Input.GetAxis("Vertical");

  34. animator.SetFloat("Speed", hh+vv);

  35. animator.SetFloat("Direction", h, DirectionDampTime, Time.deltaTime);

  36. }

  37. }

  38. }

6. 為Mecanim系統(tǒng)創(chuàng)建角色

為Mecanim系統(tǒng)創(chuàng)建角色主要包括以下三個階段:

1) 建模

     角色模型有合理的拓撲結(jié)構(gòu);模型導(dǎo)出設(shè)置跺涤;模型導(dǎo)入Unity3D匈睁;使角色處于T-Pose;去掉不需要的面桶错、頂點及隱藏的面航唆、頂點;

2) 骨骼設(shè)置

3) 蒙皮

     把多邊形的網(wǎng)格頂點綁定到骨骼上的過程院刁。

7. 肌肉設(shè)置與身體遮罩的區(qū)別

1) 肌肉設(shè)置:是對Avatar進行設(shè)置糯钙,所以它修改了Avatar的輸入設(shè)置,對所有動畫有效黎比。

2) 身體遮罩:是對動畫進行設(shè)置(每個Animation Clip有一個Body Mask)超营,只修改本動畫的屬性,即只對本動畫有效阅虫。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市不跟,隨后出現(xiàn)的幾起案子颓帝,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件购城,死亡現(xiàn)場離奇詭異吕座,居然都是意外死亡,警方通過查閱死者的電腦和手機瘪板,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門吴趴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人侮攀,你說我怎么就攤上這事锣枝。” “怎么了兰英?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵撇叁,是天一觀的道長。 經(jīng)常有香客問我畦贸,道長陨闹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任薄坏,我火速辦了婚禮趋厉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胶坠。我一直安慰自己觅廓,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布涵但。 她就那樣靜靜地躺著杈绸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪矮瘟。 梳的紋絲不亂的頭發(fā)上瞳脓,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音澈侠,去河邊找鬼劫侧。 笑死,一個胖子當(dāng)著我的面吹牛哨啃,可吹牛的內(nèi)容都是我干的烧栋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼拳球,長吁一口氣:“原來是場噩夢啊……” “哼审姓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起祝峻,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤魔吐,失蹤者是張志新(化名)和其女友劉穎扎筒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酬姆,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡嗜桌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了辞色。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骨宠。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡叶堆,死狀恐怖虐先,靈堂內(nèi)的尸體忽然破棺而出熊尉,到底是詐尸還是另有隱情浊洞,我是刑警寧澤洗鸵,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布幢痘,位于F島的核電站瀑踢,受9級特大地震影響辨宠,放射性物質(zhì)發(fā)生泄漏悯辙。R本人自食惡果不足惜琳省,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望躲撰。 院中可真熱鬧针贬,春花似錦、人聲如沸拢蛋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谆棱。三九已至快压,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間垃瞧,已是汗流浹背蔫劣。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留个从,地道東北人脉幢。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像嗦锐,于是被迫代替她去往敵國和親嫌松。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容