unity 動畫系統簡單教程


demo倉庫

https://github.com/wyy5552/lifecycle

前言


unity動畫根據使用方式划分,分為兩種:一種是Animation,一種是Animator。其中Animation可以實現一些基本的動畫操作,如果要制作復雜的,比如動畫有各種狀態切換,比如人型動畫,則需要使用Animator。
當然,Animator需要通過控制Animation來實現狀態管理。

一、簡單動畫Animation


我們來實現一個立方體在1s內運動的動畫。場景創建一個立方體,打開Animation窗口,通過windows/windows/Animation打開。

image

不要直接點擊Create按鈕,如果點擊后,則會通過Animator來管理。

選中立方體,在Inspector界面添加組件Animation,然后點擊Animation窗口里面的Create按鈕,會單獨創建一個影片,保存。(記得場景樹要選中需要被編輯的節點)

image

1. 手動設置關鍵幀

點擊AddProperty,選擇Position,默認會生成兩個關鍵幀0s && 60s位置。默認0s處,選中60s處,設置位置。點擊播放,則可以看到移動的動畫。
image

2. 錄制

點擊紅色按鈕,開始錄制。拖動游標到動畫結束的時間,設置結束時候的位置。

image

二、新版動畫

我們需要一個角色模型來介紹。並不是說只能用來控制角色,而是因為角色控制相對繁瑣,可以展示更多的Animator功能。

1. 導入模型

我們拷貝.fbx 模型到assets目錄。設置好材質。點擊fbx模型,在Inspector里面選擇Animation,將動畫根據類型進行划分。我們分割出來5個動畫:站立(idle),死亡(die),重生(reborn),跑步(run),射擊(fire)。

image

2. 設置狀態機

將模型拖入場景,創建Animator Controller,拖入到節點的組件上。

image

雙擊創建的控制器組件,進入狀態機編輯。展開模型,拖動idle動畫到animator面板,默認會創建一個狀態轉移,從Entryidle。點擊播放按鈕,場景角色循環播放待機狀態。默認也有一個Base Layer的層。

image

我們繼續完善狀態機。然后編寫腳本,實現:場景初始狀態角色待機,1s后進入射擊狀態,當射擊結束后,返回待機狀態。

image

public class PlayerFsm : MonoBehaviour
{
    public Animator ani;

    void Start()
    {
        this.Invoke("changeState", 1);
    }

    void changeState()
    {
        ani.SetInteger("player_state", (int)Player_State_Trans.ToFire);
    }
    // Update is called once per frame
    void Update()
    {
        AnimatorStateInfo info = ani.GetCurrentAnimatorStateInfo(0);
        if(info.normalizedTime>=1.0f && info.IsName(Player_State.fire))
        {
            Debug.Log(info.normalizedTime);
            ani.SetInteger("player_state", (int)Player_State_Trans.ToIdle);
        }
    }
}

添加腳本到角色節點身上。點擊播放,則角色按照我們的預期執行。

注意 transition上面的has exit time參數,如果勾選,則在狀態轉換的時候會增加一個延遲時間。

3. blendTree

如果我們需要一個混合的狀態,比如邊跑邊射擊,則需要新增一個blend tree。編輯器窗口創建,雙擊進入編輯模式。選擇節點,然后右鍵add motion,添加兩個。將runfire拖入對應的框中。我們發現,在parameters里面多出一個參數blend,這個參數是用來設置混合位置的。我們可以拖動inspector里面的混合圖來進行設置。腳本同普通參數。

image

我們可以測試一下效果。

4. layer

新建一個layer,我們拖一個fire上去,讓其循環播放,方便觀察。運行游戲。發現生成的效果與我們做的blend tree類似。
BaseLayer默認run,New Layer默認fire

image

5. Avatar Mask

我們發現,通過上面的設置,一邊跑動,一邊射擊,模型狀態非常不自然。是因為射擊的時候,腳的運動是跑動,受到射擊的影響。
此時有個問題,如果直接導入模型,並沒有人型狀態。需要我們設置一下模型。

image

新建一個avatar mask,添加給New Layer


image

雙擊mask文件,進入編輯。綠色身體表示當前層級能夠影響。點擊任意部位,紅色表示不影響當前部位。

image

觀察新的動畫樣式,邊跑邊射擊看起來就非常自然了。

image

6. 腳本

點擊Layer,點擊Add behaviour,可以新增 狀態機的腳本。也可以點擊狀態,同樣有Add behaviour按鈕。兩者生命周期有些區別。注意區分。

后記

通過層層嘗試,我們大致了解了unity動畫系統的使用。當然,真實做項目的時候復雜程度要遠遠高於本Demo

參考列表:
unity】角色動畫的 Has Exit Time是什么?什么時候需要打鈎?
https://blog.csdn.net/weixin_37749732/article/details/121979165
Unity Animator Layer動畫分層
https://www.jianshu.com/p/9a90496764b6
unity Animator 怎么判斷一個動畫播放結束
https://blog.csdn.net/tomato00001/article/details/78427538
Unity動畫系統詳解3:如何播放、切換動畫?
https://blog.csdn.net/zhenghongzhi6/article/details/106459895
Unity 動畫系統 Animation 和 Animator 聯系與區別
https://www.cnblogs.com/01zxs/p/9965115.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM