巧用Unity的Animator的动画层(Layer)实现跑动中攻击和受击

时间:2024-03-20 10:40:59

         需求是这样的,角色在待机和跑动中都可以攻击也可能受击,但如果是跑动切到攻击和受击时同时还要保持跑动的动画,同样的待机切换的,执行完后就是待机动画。如果只用一层,Animator Controller 就很复杂,还可能额外编写较多的其他代码。这里有个难点在于,当正在跑时,想执行攻击,用trigger即可,但如果攻击执行完以后,该执行什么?按理说,应该是回到跑。但是,不仅仅是跑动中可以攻击,而是待机中也可以攻击。如果这要通过代码实现,可能比较冗长。不过如果用两层动画层,就很容易实现。

1.建立base层,控制 “idle”, “attack”, “hit”,“die”的切换

巧用Unity的Animator的动画层(Layer)实现跑动中攻击和受击

这个之间的切换都使用各自的trigger来切换。其中设置“die”可以被anystate切换去。

2.建立Run层,控制“run”

巧用Unity的Animator的动画层(Layer)实现跑动中攻击和受击

默认状态是null,也就是这上面没有任何动画,是空的, “null”和“run”的切换用个bool值控制。最后的参数和层看起来如下

巧用Unity的Animator的动画层(Layer)实现跑动中攻击和受击

巧用Unity的Animator的动画层(Layer)实现跑动中攻击和受击

将Run Layer的weight设置成0.5.。因为我们需要的跑的时候,能攻击,且保持跑的状态,这两个状态被简单的处理到了不同的层里了,那必须有个权重。说的直白点,跑动中攻击,播放的既不是跑动也不是攻击的动画,而是两者的混合。

3.增加代码,当“attack”或者“hit”动画执行完后回到idle。主要还是想有个“中心”状态,保持一个星型的结构,好控制。

    void PlayFinishedReturnToIdle(AnimatorStateInfo stateInfo)
    {
        //不设置Has Exit Time 切换会流畅
        if (stateInfo.IsName("attack") || stateInfo.IsName("hit"))
        {
            if (stateInfo.normalizedTime > 1.0f)
            {
                animator.SetTrigger("idle");
            }
        }
    }