Unity Animator 的 SetTrigger 方法有一個小坑,就是快速調用SetTrigger,生效的可能不是最後調用的那個,要是不瞭解,出問題了會摸不着頭腦。測試
我遇到問題的場景:來回切換run和idle動做時,會出現本應該播放run的動做時,卻播了idle的動做,從log上看又已經設置過run的trigger。剛開始很着急,徹底不知道怎麼回事,看上去是偶然的,很難復現。後面通過反覆測試,發現快速切換run和idle會使出現問題的機率大大提升,會不會是上一個SetTrigger(idle)覆蓋掉了SetTrigger(run)。因而就作了個小實驗:動畫
一、直接在代碼裏同時調用多個SetTrigger;spa
二、調用屢次,但SetTrigger前先ResetTrigger;code
測試代碼:blog
//用臨時變量保存trigger參數,並在播放以前把上一個trigger重置
void SetTrigger(string trigger) { if (!string.IsNullOrEmpty(lastTrigger)) animator.ResetTrigger(lastTrigger); animator.SetTrigger(trigger); lastTrigger = trigger; }
//直接連續調用 public void TestTrigger1() { animator.SetTrigger(AniParam.Run_Trigger); animator.SetTrigger(AniParam.EnterIdle_Trigger); animator.SetTrigger(AniParam.Attack1_Trigger); animator.SetTrigger(AniParam.Attack2_Trigger); animator.SetTrigger(AniParam.Critl_Trigger); }
//每次調用都重置 public void TestTrigger2() { SetTrigger(AniParam.Run_Trigger); SetTrigger(AniParam.EnterIdle_Trigger); SetTrigger(AniParam.Attack1_Trigger); SetTrigger(AniParam.Attack2_Trigger); SetTrigger(AniParam.Critl_Trigger); } void Update() { if (Input.GetKeyDown(KeyCode.A)) TestTrigger1(); if (Input.GetKeyDown(KeyCode.D)) TestTrigger2(); }
測試1,直接SetTrigger,看上去像是動畫融合,並且也不是換調用順序播放:string
測試2,先ResetTrigger,再SetTrigger,符合預期: 正常播放Critl:it
因此,爲了不SetTrigger異常,出現詭異狀況,仍是在SetTrigger以前先ResetTrigger吧。ast