c# - 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;
}
}
解决方案
如果精灵在 X 方向减速到 2f 以下,它将进入空闲状态。然后一旦处于空闲状态,您的逻辑将只能转换为运行。如果它落在边缘,则代码中没有任何内容可以将其转换为下降状态。
您不应该像这样编写状态机,在其中指定从每个状态到另一个状态的每个可能的转换,因为有 N 个平方排列。相反,您应该识别状态而不关心当前状态是什么。
例如:
- 跳跃是速度.y > 0
- 下落是速度。y < 0
- FallingFast 是 velocity.y < -0.1 (即在这里触发你的自由落体动画)
- 伤害是正交的(即与运动状态无关)并且应该基于碰撞
- 运行是velocity.y == 0 and abs(velocity.x) > 2
- 空闲是velocity.magnitude == 0