小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Unity3D之Mecanim動(dòng)畫系統(tǒng)學(xué)習(xí)筆記(八):Animator Layers(動(dòng)畫分層)

 勤奮不止 2019-06-24

解決什么問題?

動(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)畫播放的效果。

添加的腳本如下:

復(fù)制代碼
 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 }
復(fù)制代碼

接下來我們希望按下空格時(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:

好了,我們修改一下代碼試試看吧:

復(fù)制代碼
 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 }
復(fù)制代碼

運(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)畫混合方式:

  • Override:覆蓋,表示當(dāng)前層的動(dòng)畫會(huì)覆蓋掉其它層的動(dòng)畫,比如招手播放時(shí)右手就不能播放其它的動(dòng)畫了;
  • Additive:添加,表示當(dāng)前層的動(dòng)畫的量添加到其它層的動(dòng)畫,比如招手播放時(shí),手部奔跑或站立的甩動(dòng)也會(huì)保留;

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)詳解就不贅述。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多