Animator基礎(chǔ)應(yīng)用

http://docs.unity3d.com/Manual/class-AnimatorController.html
官方文檔,簡(jiǎn)單的說(shuō),animator能控制和獲取動(dòng)畫(huà)信息

animator視圖.png

鼠標(biāo)右鍵點(diǎn)擊動(dòng)畫(huà),可以創(chuàng)建過(guò)度,并添加過(guò)渡條件
過(guò)渡條件為真的時(shí)候,動(dòng)畫(huà)將會(huì)過(guò)渡到另一個(gè)動(dòng)畫(huà)
unity為我們提供了4種類型的過(guò)渡條件
Int,整型
Float ,浮點(diǎn)
Trigger,觸發(fā)
Bool,布爾
就使用經(jīng)驗(yàn)來(lái)說(shuō),其中,Trigger用于單分支或者直接過(guò)度的動(dòng)畫(huà),例如,從Any State過(guò)渡到其他動(dòng)畫(huà),就需要用trigger,假如用bool類型,則會(huì)造成多次觸發(fā)
bool雙分支,Int多分支.float則更多的用于blend tree融合

過(guò)度條件.png

在過(guò)渡條件中,需要注意的是Has Exit time選項(xiàng),當(dāng)你勾上后,動(dòng)畫(huà)的normalizedTime就必須大于Exit time才會(huì)過(guò)度,例如,你把Exit time設(shè)置為2.5,則當(dāng)動(dòng)畫(huà)會(huì)播放三次后才會(huì)過(guò)度到下一個(gè)動(dòng)畫(huà).
我們可以改變?nèi)诤隙葋?lái)控制動(dòng)畫(huà)之間的融合,當(dāng)你看到動(dòng)畫(huà)過(guò)度不自然的時(shí)候,首先就需要檢查動(dòng)畫(huà)的融合問(wèn)題,差距過(guò)大的動(dòng)畫(huà),需要更長(zhǎng)的融合時(shí)間.
幾個(gè)重要的函數(shù):
anima.CrossFade("動(dòng)畫(huà)名字",0,0.2f);當(dāng)你不需要很精確的融合的時(shí)候,可以直接在代碼中設(shè)置過(guò)渡,而不需要在animator設(shè)置觸發(fā)條件.
anima.Play("child", 0, 0.2f);該函數(shù)有多個(gè)重載函數(shù),需要注意的是,Play函數(shù)是沒(méi)有融合的,動(dòng)畫(huà)會(huì)直接切換,所以一定不要在需要融合的動(dòng)畫(huà)里使用這個(gè)函數(shù)..Play函數(shù)可以直接控制動(dòng)畫(huà)的播放進(jìn)度,倒著播動(dòng)畫(huà),從中間直接開(kāi)始播等等..當(dāng)你需要?jiǎng)赢?huà)停住的時(shí)候,你需要每幀都去調(diào)用該函數(shù),一旦你停止調(diào)用,動(dòng)畫(huà)則會(huì)從你停止的地方播放繼續(xù)播放.
var animinfo = anima.GetCurrentAnimatorStateInfo(0);可以獲取動(dòng)畫(huà)的一些播放信息,例如,是否播放某個(gè)動(dòng)畫(huà),動(dòng)畫(huà)的播放進(jìn)度等等.需要注意的是,由于融合的問(wèn)題,獲取的信息往往不是那么精確.

StateMachineBehaviour

StateMachineBehaviour,附加在動(dòng)畫(huà)上的腳本,可以更精確的獲取動(dòng)畫(huà)之間的信息,例如,進(jìn)入該動(dòng)畫(huà)時(shí)候,退出該動(dòng)畫(huà)的時(shí)候等等.
值得注意的是,因?yàn)槿诤蠁?wèn)題,當(dāng)觸發(fā)一個(gè)過(guò)渡條件時(shí),會(huì)執(zhí)行下一個(gè)動(dòng)畫(huà)的OnStateEnter,過(guò)了融合時(shí)間后,才會(huì)執(zhí)行上一個(gè)動(dòng)畫(huà)的OnStateExit..而且,兩個(gè)動(dòng)畫(huà)的OnStateUpdate在融合時(shí)間內(nèi),是同時(shí)觸發(fā)的.

變身.png

可以看到,enter恢復(fù)是1.8秒觸發(fā)的,而exit變身則是2.38秒觸發(fā),該時(shí)間是和融合時(shí)間有關(guān)
由于此問(wèn)題,當(dāng)你在Any state再次進(jìn)入該狀態(tài)時(shí),可能會(huì)造成錯(cuò)誤的結(jié)果.例如,你有一個(gè)idle動(dòng)畫(huà),進(jìn)入時(shí)將一個(gè)bool變量設(shè)置為true,退出為false...當(dāng)前動(dòng)畫(huà)播放的是idle狀態(tài),而你又再次從Any state過(guò)度到idle狀態(tài),由于會(huì)先執(zhí)行OnStateEnter,再執(zhí)行OnStateExit,所以即使你正在播放idle動(dòng)畫(huà),你的bool變量也會(huì)是false.

虛擬點(diǎn)動(dòng)畫(huà):

虛擬點(diǎn)動(dòng)畫(huà).png

可以看出,虛擬點(diǎn)動(dòng)畫(huà)其實(shí)就是控制transfrom的移動(dòng)旋轉(zhuǎn)和大小的,所以,animator所在的物體的transfrom初始位置必須和動(dòng)畫(huà)的第一幀一樣..否則,動(dòng)畫(huà)會(huì)直接控制的物體的大小移動(dòng)和旋轉(zhuǎn),造成錯(cuò)誤的結(jié)果.你可以將animator組件的物體掛在某個(gè)物體下層級(jí)下.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容