轉(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組件如下圖所示:
Animator組件負責(zé)把動畫分配給GameObject硼莽。Animator包含以下兩個關(guān)鍵元素:
1) Animator Controller
2) Avatar (僅當(dāng)GameObject是人形角色時庶溶,才定義Avatar)
下圖示意:一個游戲?qū)ο蟮腁nimator組件如何把Animation Clips、Animator Controller和Avatar資源組合在一起懂鸵。
2.2 Avatar
創(chuàng)建動畫的一個基本步驟就是建立一個從**Mecanim系統(tǒng)的簡化人形骨架結(jié)構(gòu)**到**用戶實際提供的骨架結(jié)構(gòu)**的映射偏螺,這種映射關(guān)系稱為Avatar。
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】按鈕
2)點【Apply】之后,Mecanim嘗試把角色已經(jīng)存在骨骼結(jié)構(gòu)匹配到Avatar的骨骼結(jié)構(gòu)(在大部分情況下人柿,Mecanim能自動完成)柴墩,如果匹配成功,在【Configure】旁邊有一個“V”的符號凫岖,如下圖所示:
3)在成功匹配之后江咳,Avatar子資產(chǎn)被增加到模型資產(chǎn)的下面,其在Project窗口中如下圖所示:
4)選中Avatar子資產(chǎn)(如上圖中的EthanAvatar)哥放,Inspector窗口如下圖所示歼指,點【Configure Avatar】之后,可配置Mapping和Muscles甥雕。
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)建成功情臭,其界面如下:
4) Avatar自動創(chuàng)建失敗省撑,其 界面如下:
5) Avatar Configure Inspector (骨骼映射)
6) 如果auto-mapping(Mapping->Automap)部分或完全失敗,可以在Scene中拖動骨骼以進行分配谎柄。如果Mecanim認(rèn)為骨骼合理丁侄,則在Avatar Inspector中以綠色顯示惯雳,否則以紅色顯示朝巫。
7) 如果骨骼綁定正確,但是角色姿勢不對(不是標(biāo)準(zhǔn)的T形),在Scene中可看到消息“Character not in T-Pose”石景,解決此問題可通過Pose->Enforce T-Pose或旋轉(zhuǎn)其它的骨骼劈猿。
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)骨骼的運動范圍。
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如下圖所示:
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é)點,如下圖所示:
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)變換,程序不能控制**
從一個狀態(tài)變換到另一個狀態(tài)的帶箭頭的線表示:這些箭頭線用于設(shè)置變換條件诈豌,如:在什么條件下才從IdleShort狀態(tài)變換到Jump狀態(tài)仆救。
設(shè)置狀態(tài)變換時,先選中箭頭線矫渔,然后在Inspector中設(shè)置變換條件彤蔽,如下圖根據(jù)播放的百分比來設(shè)置變換條件。
當(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**
2) 創(chuàng)建BlendTree之后,雙擊此狀態(tài)節(jié)點焕窝,則進入混合樹的編輯蹬挺。
- 選中混合樹,在其Inspector面板中它掂,點按鈕【+】然后點【Add Motion Field】增加3個Motion巴帮,然后并設(shè)置對應(yīng)的Motion,其結(jié)果如下:
**2\. 創(chuàng)建控制參數(shù)并設(shè)置變換條件**
1) 創(chuàng)建控制參數(shù)
2) 設(shè)置箭頭線變換條件
首先選中箭頭線,然后設(shè)置此箭頭的變換條件榕茧。
3) 設(shè)置混合樹變換條件
Direction:
-1: 播放動畫RunLeft
0: 揪放動畫Run
1:播放動畫RunRight
Blend Type: 1D(表示一個參數(shù)控制混合樹的動畫播放)
2.3.2.3 動畫合成
比如角色一邊跑发乔,一邊揮劍,則需要把兩個動畫進行合成雪猪。要實現(xiàn)兩個動畫的合成栏尚,需要單獨創(chuàng)建一個動畫層。
Weight:動畫層的權(quán)重值
Mask: 本層的動作影響身體的哪一部分(遮罩)
創(chuàng)建Avatar Mask:在Project窗口中創(chuàng)建一個Avatar Mask
點擊不受影響的部位只恨,使之變紅译仗,如下圖只有右手的運動才參與計算,即只有右手的動作才發(fā)生作用官觅,從而達到屏蔽身體其它部位的目的纵菌,從而提高了效率(IK:表示把風(fēng)向動力學(xué))
把Avatar Mask應(yīng)用于特定的動畫層
在腳本中設(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)]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", hh+vv);
animator.SetFloat("Direction", h, DirectionDampTime, Time.deltaTime);
}
}
}
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)超营,只修改本動畫的屬性,即只對本動畫有效阅虫。