using UnityEngine; namespace BaseGames.Player.States { /// /// 下落状态(对齐空洞骑士手感)。 /// - 郊狼跳:CoyoteTimer > 0 时按跳跃 → 一段跳(JumpState,使用 JumpForce)。 /// - 二段跳:CoyoteTimer 耗尽后按跳跃且 AirJumpsLeft > 0 → JumpState(使用 DoubleJumpForce)。 /// - 空中冲刺:HasAbility(AirDash) && HasAerialDash → AerialDashState。 /// - 增强下落重力(FallGravityMult)确保下落快于上升,手感紧实。 /// public class FallState : PlayerStateBase { public FallState(PlayerController owner) : base(owner) { } public override void OnStateEnter() { if (AnimCfg?.Fall != null) Anim.Play(AnimCfg.Fall); } public override void OnStateUpdate() { // ── 跳跃输入(郊狼跳 / 二段跳)──────────────────────────────────── if (Buffer.ConsumeJump()) { if (Move.HasCoyoteTime) { // 郊狼跳:一段跳,使用 JumpForce _owner.TransitionTo(_owner.GetState()); return; } if (Owner.AirJumpsLeft > 0) { // 二段跳:通过 SetDoubleJump 标记 JumpState 使用 DoubleJumpForce Owner.UseAirJump(); Owner.GetState()?.SetDoubleJump(true); _owner.TransitionTo(_owner.GetState()); return; } // 无跳跃机会:输入已消耗,静默忽略(HK 相同行为) } // ── 空中冲刺──────────────────────────────────────────────────────── if (Buffer.ConsumeDash() && Stats != null && Stats.HasAbility(AbilityType.AirDash)) { var aerialDash = Owner.GetState(); if (aerialDash != null && aerialDash.HasAerialDash) { _owner.TransitionTo(aerialDash); return; } } // ── 着地────────────────────────────────────────────────────────── if (Move.IsGrounded) { Move.ZeroVelocity(); if (Mathf.Abs(Input.MoveInput.x) > 0.1f) _owner.TransitionTo(_owner.GetState()); else _owner.TransitionTo(_owner.GetState()); return; } // 空中水平移动 if (Mathf.Abs(Input.MoveInput.x) > 0.01f) Move.Move(Input.MoveInput.x * Cfg.RunSpeed); } public override void OnStateFixedUpdate() { // 增强下落重力(FallGravityMult 对齐 HK:下落比上升更快) if (Move.Rb.velocity.y < 0f) { float extraGrav = Physics2D.gravity.y * (Cfg.FallGravityMult - 1f) * Time.fixedDeltaTime; Move.Rb.velocity = new Vector2( Move.Rb.velocity.x, Mathf.Max(Move.Rb.velocity.y + extraGrav, -Cfg.MaxFallSpeed)); } } } }