demo倉庫
https://github.com/wyy5552/lifecycle
前言
unity動畫根據使用方式划分,分為兩種:一種是Animation,一種是Animator。其中Animation可以實現一些基本的動畫操作,如果要制作復雜的,比如動畫有各種狀態切換,比如人型動畫,則需要使用Animator。
當然,Animator需要通過控制Animation來實現狀態管理。
一、簡單動畫Animation
我們來實現一個立方體在1s內運動的動畫。場景創建一個立方體,打開Animation窗口,通過windows/windows/Animation打開。


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


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


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


二、新版動畫
我們需要一個角色模型來介紹。並不是說只能用來控制角色,而是因為角色控制相對繁瑣,可以展示更多的Animator功能。
1. 導入模型
我們拷貝.fbx 模型到assets目錄。設置好材質。點擊fbx模型,在Inspector里面選擇Animation,將動畫根據類型進行划分。我們分割出來5個動畫:站立(idle),死亡(die),重生(reborn),跑步(run),射擊(fire)。


2. 設置狀態機
將模型拖入場景,創建Animator Controller,拖入到節點的組件上。


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


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


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,添加兩個。將run、fire拖入對應的框中。我們發現,在parameters里面多出一個參數blend,這個參數是用來設置混合位置的。我們可以拖動inspector里面的混合圖來進行設置。腳本同普通參數。


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


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


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


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


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


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
