Unity Animator SetTrigger “不生效”的坑

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

相关文章
相关标签/搜索