抓墙
This commit is contained in:
@@ -188,7 +188,7 @@ namespace BaseGames.Player
|
||||
|
||||
// ── 冲刺 ──────────────────────────────────────────────────────────────
|
||||
/// <summary>
|
||||
/// 施加冲刺速度(DashState/AerialDashState 调用)。
|
||||
/// 施加冲刺速度(DashState/DashState 调用)。
|
||||
/// direction 应为归一化水平向量(±1, 0)。
|
||||
/// 冲刺期间调用 SetGravityScale(0) 可关闭重力;结束后恢复默认重力。
|
||||
/// </summary>
|
||||
|
||||
@@ -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<DashState>() 读写)。
|
||||
/// 无敌的独立冷却计时器。由 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
|
||||
|
||||
@@ -61,7 +61,7 @@ namespace BaseGames.Player.States
|
||||
_hasHitEnemy = true;
|
||||
// Pogo 弹跳:命中敌人后向上弹起,同时重置空中能力(等同落地效果)
|
||||
Owner.ResetAirJumps();
|
||||
Owner.GetState<DashState>()?.ResetAirDash();
|
||||
Owner.GetState<DashState>()?.ResetDashCharge();
|
||||
Move.Jump();
|
||||
}
|
||||
|
||||
|
||||
@@ -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)确保下落快于上升,手感紧实。
|
||||
/// </summary>
|
||||
@@ -42,7 +42,7 @@ namespace BaseGames.Player.States
|
||||
// ── 冲刺(地面/空中统一使用 DashState)────────────────────────────
|
||||
// 先确认能力与冷却均满足,再消耗缓冲,避免无操作时静默吃掉输入
|
||||
var dashState = Owner.GetState<DashState>();
|
||||
if (dashState != null && dashState.CanAirDash
|
||||
if (dashState != null && dashState.CanDashMidAir
|
||||
&& Stats != null && Stats.HasAbility(AbilityType.Dash)
|
||||
&& Buffer.ConsumeDash())
|
||||
{
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace BaseGames.Player.States
|
||||
Move?.ZeroHorizontalVelocity();
|
||||
// 落地时重置空中能力计数器及抓墙记录
|
||||
Owner.ResetAirJumps();
|
||||
Owner.GetState<DashState>()?.ResetAirDash();
|
||||
Owner.GetState<DashState>()?.ResetDashCharge();
|
||||
Owner.GetState<WallSlideState>()?.ResetWallGrab();
|
||||
Owner.SetPostWallJump(false);
|
||||
}
|
||||
|
||||
@@ -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<DashState>();
|
||||
if (dashState != null && dashState.CanAirDash
|
||||
if (dashState != null && dashState.CanDashMidAir
|
||||
&& Stats != null && Stats.HasAbility(AbilityType.Dash)
|
||||
&& Buffer.ConsumeDash())
|
||||
{
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace BaseGames.Player.States
|
||||
Anim.Play(AnimCfg.Run);
|
||||
// 落地时重置空中能力计数器及抓墙记录(水平落地直接进入 RunState 时)
|
||||
Owner.ResetAirJumps();
|
||||
Owner.GetState<DashState>()?.ResetAirDash();
|
||||
Owner.GetState<DashState>()?.ResetDashCharge();
|
||||
Owner.GetState<WallSlideState>()?.ResetWallGrab();
|
||||
Owner.SetPostWallJump(false);
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ namespace BaseGames.Player.States
|
||||
Owner.SetPostWallJump(true);
|
||||
|
||||
// 蹬墙成功后立即恢复空中冲刺次数
|
||||
Owner.GetState<AerialDashState>()?.ResetAerialDashes();
|
||||
Owner.GetState<DashState>()?.ResetDashCharge();
|
||||
|
||||
// 播放蹬墙跳动画:背墙跳/对墙跳使用各自专属 Clip,留空时回退到 Jump 动画
|
||||
var wallJumpClip = _isAwayJump
|
||||
|
||||
Reference in New Issue
Block a user