標籤:
遊戲中,我們的人物在某些時候,可能在一個時間點在做兩件事,這樣就需要同時播放兩個動畫,但我們肯定不能簡單將其疊加,比如移動著開槍、攻擊、揮手等等,那麼在Unity中我們應該怎樣實現這樣的功能呢?且聽我一一道來。
現在我們要做一個移動中揮手的動畫效果,當然,你也可以做成射擊等,根據這個你得準備相應的動畫片斷哦。
上次動畫融合樹的工程還在吧?我們在此基礎上,加上按下V鍵揮手的效果。
首先開啟主角的動畫狀態機器,在基本層BaseLayer下面添加一個層,取名叫做Wave吧,然後將層的權重Weight設定為1。
之後我們需要為下面的Mask屬性建立一個Avatar Mask,建立方法是在Project面板中右鍵選擇Create選項卡下的AvatarMask,我們給它命名為WaveMask,選中它,在Inspector面板下,點擊Humanoid倒三角,開啟遮罩狀態,可以看到我們的小人兒預設是全綠的,也就是沒有遮罩,這裡,我們只需要留下揮手動作(我的動作只需要右手),因此點擊小人兒身上需要遮住的部分如:
現在有了Mask,我們可以繼續剛才的操作了,在動畫層Wave中,將動畫遮罩屬性Mask指向我們剛才建立的AvatarMask。
遮罩層建好了,首先添加一個Trigger參數Wave,之後再添加動畫狀態,在Wave層下添加一個空狀態並設定為預設狀態,然後再把我們的揮手動畫狀態添加進來,設定預設狀態到Wave狀態過渡條件為Wave,Wave狀態到預設狀態為無條件。
最後打來我們之前的DearMove指令碼,稍微加點料:
1 using UnityEngine; 2 using System.Collections; 3 4 public class DearMove : MonoBehaviour 5 { 6 private Animator anim; //動畫狀態機器 7 private int RunFloat; //Run參數ID 8 private int WaveTrigger; //Wave參數ID 9 private float vertical; //前進10 11 void Awake ()12 {13 anim = gameObject.GetComponent<Animator>();14 RunFloat = Animator.StringToHash("Run");15 WaveTrigger = Animator.StringToHash("Wave");16 }17 18 void Update ()19 {20 //來電者向控制21 vertical = Input.GetAxis("Vertical");22 //根據前進控制,設定Run參數的值,23 //後面兩個參數可不加,這裡是為了讓從走到跑看得更明顯24 anim.SetFloat(RunFloat, vertical, 1f, Time.deltaTime);25 26 if (Input.GetKeyDown(KeyCode.V))27 {28 Debug.Log("wave");29 anim.SetTrigger(WaveTrigger);30 }31 }32 }
運行遊戲,先讓角色跑起來,然後按 V 鍵,我們的主角邊跑邊向我們揮手了哦!
AnimatorController動畫遮罩