解決什么問題?
動畫分層可以用來解決什么樣的問題呢?試想一下如果你要開發一款第三人稱的射擊游戲,那么肯定是希望身體的動畫分為上下兩部分,上方根據瞄准的位置和是否射擊進行動畫播放,下方根據移動播放動畫。最好的例子就是Unity4.x自帶的示例AngryBots了。
Avatar Mask
下面我們就使用Avatar Mask來實現人物在奔跑中招手的效果。
我們先添加一個人物到場景,同時為其添加一個Animator Controller並設定好跳轉條件,如下:
接下來我們添加下面的腳本來控制動畫的播放,對了為了不讓角色因為播放動畫而移動,記得把“Apply Root Motion”取消,方便我們查看動畫播放的效果。
添加的腳本如下:
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 }
接下來我們希望按下空格時人物播放招手動畫,但是跑動跳躍的動畫不能停止播放。
我們需要添加一個新的Layer來管理招手動畫的播放:
同時我們要配置好招手動畫,這里的Idle可以不添加任何動畫,僅僅表示空就可以了,同時還添加了一個Trigger“wave”表示進入招手動畫的條件。
接下來我們設置一下該層,將其權重設置為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 }
運行一下,發現當播放招手動畫時其它動畫都會停止,該怎么辦呢?
答案是我們需要創建一個Avatar Mask來表示我們只希望播放動畫的部分,即手部動畫播放,其它部分不播放,在Project窗口右擊創建一個Avatar Mask文件:
將右手部分以外的區別關閉即可:
這里說一個Transform這個選項,該選項是控制每個骨骼是否參與動畫使用的,如果我們的人物有翅膀和尾巴之類的東西就要使用它了。
最后一步我們將這個Avatar Mask拖入Animator Controller的Wave層中即可:
再次運行下游戲,我們需要的效果是不是已經出來了呢。
設置解說
下面我們來詳解一下Layer面板的設置:
Weight
動畫層的權重,默認的Base Layer必須為1。如果設置為0則當前層的動畫不會播放,1則會播放,0-1之間會采用類似融合的情況來播放動畫,比如之前的招手的例子,如果設置為0.5則招手動畫播放時手部只會抬到脖子附近。
Mask
動畫遮罩,上方已經詳解就不贅述。
Blending
動畫混合方式:
- Override:覆蓋,表示當前層的動畫會覆蓋掉其它層的動畫,比如招手播放時右手就不能播放其它的動畫了;
- Additive:添加,表示當前層的動畫的量添加到其它層的動畫,比如招手播放時,手部奔跑或站立的甩動也會保留;
Sync
開啟了該功能后會多出一些選項,如下:
我們可以將該功能看做復制的功能。
Source Layer:指定當前層是哪個層的副本,設定后當前層的狀態會和指定層完全一致或完全同步,但是我們可以修改某一個狀態的動畫。
該功能提供的效果就是兩個狀態一致的層可以做出一些不同的調整。
Timing:當前層和Souurce層同一個狀態使用的動畫時間長度不一致時,不勾選復制的層按Source層的時間播放(效果就是復制層動畫可能會變快或變慢,Source層動畫播放速度不變),勾選則Source層按復制層的時間播放(效果就是Source層動畫可能會變快或變慢,復制層動畫播放速度不變)。
IK Pass
表示啟動IK動畫,上一篇文章已經詳解就不贅述。