Unity3D之Mecanim動畫系統學習筆記(八):Animator Layers(動畫分層)


解決什么問題?

動畫分層可以用來解決什么樣的問題呢?試想一下如果你要開發一款第三人稱的射擊游戲,那么肯定是希望身體的動畫分為上下兩部分,上方根據瞄准的位置和是否射擊進行動畫播放,下方根據移動播放動畫。最好的例子就是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動畫,上一篇文章已經詳解就不贅述。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM