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