using UnityEngine;
namespace BaseGames.Player.States
{
/// 跑步状态。播放 Run 动画并驱动水平移动。
public class RunState : PlayerStateBase
{
public RunState(PlayerController owner) : base(owner) { }
public override void OnStateEnter()
{
if (AnimCfg?.Run != null)
Anim.Play(AnimCfg.Run);
// 落地时重置空中能力计数器(绝大多数情况被 IdleState 覆盖,但水平落地直接进入 RunState 时也需要)
Owner.GetState()?.ResetAerialDashes();
Owner.ResetAirJumps();
}
public override void OnStateUpdate()
{
if (!Move.IsGrounded)
{
_owner.TransitionTo(_owner.GetState());
return;
}
if (Buffer.ConsumeJump())
{
_owner.TransitionTo(_owner.GetState());
return;
}
// 地面冲刺:需解锁 Dash 能力,且冲刺不在冷却
if (Buffer.ConsumeDash()
&& Stats != null && Stats.HasAbility(AbilityType.Dash)
&& Owner.GetState() is { CanDash: true } dashState)
{
_owner.TransitionTo(dashState);
return;
}
if (Mathf.Abs(Input.MoveInput.x) < 0.1f)
{
_owner.TransitionTo(_owner.GetState());
return;
}
}
public override void OnStateFixedUpdate()
{
Move.Move(Input.MoveInput.x * Cfg.RunSpeed);
}
}
}