使用Unity的動畫事件時需要注意的“坑”
阿新 • • 發佈:2022-03-18
使用程式碼對 AnimationClip動態新增事件時,常常會使用下面的手段
AnimationClip[] clips = animator.runtimeAnimatorController.animationClips; for (int i = 0; i < clips.Length; i++) { AnimationEvent e = new AnimationEvent { functionName = “OnEnterAnimation”, time = 0, }; clips[i].AddEvent(e); } animator.Rebind();
這樣,在每次進入動畫 即呼叫OnEnterAnimation時,就可以更新與儲存 當前與上一個動畫狀態
如:
public void OnEnterAnimation() { StateInfo = Animator.GetCurrentAnimatorStateInfo(0); HashLast = HashCurrent; HashCurrent = StateInfo.shortNameHash; OnLeaveAnimation(HashLast); OnEnterAnimation(HashCurrent); } public void OnLeaveAnimation(inthash) { print("離開動畫 " + hash); } public void OnEnterAnimation(int hash) { print("進入動畫 " + hash); }
這樣就可以方便地使用 OnLeaveAnimation(int hash)和OnEnterAnimation(int hash) 做一些事情,呼叫事件之類的。
但是這裡有一個坑,如果動畫的LoopTime是打勾的,也就是該動畫是迴圈的,那麼有可能在離開動畫的時候又會呼叫一次進入動畫。
這裡的問題在於我們在繫結事件的時候指定的呼叫時間是0,也就是在一進入動畫就呼叫事件,而具體的問題應該又與Unity動畫事件的底層實現有關。
這個Bug改了幾個小時,一直以為是程式碼的問題,可是怎麼查都查不出來,後面也有想過可能是時間是0的問題,所以把時間改成過0.02f,但是仍然會呼叫兩次。也不知怎麼的突然想到會不會是LoopTime的問題,後面把時間改成0.5f又不會出現這個問題,取消勾選才發現果然是它。
發一篇文章,希望大家不要再踩我踩過的坑。