1. 程式人生 > >遊戲製作之路(39)載入人形的動畫4

遊戲製作之路(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則可以設定為多個動畫的混合。多個動畫混合比較複雜,這裡就不再學習了,有興趣後面再自己學習。

https://blog.csdn.net/caimouse/article/details/51749579