Unity筆記——用代碼獲取Animator動(dòng)畫的移動(dòng)量
在Animator組件中,有一個(gè)?Apply Root Motion?選項(xiàng),勾上它以后,在播放動(dòng)畫時(shí),游戲?qū)ο缶蜁?huì)真的根據(jù)動(dòng)畫的移動(dòng)幅度來移動(dòng),動(dòng)畫一腳邁半米,Animator?所在的?gameObject?也會(huì)向前移動(dòng)半米。
聽起來似乎很美好,但是如果播放動(dòng)畫的對(duì)象是子物體,那么?Animator?也僅僅會(huì)驅(qū)動(dòng)子物體進(jìn)行移動(dòng),父物體則不會(huì)受到影響的停留在原地。
遇到這種情況,我們就需要通過代碼來獲取動(dòng)畫的移動(dòng)量,再把這個(gè)移動(dòng)量傳遞給父物體,驅(qū)動(dòng)父物體進(jìn)行移動(dòng)。
首先我們要再?Animator?所在的對(duì)象上新建一個(gè)腳本,命名為 RootMotionControl?,命名僅供參考,并聲明?OnAnimatorMove?函數(shù),它是MonoBehaviour?的生命周期函數(shù)之一,在處理完?duì)顟B(tài)機(jī)和動(dòng)畫后的每一幀中調(diào)用。

deltaPosition 表示這一幀動(dòng)畫移動(dòng)的量,再得到這個(gè)量以后,我們就可以向上傳遞,SendMessageUpwards?會(huì)向自己同級(jí)和自己父級(jí)的 MonoBehaviour?調(diào)用 OnUpdateRM 函數(shù),OnUpdateRM?可以根據(jù)自己的需求更改,第二個(gè)參數(shù)為 object 類型,對(duì)應(yīng)的我們的OnUpdateRM 函數(shù)的參數(shù)也要是object類型進(jìn)行接收。
SendMessageUpwards 函數(shù)會(huì)遍歷所有的父級(jí)對(duì)象,性能消耗比較大,這里推薦使用委托或者單例等方式進(jìn)行處理。
這是黑魂復(fù)刻中的代碼,CheckState?函數(shù)判斷了當(dāng)前是否處于?attack?動(dòng)畫層的?attack1hC動(dòng)畫,為?true?的時(shí)候就將移動(dòng)量記錄下來,并在?FixedUpdate?中處理移動(dòng)的時(shí)候進(jìn)行累加,在使用完后賦值為Vector3.zero進(jìn)行置空。
這樣,就可以在?Animator?沒有啟用 Root Motion是時(shí)候,讓角色也可以根據(jù)動(dòng)畫實(shí)際的移動(dòng)量來移動(dòng)。
參考視頻

參考文檔
Unity官方文檔