Animator基礎應用

http://docs.unity3d.com/Manual/class-AnimatorController.html
官方文檔,簡單的說,animator能控制和獲取動畫信息

animator視圖.png

鼠標右鍵點擊動畫,可以創建過度,并添加過渡條件
過渡條件為真的時候,動畫將會過渡到另一個動畫
unity為我們提供了4種類型的過渡條件
Int,整型
Float ,浮點
Trigger,觸發
Bool,布爾
就使用經驗來說,其中,Trigger用于單分支或者直接過度的動畫,例如,從Any State過渡到其他動畫,就需要用trigger,假如用bool類型,則會造成多次觸發
bool雙分支,Int多分支.float則更多的用于blend tree融合

過度條件.png

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

StateMachineBehaviour

StateMachineBehaviour,附加在動畫上的腳本,可以更精確的獲取動畫之間的信息,例如,進入該動畫時候,退出該動畫的時候等等.
值得注意的是,因為融合問題,當觸發一個過渡條件時,會執行下一個動畫的OnStateEnter,過了融合時間后,才會執行上一個動畫的OnStateExit..而且,兩個動畫的OnStateUpdate在融合時間內,是同時觸發的.

變身.png

可以看到,enter恢復是1.8秒觸發的,而exit變身則是2.38秒觸發,該時間是和融合時間有關
由于此問題,當你在Any state再次進入該狀態時,可能會造成錯誤的結果.例如,你有一個idle動畫,進入時將一個bool變量設置為true,退出為false...當前動畫播放的是idle狀態,而你又再次從Any state過度到idle狀態,由于會先執行OnStateEnter,再執行OnStateExit,所以即使你正在播放idle動畫,你的bool變量也會是false.

虛擬點動畫:

虛擬點動畫.png

可以看出,虛擬點動畫其實就是控制transfrom的移動旋轉和大小的,所以,animator所在的物體的transfrom初始位置必須和動畫的第一幀一樣..否則,動畫會直接控制的物體的大小移動和旋轉,造成錯誤的結果.你可以將animator組件的物體掛在某個物體下層級下.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容