Unity之碰到哪说到哪-ResetTrigger

前言

ResetTrigger是个what?再此之前我并不知道,准确说看到过但是并没有care。

开始了解它,是 因 为 出 BUG 了 !!

  1. 项目中播放动画统一使用全局的一个通用方法。播放动画接口调用SetTrigger。
  2. 摇杆开始移动时,调用SetTrigger("Run"),结束时,调用SetTrigger("Idel")。
  3. 当角色在run时,点击了一个npc,触发寻路接口移动到npc,当然寻路开始时,也会在调用一次settrigger("Run").
  4. 当寻路过程中,再次控制摇杆移动时(打断寻路),没有问题,但是当停止摇杆时,应该播放idle动作,但是实际停止后还是播放run。可是看log。我明明最后一次调用了SetTrigger("Idle")

So着重看了下SetTrigger。

SetTrigger

  • SetTrigger可以改变动画状态机的状态,用于触发动画
  • SetTrigger是四个接口之一,其他还有SetFloat、SetInt、SetBool
  • SetTrigger本质上是SetBool,不同点在于,SetBool有两个可选择的值,false/true。但是SetTrigger比较特殊,调用SetTrigger会自动激活状态,同时又会自动设置状态为false。

我们拿一个案例来讲解一下:


clipboard.png
  1. 当摇杆滑动时,调用SetTrigger播放run动画,可以在当前帧通过GetTrigger("homerun") 看到激活状态是true。 当过了一帧后,再次GetTrigger("homerun") 是false。可以看到,trigger会自动回到false。
  2. 摇杆在滑动角色在跑动时,又调用寻路接口,再次触发SetTrigger("homerun"). 这个时候,homerun的trigger状态又被设置成true。 但是重要的是:因为已经在homerun状态了,unity并不会重新进入这个状态,所以homerun的trigger状态并不会自动进入false。
  3. 所以在我停止的摇杆的时候,虽然我调用了SetTrigger("comidle"), unity会进入idle状态,但是因为homerun的trigger状态一直是true,所以进入idle状态后,又会进入homerun状态。由此引起的bug。

解决办法

ResetTrigger

  • ResetTrigger() 可以重置那些可能已经被激活的Trigger。

所以SetTrigger() 之前,我们需要清除可能已经被激活的Trigger。如下方法:

/// <summary>
        /// 清除所有的激活中的trigger缓存
        /// </summary>
        public void ResetAllTriggers(Animator animator)
        {
            AnimatorControllerParameter[] aps = animator.parameters;
            for (int i = 0; i < aps.Length; i++)
            {
                AnimatorControllerParameter paramItem = aps[i];
                if (paramItem.type == AnimatorControllerParameterType.Trigger)
                {
                    string triggerName = paramItem.name;
                    bool isActive = animator.GetBool(triggerName);
                    if (isActive)
                    {
                        animator.ResetTrigger(triggerName);
                    }
                }
            }
        }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容