美文网首页Unity游戏开发经验分享
Unity之碰到哪说到哪-ResetTrigger

Unity之碰到哪说到哪-ResetTrigger

作者: 01142f3d9316 | 来源:发表于2019-04-16 14:53 被阅读10次

    前言

    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);
                        }
                    }
                }
            }
    

    相关文章

      网友评论

        本文标题:Unity之碰到哪说到哪-ResetTrigger

        本文链接:https://www.haomeiwen.com/subject/nasbwqtx.html