解決什么問題?動(dòng)畫分層可以用來解決什么樣的問題呢?試想一下如果你要開發(fā)一款第三人稱的射擊游戲,那么肯定是希望身體的動(dòng)畫分為上下兩部分,上方根據(jù)瞄準(zhǔn)的位置和是否射擊進(jìn)行動(dòng)畫播放,下方根據(jù)移動(dòng)播放動(dòng)畫。最好的例子就是Unity4.x自帶的示例AngryBots了。 Avatar Mask下面我們就使用Avatar Mask來實(shí)現(xiàn)人物在奔跑中招手的效果。 我們先添加一個(gè)人物到場(chǎng)景,同時(shí)為其添加一個(gè)Animator Controller并設(shè)定好跳轉(zhuǎn)條件,如下: 接下來我們添加下面的腳本來控制動(dòng)畫的播放,對(duì)了為了不讓角色因?yàn)椴シ艅?dòng)畫而移動(dòng),記得把“Apply Root Motion”取消,方便我們查看動(dòng)畫播放的效果。 添加的腳本如下: 1 using UnityEngine; 2 using System.Collections; 3 4 public class MaskTest : MonoBehaviour 5 { 6 private Animator _animator; 7 8 void Start() 9 { 10 _animator = this.GetComponent<Animator>(); 11 } 12 13 void Update() 14 { 15 if(Input.GetKeyDown(KeyCode.R)) 16 { 17 _animator.SetBool("run", true); 18 } 19 if(Input.GetKeyUp(KeyCode.R)) 20 { 21 _animator.SetBool("run", false); 22 } 23 24 AnimatorStateInfo state = _animator.GetCurrentAnimatorStateInfo(0); 25 if(state.shortNameHash == Animator.StringToHash("Run") && Input.GetKeyDown(KeyCode.J)) 26 { 27 _animator.SetTrigger("jump"); 28 } 29 } 30 } 接下來我們希望按下空格時(shí)人物播放招手動(dòng)畫,但是跑動(dòng)跳躍的動(dòng)畫不能停止播放。 我們需要添加一個(gè)新的Layer來管理招手動(dòng)畫的播放: 同時(shí)我們要配置好招手動(dòng)畫,這里的Idle可以不添加任何動(dòng)畫,僅僅表示空就可以了,同時(shí)還添加了一個(gè)Trigger“wave”表示進(jìn)入招手動(dòng)畫的條件。 接下來我們?cè)O(shè)置一下該層,將其權(quán)重設(shè)置為1: 好了,我們修改一下代碼試試看吧: 1 using UnityEngine; 2 using System.Collections; 3 4 public class MaskTest : MonoBehaviour 5 { 6 private Animator _animator; 7 8 void Start() 9 { 10 _animator = this.GetComponent<Animator>(); 11 } 12 13 void Update() 14 { 15 if(Input.GetKeyDown(KeyCode.R)) 16 { 17 _animator.SetBool("run", true); 18 } 19 if(Input.GetKeyUp(KeyCode.R)) 20 { 21 _animator.SetBool("run", false); 22 } 23 24 AnimatorStateInfo state = _animator.GetCurrentAnimatorStateInfo(0); 25 if(state.shortNameHash == Animator.StringToHash("Run") && Input.GetKeyDown(KeyCode.J)) 26 { 27 _animator.SetTrigger("jump"); 28 } 29 30 if(Input.GetKeyDown(KeyCode.Space)) 31 { 32 _animator.SetTrigger("wave"); 33 } 34 } 35 } 運(yùn)行一下,發(fā)現(xiàn)當(dāng)播放招手動(dòng)畫時(shí)其它動(dòng)畫都會(huì)停止,該怎么辦呢? 答案是我們需要?jiǎng)?chuàng)建一個(gè)Avatar Mask來表示我們只希望播放動(dòng)畫的部分,即手部動(dòng)畫播放,其它部分不播放,在Project窗口右擊創(chuàng)建一個(gè)Avatar Mask文件: 將右手部分以外的區(qū)別關(guān)閉即可: 這里說一個(gè)Transform這個(gè)選項(xiàng),該選項(xiàng)是控制每個(gè)骨骼是否參與動(dòng)畫使用的,如果我們的人物有翅膀和尾巴之類的東西就要使用它了。 最后一步我們將這個(gè)Avatar Mask拖入Animator Controller的Wave層中即可: 再次運(yùn)行下游戲,我們需要的效果是不是已經(jīng)出來了呢。 設(shè)置解說下面我們來詳解一下Layer面板的設(shè)置: Weight動(dòng)畫層的權(quán)重,默認(rèn)的Base Layer必須為1。如果設(shè)置為0則當(dāng)前層的動(dòng)畫不會(huì)播放,1則會(huì)播放,0-1之間會(huì)采用類似融合的情況來播放動(dòng)畫,比如之前的招手的例子,如果設(shè)置為0.5則招手動(dòng)畫播放時(shí)手部只會(huì)抬到脖子附近。 Mask動(dòng)畫遮罩,上方已經(jīng)詳解就不贅述。 Blending動(dòng)畫混合方式:
Sync開啟了該功能后會(huì)多出一些選項(xiàng),如下: 我們可以將該功能看做復(fù)制的功能。 Source Layer:指定當(dāng)前層是哪個(gè)層的副本,設(shè)定后當(dāng)前層的狀態(tài)會(huì)和指定層完全一致或完全同步,但是我們可以修改某一個(gè)狀態(tài)的動(dòng)畫。 該功能提供的效果就是兩個(gè)狀態(tài)一致的層可以做出一些不同的調(diào)整。 Timing:當(dāng)前層和Souurce層同一個(gè)狀態(tài)使用的動(dòng)畫時(shí)間長(zhǎng)度不一致時(shí),不勾選復(fù)制的層按Source層的時(shí)間播放(效果就是復(fù)制層動(dòng)畫可能會(huì)變快或變慢,Source層動(dòng)畫播放速度不變),勾選則Source層按復(fù)制層的時(shí)間播放(效果就是Source層動(dòng)畫可能會(huì)變快或變慢,復(fù)制層動(dòng)畫播放速度不變)。 IK Pass表示啟動(dòng)IK動(dòng)畫,上一篇文章已經(jīng)詳解就不贅述。 |
|