Unity游戏开发经验分享

Unity之碰到哪说到哪-ResetTrigger

2019-04-16  本文已影响10人  01142f3d9316

前言

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

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


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

所以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);
                    }
                }
            }
        }
上一篇 下一篇

猜你喜欢

热点阅读