From 15df36659a742ee339a9f70a5a70b44a4d284310 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Tue, 19 May 2026 13:38:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=93=E5=A2=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/_Game/Scripts/Player/PlayerMovement.cs | 2 +- .../_Game/Scripts/Player/States/DashState.cs | 21 +++++++++---------- .../Scripts/Player/States/DownAttackState.cs | 2 +- .../_Game/Scripts/Player/States/FallState.cs | 4 ++-- .../_Game/Scripts/Player/States/IdleState.cs | 2 +- .../_Game/Scripts/Player/States/JumpState.cs | 4 ++-- .../_Game/Scripts/Player/States/RunState.cs | 2 +- .../Scripts/Player/States/WallJumpState.cs | 2 +- 8 files changed, 19 insertions(+), 20 deletions(-) diff --git a/Assets/_Game/Scripts/Player/PlayerMovement.cs b/Assets/_Game/Scripts/Player/PlayerMovement.cs index 4a6afcf..4eeaefd 100644 --- a/Assets/_Game/Scripts/Player/PlayerMovement.cs +++ b/Assets/_Game/Scripts/Player/PlayerMovement.cs @@ -188,7 +188,7 @@ namespace BaseGames.Player // ── 冲刺 ────────────────────────────────────────────────────────────── /// - /// 施加冲刺速度(DashState/AerialDashState 调用)。 + /// 施加冲刺速度(DashState/DashState 调用)。 /// direction 应为归一化水平向量(±1, 0)。 /// 冲刺期间调用 SetGravityScale(0) 可关闭重力;结束后恢复默认重力。 /// diff --git a/Assets/_Game/Scripts/Player/States/DashState.cs b/Assets/_Game/Scripts/Player/States/DashState.cs index d5f2602..5107604 100644 --- a/Assets/_Game/Scripts/Player/States/DashState.cs +++ b/Assets/_Game/Scripts/Player/States/DashState.cs @@ -4,8 +4,9 @@ using System.Collections; namespace BaseGames.Player.States { /// - /// 地面冲刺状态(架构 05_PlayerModule §2 + §12)。 + /// 冲刺状态(架构 05_PlayerModule §2 + §12)。 /// 施加水平位移 + 无敌帧;冲刺期间重力归零,结束后恢复; + /// 地面与空中统一使用此状态,空中每次离地限冲刺一次(_dashChargeUsed); /// 需解锁 AbilityType.Dash 才能进入(PlayerController 负责条件检查)。 /// public class DashState : PlayerStateBase @@ -13,29 +14,27 @@ namespace BaseGames.Player.States private float _timer; private float _cooldownTimer; /// - /// 无敌的独立冷却计时器。由 TickCooldown 每帧减少; - /// 地面冲刺和空中冲刺共享此计时器(AerialDashState 通过 GetState<DashState>() 读写)。 + /// 无敌的独立冷却计时器。由 TickCooldown 每帧减少。 /// private float _invincibilityCooldownTimer; private int _facingDir; - /// 本次离地后是否已消耗过一次空中冲刺。落地或下劈命中(Pogo)时重置。 - private bool _airDashUsed; + /// 本次离地后是否已消耗过冲刺次数。落地或下劈命中(Pogo)时重置。 + private bool _dashChargeUsed; public bool CanDash => _cooldownTimer <= 0f; /// 空中冲刺可用条件:冷却就绪 且 本次离地内尚未冲刺过。 - public bool CanAirDash => _cooldownTimer <= 0f && !_airDashUsed; + public bool CanDashMidAir => _cooldownTimer <= 0f && !_dashChargeUsed; - /// 重置空中冲刺次数(落地或 Pogo 时由 IdleState/RunState/DownAttackState 调用)。 - public void ResetAirDash() => _airDashUsed = false; + /// 重置冲刺次数(落地或 Pogo 时由 IdleState/RunState/DownAttackState 调用)。 + public void ResetDashCharge() => _dashChargeUsed = false; /// /// 无敌帧是否已冷却,即本次冲刺可以获得无敌。 - /// DashState 和 AerialDashState 共享同一实例计时器实现 "spam 冲刺不能持续无敌" 机制。 /// public bool CanGrantInvincibility => _invincibilityCooldownTimer <= 0f; - /// 重置无敌冷却(DashState/AerialDashState 驾用无敌后调用)。 + /// 重置无敌冷却(冲刺使用无敌后调用)。 public void ResetInvincibilityCooldown(float cd) => _invincibilityCooldownTimer = cd; // ── IsInvincible 不再在状态层硬编码,改为全面依赖 Stats._invincibleTimer ──────────── @@ -54,7 +53,7 @@ namespace BaseGames.Player.States // 空中冲刺:记录本次离地已使用冲刺(地面冲刺不消耗,仅空中限制一次) if (!Move.IsGrounded) - _airDashUsed = true; + _dashChargeUsed = true; // 无敌帧: // 条件 1:已解锁 InvincibleDash diff --git a/Assets/_Game/Scripts/Player/States/DownAttackState.cs b/Assets/_Game/Scripts/Player/States/DownAttackState.cs index 0cd8ac3..7dbc4a0 100644 --- a/Assets/_Game/Scripts/Player/States/DownAttackState.cs +++ b/Assets/_Game/Scripts/Player/States/DownAttackState.cs @@ -61,7 +61,7 @@ namespace BaseGames.Player.States _hasHitEnemy = true; // Pogo 弹跳:命中敌人后向上弹起,同时重置空中能力(等同落地效果) Owner.ResetAirJumps(); - Owner.GetState()?.ResetAirDash(); + Owner.GetState()?.ResetDashCharge(); Move.Jump(); } diff --git a/Assets/_Game/Scripts/Player/States/FallState.cs b/Assets/_Game/Scripts/Player/States/FallState.cs index daca388..c0a67ac 100644 --- a/Assets/_Game/Scripts/Player/States/FallState.cs +++ b/Assets/_Game/Scripts/Player/States/FallState.cs @@ -6,7 +6,7 @@ namespace BaseGames.Player.States /// 下落状态。 /// - 郊狼跳:CoyoteTimer > 0 时按跳跃 → 一段跳(JumpState,使用 JumpForce)。 /// - 空中跳跃:CoyoteTimer 耗尽后按跳跃且 AirJumpsLeft > 0 → JumpState(使用 DoubleJumpForce)。 - /// - 冲刺:HasAbility(Dash) && DashState.CanAirDash → DashState(地面与空中统一,空中限一次)。 + /// - 冲刺:HasAbility(Dash) && DashState.CanDashMidAir → DashState(地面与空中统一,空中限一次)。 /// - 抓墙:贴墙时按下朝向墙壁的方向键 → WallSlideState。 /// - 增强下落重力(FallGravityMult)确保下落快于上升,手感紧实。 /// @@ -42,7 +42,7 @@ namespace BaseGames.Player.States // ── 冲刺(地面/空中统一使用 DashState)──────────────────────────── // 先确认能力与冷却均满足,再消耗缓冲,避免无操作时静默吃掉输入 var dashState = Owner.GetState(); - if (dashState != null && dashState.CanAirDash + if (dashState != null && dashState.CanDashMidAir && Stats != null && Stats.HasAbility(AbilityType.Dash) && Buffer.ConsumeDash()) { diff --git a/Assets/_Game/Scripts/Player/States/IdleState.cs b/Assets/_Game/Scripts/Player/States/IdleState.cs index 8adc4fe..1cdba21 100644 --- a/Assets/_Game/Scripts/Player/States/IdleState.cs +++ b/Assets/_Game/Scripts/Player/States/IdleState.cs @@ -14,7 +14,7 @@ namespace BaseGames.Player.States Move?.ZeroHorizontalVelocity(); // 落地时重置空中能力计数器及抓墙记录 Owner.ResetAirJumps(); - Owner.GetState()?.ResetAirDash(); + Owner.GetState()?.ResetDashCharge(); Owner.GetState()?.ResetWallGrab(); Owner.SetPostWallJump(false); } diff --git a/Assets/_Game/Scripts/Player/States/JumpState.cs b/Assets/_Game/Scripts/Player/States/JumpState.cs index a94091a..cb1675c 100644 --- a/Assets/_Game/Scripts/Player/States/JumpState.cs +++ b/Assets/_Game/Scripts/Player/States/JumpState.cs @@ -7,7 +7,7 @@ namespace BaseGames.Player.States /// - 一段跳 / 郊狼跳:OnStateEnter 时调用 Move.Jump()。 /// - 二段跳(二段跳能力解锁后可用):上升或下落途中再按跳跃且 AirJumpsLeft > 0, /// 调用 Move.DoubleJump(),重播跳跃动画,不离开本状态(保持速度截断逻辑)。 - /// - 空中冲刺:上升途中按冲刺且 HasAbility(AirDash) → AerialDashState。 + /// - 空中冲刺:上升途中按冲刺且 HasAbility(AirDash) → DashState。 /// - 变高跳:松开跳跃键触发 JumpCancelledEvent → CutJump()(系数 = JumpCutMultiplier)。 /// - _isDoubleJump:由 FallState 在转换前通过 SetDoubleJump(true) 预设, /// 使 OnStateEnter 对二段跳调用 Move.DoubleJump() 而非 Move.Jump()。 @@ -55,7 +55,7 @@ namespace BaseGames.Player.States // 冲刺(地面/空中统一使用 DashState,空中限一次,优先于二段跳:冲刺可保存二段跳机会) // 先确认能力与冷却均满足,再消耗缓冲,避免无操作时静默吃掉输入 var dashState = Owner.GetState(); - if (dashState != null && dashState.CanAirDash + if (dashState != null && dashState.CanDashMidAir && Stats != null && Stats.HasAbility(AbilityType.Dash) && Buffer.ConsumeDash()) { diff --git a/Assets/_Game/Scripts/Player/States/RunState.cs b/Assets/_Game/Scripts/Player/States/RunState.cs index 4e19b43..459549c 100644 --- a/Assets/_Game/Scripts/Player/States/RunState.cs +++ b/Assets/_Game/Scripts/Player/States/RunState.cs @@ -13,7 +13,7 @@ namespace BaseGames.Player.States Anim.Play(AnimCfg.Run); // 落地时重置空中能力计数器及抓墙记录(水平落地直接进入 RunState 时) Owner.ResetAirJumps(); - Owner.GetState()?.ResetAirDash(); + Owner.GetState()?.ResetDashCharge(); Owner.GetState()?.ResetWallGrab(); Owner.SetPostWallJump(false); } diff --git a/Assets/_Game/Scripts/Player/States/WallJumpState.cs b/Assets/_Game/Scripts/Player/States/WallJumpState.cs index 16efa19..67011c0 100644 --- a/Assets/_Game/Scripts/Player/States/WallJumpState.cs +++ b/Assets/_Game/Scripts/Player/States/WallJumpState.cs @@ -53,7 +53,7 @@ namespace BaseGames.Player.States Owner.SetPostWallJump(true); // 蹬墙成功后立即恢复空中冲刺次数 - Owner.GetState()?.ResetAerialDashes(); + Owner.GetState()?.ResetDashCharge(); // 播放蹬墙跳动画:背墙跳/对墙跳使用各自专属 Clip,留空时回退到 Jump 动画 var wallJumpClip = _isAwayJump