1. 程式人生 > 其它 >使用Unity的動畫事件時需要注意的“坑”

使用Unity的動畫事件時需要注意的“坑”

使用程式碼對 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(int
hash) {   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又不會出現這個問題,取消勾選才發現果然是它。

發一篇文章,希望大家不要再踩我踩過的坑。