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.ResetAirJumps(); Owner.GetState()?.ResetAirDash(); Owner.GetState()?.ResetWallGrab(); } public override void OnStateUpdate() { if (!Move.IsGrounded) { _owner.TransitionTo(_owner.GetState()); return; } if (Buffer.ConsumeJump()) { _owner.TransitionTo(_owner.GetState()); return; } // 地面攻击:Move Y > 0 → 上劈;其余 → 普通连击 if (Buffer.ConsumeAttack()) { if (Input.MoveInput.y > 0.5f) _owner.TransitionTo(_owner.GetState()); else _owner.TransitionTo(_owner.GetState()); return; } // 地面冲刺:先确认能力与冷却均满足,再消耗缓冲,避免无操作时静默吃掉输入 var ds = Owner.GetState(); if (ds != null && ds.CanDash && Stats != null && Stats.HasAbility(AbilityType.Dash) && Buffer.ConsumeDash()) { _owner.TransitionTo(ds); return; } if (Mathf.Abs(Input.MoveInput.x) < 0.1f) { Move.ZeroHorizontalVelocity(); _owner.TransitionTo(_owner.GetState()); return; } } public override void OnStateFixedUpdate() { // 离地检测(与 CheckGrounded 同帧在 FixedUpdate 中执行,立即响应离地事件) if (!Move.IsGrounded) { _owner.TransitionTo(_owner.GetState()); return; } float inputX = Input.MoveInput.x; if (Mathf.Abs(inputX) > 0.1f) Move.Move(inputX * Cfg.RunSpeed); else Move.ZeroHorizontalVelocity(); } } }