feat: 实现抓墙高度记忆、背墙跳/对墙跳、蹬墙后自动抓墙

- PlayerController: 添加 wallGrabY/wallGrabDir/isPostWallJump 字段及 API
- WallSlideState: 高度限制(超限强制下滑不可蹬跳)+ 静止悬挂 + 反向键释放
- WallJumpState: 区分背墙跳(WallJumpAwayForce)/对墙跳(WallJumpBackForce)
  蹬墙后标记 PostWallJump 允许空中自动抓墙;恢复空中冲刺次数
- FallState/JumpState: 新增抓墙入口(朝向按键 OR PostWallJump 自动抓墙)
- PlayerMovement.WallJump: 增加 jumpAway 参数区分两种跳跃力
- IdleState/RunState: 落地时重置抓墙记录和蹬墙跳标记

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
2026-05-19 12:12:24 +08:00
parent d25f237e76
commit 2a6a0b1861
8 changed files with 172 additions and 22 deletions

View File

@@ -144,6 +144,47 @@ namespace BaseGames.Player.States
public void ResetAirJumps() =>
_airJumpsLeft = _stats != null && _stats.HasAbility(AbilityType.DoubleJump) ? 1 : 0;
// ── 抓墙高度记忆 API ──────────────────────────────────────────────────
// wallGrabY首次抓住某面墙壁时记录的 Y 坐标;用于防止单面墙无限向上爬。
// wallGrabDir当前记录所属墙壁方向+1=右墙,-1=左墙0=无)。
// isPostWallJump蹬墙跳后未落地标记允许靠近墙壁时自动抓墙。
private float _wallGrabY = float.NegativeInfinity;
private int _wallGrabDir = 0;
private bool _isPostWallJump;
public float WallGrabY => _wallGrabY;
public int WallGrabDir => _wallGrabDir;
public bool IsPostWallJump => _isPostWallJump;
/// <summary>
/// 进入 WallSlideState 时调用。
/// 不同墙壁dir != _wallGrabDir→ 重置并记录新高度;
/// 同一面墙壁 → 保留原记录(防止攀爬重置)。
/// </summary>
public void RecordWallGrab(int dir, float y)
{
if (dir != _wallGrabDir)
{
_wallGrabDir = dir;
_wallGrabY = y;
}
// 同一面墙:保留 _wallGrabY不更新
}
/// <summary>落地时重置抓墙记录(由 IdleState/RunState.OnStateEnter 调用)。</summary>
public void ResetWallGrab()
{
_wallGrabY = float.NegativeInfinity;
_wallGrabDir = 0;
}
/// <summary>
/// 设置蹬墙跳后自动抓墙标记。
/// true由 WallJumpState.OnStateEnter 设置;
/// false由 IdleState/RunState.OnStateEnter落地或 WallSlideState.OnStateEnter已消耗清除。
/// </summary>
public void SetPostWallJump(bool value) => _isPostWallJump = value;
// ── Overlay Layer API供 SpringState / SoulSkill 等叠加动画使用)─────
/// <summary>
/// 在 Overlay LayerLayer 1播放动画叠加于当前 Base Layer 动画之上。