首页 > 解决方案 > Unity 2D - 从边缘跌落时,跌落动画不起作用

问题描述

我正在开发一个带有动画的简单 2D 平台游戏,并且我设法让动画状态机只处理一个问题,从边缘掉落时下降动画不起作用,它只会在跳跃动画后触发。

private void AnimationState()
    {
        if (state == State.jumping)
        {
            if (rb.velocity.y < .1f)
            {
                state = State.falling;
            }
        }
        else if (state == State.falling)
        {
            if (isGrounded == true)
            {
                state = State.idle;
            }
        }
        else if (state == State.hurt)
        {
            if (Mathf.Abs(rb.velocity.x) < .1f)
            {
                state = State.idle;
            }
        }
        else if (Mathf.Abs(rb.velocity.x) > 2f)
        {
            state = State.running;
        }
        else
        {
            state = State.idle;
        }
    }

标签: c#unity3dstate-machine

解决方案


如果精灵在 X 方向减速到 2f 以下,它将进入空闲状态。然后一旦处于空闲状态,您的逻辑将只能转换为运行。如果它落在边缘,则代码中没有任何内容可以将其转换为下降状态。

您不应该像这样编写状态机,在其中指定从每个状态到另一个状态的每个可能的转换,因为有 N 个平方排列。相反,您应该识别状态而不关心当前状态是什么。

例如:

  • 跳跃是速度.y > 0
  • 下落是速度。y < 0
  • FallingFast 是 velocity.y < -0.1 (即在这里触发你的自由落体动画)
  • 伤害是正交的(即与运动状态无关)并且应该基于碰撞
  • 运行是velocity.y == 0 and abs(velocity.x) > 2
  • 空闲是velocity.magnitude == 0

推荐阅读