遊戲製作之路(39)載入人形的動畫4
在前面只是實現不同動畫之間進行無條件地轉換執行,其實在遊戲裡,經常要切換動畫執行的,比如讓一個角色行走時播放的動畫是行走的動畫,如果角色要跳起來,播放的動畫是跳動的動畫,如果角色轉身時,應該播放轉身的動畫。現在所有的動畫都放到動畫編輯器裡了,如果想要動畫在狀態之間有條件地進行切換,就需要增加切換條件引數,這樣才可以在腳本里設定觸發條件。怎麼樣來新增觸發切換狀態的條件呢?下面就來解決這個問題。先要在動畫編輯器裡新增條件引數,如下圖:
在這裡點選Parameters選項面,然後出現新增狀態轉換引數,再點選下面的加號,就可以新增條件引數,如下圖新增一個引數從空閒切換到跳動:
點選加號之後,會彈出一個選單,這個選單裡有幾種資料型別,在這裡選擇Bool型別,就可以新增像C處這樣的引數,把這個引數的名稱改為Standing_Jump,當設定為true表示從空閒切換到跳動,設定false時從跳動狀態切換到空閒狀態,如下圖:
在這裡,這個引數預設是false狀態,因為後面那個選擇框並沒有勾選。
接著下來要把這個引數關聯到切換連線線裡,如下圖:
在這裡選中空閒到跳轉的連線線,然後在右邊看到條件新增列表地方,在那裡點選加號,就可以把這個條件變數新增到狀態裡了,如下圖:
從上圖可以看到新增Standing_Jump,後面的true就是表示在程式碼設定為true時就可以播放跳動動畫。同理,也可以設定相反的狀態切換,點選從跳動到空閒的連線線,設定如下圖:
這裡設定狀態為false從跳動切換到空閒狀態。
通過上面幾步的設定,就把動態的狀態條件建立完成了,下一步就是建立指令碼程式碼,編寫相應的控制程式碼了。接著來建立一個指令碼youCond.cs來繫結you這個物件,如下圖:
點選A處的按鈕,就可以新增指令碼,把指令碼命名為上面的名稱。就可以開啟指令碼進行編輯,在裡面新增下面的程式碼:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class YouCond : MonoBehaviour { private Animator anim; private AnimatorStateInfo currentBaseState; private float timeCount = 0.0f; static int idleState = Animator.StringToHash("Base Layer.standing_idle"); static int jumpState = Animator.StringToHash("Base Layer.Standing_Jump"); // Use this for initialization void Start () { anim = GetComponent<Animator>(); timeCount = 0; } // Update is called once per frame void Update () { currentBaseState = anim.GetCurrentAnimatorStateInfo(0); if (currentBaseState.fullPathHash == idleState) { if (Input.GetButtonUp("Jump")) { anim.SetBool("Standing_Jump", true); Debug.Log("Jump"); timeCount = 0; } } else if (currentBaseState.fullPathHash == jumpState) { Debug.Log("Jump......"); timeCount += Time.deltaTime; if (timeCount > 5.0f) { anim.SetBool("Standing_Jump", false); } } } }
在這段程式碼裡,主要使用Animator物件和AnimatorStateInfo物件,並且使用Animator.StringToHash()函式來計算指定動畫的名稱,這樣計算出來的動畫就是一串數字,可以大大地提高比較的速度,比字串比較要快很多。同理,訪問currentBaseState.fullPathHash也是為了更快的速度。
到這裡,已經把人形動畫學習完成了,也可以通過指令碼進行觸發指定的動畫了。但還一個更復雜的動畫Blend Tree,唯一的區別就是Montion指向的型別變成了Blend Tree型別,那麼一個Blend Tree其實也就是一個狀態,和狀態不同的地方就是一個狀態只能設定一個動畫,而一個Blend Tree則可以設定為多個動畫的混合。多個動畫混合比較複雜,這裡就不再學習了,有興趣後面再自己學習。