关于Animator.SetTrigger的一些迷思

近期一直在修改各种战斗中碰到的问题,其中有一个问题,让我困扰了很久,大概场景简单描述一下,有一天我们的策划同学给我反馈了一个问题,问题是这样的:

如果主角在战斗副本中一直按住攻击按钮进行攻击的话,貌似一直都处于霸体状态,小怪命中主角之后,能看到主角在掉血,但是主角几乎不会播放受击后仰的动画,让人觉得主角很Bug,小怪完全不是对手。

好,这是一个很好的问题,在我听到这个反馈的第一时间里,我的反应是“擦,这不可能啊”,好吧,程序猿总是这般自信和分裂。实际上这肯定是可能的,而且正在发生,可是我们总是想选择不相信事实,在看着我们的策划同学演示了大概3分钟,我发现这尼玛就是有这个问题。那么肿么解呢?

先检查代码呗,各种检查,各种推演,最终发现有可能存在一种情况,那就是Animator同时调用了多个SetTrigger方法,设置了多个不同的Trigger的值,可能会导致这个问题,那么接下来就是验证了,因为实际的工程中触发个情况肯定不是那么必然和容易的,那么我们验证的时候就直接非常直接地通过代码的方式来验证就好了。

我们直接就在某一个按钮按下的事件回调中,直接通过Animator.SetTrigger()方法设置了两个动作差别非常大的状态对应的Trigger,最终会发现Unity3D会自动融合这两个过程,例如我们在Idle状态的时候通过设置Attack和BackOff两个状态的Trigger:Attack和BackOff,然后我们就会发现,主角会先往后仰几帧,然后继续Attack的动作直到其完整播放完毕。unity3d_mecanim_set_trigger_myth测试结果是,会以当前触发的所有动画中播放时长最大的为主,其余的动画会在整个时间轴中对主角的动画综合地产生影响,所以一定要注意尽量不要让多个不同的Trigger在同一时间触发,因为Unity4.6版本未提供获取Animator参数列表的接口,所以我们得自己维护好Trigger列表,如果我们的实际需求中,不存在需要多个Trigger同时被触发的情况,那么记得在设置新的Trigger之前(当然也可以考虑优先级和权重值)将其他已经设置过但是还没有被Animator应用的Trigger Reset掉。

关于Animator.SetTrigger的一些迷思》有2个想法

  1. nazuo

    先谢过博主分享经验, 最近正好也是在研究animator动画状态切换这块,发现动画状态切换这块其实有蛮多坑的,不像直接API调用 Play或CrossFade等接口、能立马得到想要播放的动画。如果动画触发参数设置不对,可能无法得到想要播放的动画,并留下了各种隐患,例如SetTrigger, 如果当前动画状态、不能过渡到SetTrigger的目标状态,那么Trigger参数就会一直保持true, 直到某个时刻导致了BUG发生; 如果当前已经处在某个动画状态,然后还继续调用触发到该状态的SetTrigger接口的话,也会导致Trigger参数一直保持true。。。

    回复

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据