This commit is contained in:
2026-05-19 13:38:39 +08:00
parent f1fc356d99
commit 15df36659a
8 changed files with 19 additions and 20 deletions

View File

@@ -4,8 +4,9 @@ using System.Collections;
namespace BaseGames.Player.States
{
/// <summary>
/// 地面冲刺状态(架构 05_PlayerModule §2 + §12
/// 冲刺状态(架构 05_PlayerModule §2 + §12
/// 施加水平位移 + 无敌帧;冲刺期间重力归零,结束后恢复;
/// 地面与空中统一使用此状态空中每次离地限冲刺一次_dashChargeUsed
/// 需解锁 AbilityType.Dash 才能进入PlayerController 负责条件检查)。
/// </summary>
public class DashState : PlayerStateBase
@@ -13,29 +14,27 @@ namespace BaseGames.Player.States
private float _timer;
private float _cooldownTimer;
/// <summary>
/// 无敌的独立冷却计时器。由 TickCooldown 每帧减少
/// 地面冲刺和空中冲刺共享此计时器AerialDashState 通过 GetState&lt;DashState&gt;() 读写)。
/// 无敌的独立冷却计时器。由 TickCooldown 每帧减少
/// </summary>
private float _invincibilityCooldownTimer;
private int _facingDir;
/// <summary>本次离地后是否已消耗过一次空中冲刺。落地或下劈命中Pogo时重置。</summary>
private bool _airDashUsed;
/// <summary>本次离地后是否已消耗过冲刺次数。落地或下劈命中Pogo时重置。</summary>
private bool _dashChargeUsed;
public bool CanDash => _cooldownTimer <= 0f;
/// <summary>空中冲刺可用条件:冷却就绪 且 本次离地内尚未冲刺过。</summary>
public bool CanAirDash => _cooldownTimer <= 0f && !_airDashUsed;
public bool CanDashMidAir => _cooldownTimer <= 0f && !_dashChargeUsed;
/// <summary>重置空中冲刺次数(落地或 Pogo 时由 IdleState/RunState/DownAttackState 调用)。</summary>
public void ResetAirDash() => _airDashUsed = false;
/// <summary>重置冲刺次数(落地或 Pogo 时由 IdleState/RunState/DownAttackState 调用)。</summary>
public void ResetDashCharge() => _dashChargeUsed = false;
/// <summary>
/// 无敌帧是否已冷却,即本次冲刺可以获得无敌。
/// DashState 和 AerialDashState 共享同一实例计时器实现 "spam 冲刺不能持续无敌" 机制。
/// </summary>
public bool CanGrantInvincibility => _invincibilityCooldownTimer <= 0f;
/// <summary>重置无敌冷却(DashState/AerialDashState 驾用无敌后调用)。</summary>
/// <summary>重置无敌冷却(冲刺使用无敌后调用)。</summary>
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