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