1. 程式人生 > >【Unity3D遊戲開發學習筆記】(四)一切都動起來—Animator元件的應用

【Unity3D遊戲開發學習筆記】(四)一切都動起來—Animator元件的應用

一、Animation簡介

動畫原本是指由許多連續的圖片在人眼前面快速播放,肉眼因視覺殘像產生錯覺,而誤以為畫面活動的作品。 但在 Unity3D 中的“ Animation”【動畫】 系統應該這樣理解——用於為遊戲者自動播放人物動作或自動演示物體運動路徑、色澤、尺寸變化,以及事件觸發的整合元件。
我們可以先看一個例項感受一下:

上一節我們知道怎麼建造一個地形,新增系統的playercontroller資源,現在我們先簡單的建一個地形出來,匯入StandardAsset的the third player controller,如下圖:

這裡寫圖片描述

剛匯入的第三人稱控制器的時候,有些同學可能會遇到動畫丟失的問題,如圖找到
這裡寫圖片描述


將資原始檔夾中對應的Animation檔案拖進指令碼即可,然後運行遊戲,可以看到小人會隨之運動起來。

二、Mecanim動畫系統

Mecanim動畫系統是Unity3D推出的全新的動畫系統,具有重定向、可融合等諸多新特性,新增了狀態機等概念。首先我們要了解Mecanim系統,必須先要對以下的概念有所瞭解:

1、Animation檔案

在 Unity3D 中的 Animation 檔案是用來記錄物體運動資訊的檔案,你可以用滑鼠右鍵點選“Project”【 專案檔案欄】 ——>“Create” ——>“Animation” 來建立一個 Animation檔案,建立好之後的檔案為一個時鐘的小圖示 。 除此而外,你匯入的模型檔案如果帶有動畫資訊, Unity3D 也會將這些動畫資訊自動的分離為 Animation 檔案。
最簡單的使用Animation的方法就是,將這個Animation拖至你需要動畫的Gameobject當中,然後選擇該GameObject,按下ctrl + 6,彈出Animation視窗,在時間軸中右鍵插入關鍵幀,然後再在關鍵幀中對GameObject的一些屬性變化進行自己的編輯即可。

2、Avatar

Avatar,即阿凡達,這是Mecanim動畫系統中實現動畫繫結的一個介面,該介面可以實現骨骼和肌肉系統的匹配,從而保證角色在執行動畫的時候,角色能夠按照預先設定的動畫來運動。首先我們先匯入一個模型資源,筆者在這裡用的是Asset Store裡面的Robot Kyle的資源包,具體匯入方式:登陸Asset Store下載,選擇在Unity中開啟即可自動匯入,下載完的Package一般存放於C:/Users/XXX/AppData/Roaming/Unity/Asset Store/Unity Technologies/目錄中。
好了,不說這麼多,我們先來看看我們匯入的模型吧
這裡寫圖片描述
箭頭1指向的是我們在Project面板中的模型資源,我們選中它,在Inspector面板中可以看到有三個選項卡:Model , Rig, Animations(箭頭2所示),點選Rig選項卡,將Animation Type設為Humanoid,即雙足型別的動畫。這種型別可以支援大多數的類人形的模型。此外,Lagacy型別用來相容Unity3D低版本中的模型動畫,Generic型別是一種介於人形和非人形的模型之間的通用型別。我們選擇Humanoid型別後,在下方選擇生成Avater的型別誒Create Form This Model,即通過當前的模型來生成一個Avater(箭頭3指向)

在生成了Avatar之後,我們可以通過點選Configure進行編輯和檢視骨骼繫結是否正確,也可以切換到Muscles選項卡中,這是我們可以通過拖動滑塊來檢查模型匹配是否正確。在這個案例中,我們匯入的模型骨架沒有任何的問題,所以直接按下Done完成確認即可。
這裡寫圖片描述

3、AnimatorController

在瞭解和繫結好了Avatar之後,我們就進入了Mecanim的核心元件的學習:AnimatorController。
如果說Avater是將模型的身體和骨骼實現匹配的介面,那麼AnimatorController就是將動畫和模型實現繫結的介面。我們這裡建立一個RobotAnimatorController。雙擊該檔案,會開啟Animator視窗,如下圖
這裡寫圖片描述

這裡會涉及到一個概念:States(動畫狀態),其實這也就是一個有限狀態機,在進入每一個State之前,會有一個判斷條件是否進入,當判斷條件達到,則滿足該狀態,進行該狀態的動畫播放。關於有限狀態機的內容,筆者不打算在這細說,大家只需簡單的理解以下的情況就好:
Entry(Animator入口)—>DefaultState(預設狀態)—>Next State(滿足條件的下一個狀態)—>Exit(離開狀態)

下面我們就來學習一下該怎麼使用這個Animator。

我們看到上圖,上面標誌有三個State(事實上有四個,還有一個Exit沒有截出來),其中,Idle是我們自己新建的一個State,設定成DefaultState,代表在正常狀態下是執行這個State的動畫,在Entry狀態上右鍵,選擇make Transition,並連線到Idle狀態。然後我們點選Idle狀態,在Inspector面板中的motion中進行動畫的繫結(下面會說明簡單的Animation如何製作,現在我們用的是Asset Store裡面的資源,筆者用的是Mixamo,一個免費的動作資源包,裡面的動作還是挺好的)選中其中的一個Idle動畫進行繫結,在繫結完了動畫之後,我們回到Scene面板,選中需要新增動作的Object,在Inspector面板中,點選AddComponent—>Animator,然後把我們的RobotAnimatorController賦值給相應的屬性即可,如下圖:

這裡寫圖片描述

現在,我們來運行遊戲看看吧!!我們可以看到,Robot君已經在悠閒的晃悠起來了!

這裡寫圖片描述

這裡寫圖片描述

好不容易終於把這個懶惰的Robot給動起來了,那麼我們就不能讓他這麼輕鬆,我們得想辦法讓這個懶鬼跑起來,甩起來!(Robot君:我…^%&…&*,能不能讓我安靜的當一個美男子→_→)
我們接下來,跟上面的步驟一樣,在Animator的介面,新建兩個State並繫結上動畫,然後將他們跟Idle連線起來,如下面所示:

這裡寫圖片描述

接下來,我們給這個Animator新增一個狀態字,如上圖箭頭所示,新增一個Int型別的狀態字,並命名為ActionID,預設值為0。然後,我們選中其中一個Transition,就拿Idle->Walk_Front 這個Transition為例吧,我們選中它,然後再在Inspector裡面看到,在Condition中,我們往上面新增一個判斷條件,引數為ActionID,行為是Equals ,值為1,意思是,噹噹前Animator的ActionID這個值為1的時候,Animator就會執行Idle->Walk_Front這個狀態,停止Idle的播放,改為播放Walk_Front。(這裡有個主意的地方,如果你勾選了Has Exit Time ,那麼你在轉換動畫的時候就會有一定的延遲播放,這個就看各人需要了)
Animator的設定我們已經設定好了,那麼我們又怎樣在遊戲當中改變它的動作呢?請看下面的程式碼(具體的程式碼這一節不會多說,之後講到相關api程式設計的時候再進行提及)

我們新建一個C#Script ,然後將下面程式碼複製上,賦給 Robot物件,按下相應的按鍵即可看見效果,程式碼都比較簡單,就是獲取按下的鍵,然後改變Animator裡面ActionId的值,相信大家都應該沒什麼大的理解問題。

using UnityEngine;
using System.Collections;

public class Animation : MonoBehaviour {

    private Animator m_Animator = null;

    // Use this for initialization
    void Start () 
    {
        m_Animator = GetComponent<Animator>();//獲取當前物件的Animator
    }

    // Update is called once per frame
    void Update () 
    {
        if (Input.GetKeyDown(KeyCode.W))
            m_Animator.SetInteger("ActionID", 1);
        if (Input.GetKeyDown(KeyCode.K))
            m_Animator.SetInteger("ActionID", 2);

        if (Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp(KeyCode.K))
            m_Animator.SetInteger("ActionID", 0);
    }
}

下面我們來看看效果:
這裡寫圖片描述 這裡寫圖片描述

唉,Unity的動畫系統還是很強大的,筆者這裡提及的都是很基礎的,更多的東西還是需要各位去探索和運用,哪位小夥伴用的好的來教教我_(:з」∠)