PlayerMovementConfigSO.cs
新增 WallHangSpeed = 1f:正常抓墙(低于等于 wallGrabY,可蹬墙跳区间)的缓慢下滑速度 WallSlideSpeed 语义调整为:受限模式(高于 wallGrabY)的较快下滑速度 PlayerMovement.cs ApplyWallSlide() 改为 ApplyWallSlide(float speed),由调用方传入对应速度 WallSlideState.cs OnStateFixedUpdate:正常模式用 WallHangSpeed,受限模式用 WallSlideSpeed(两档清晰分离) 恢复反方向键脱离:脱离时同样调用 StartWallCoyote,wall coyote 窗口内仍能触发蹬墙跳 更新类头注释完整描述脱离方式和下滑速度档位Two wall slide improvements:
This commit is contained in:
@@ -6,7 +6,17 @@ namespace BaseGames.Player.States
|
||||
/// 抓墙状态(自定义设计,架构 05_PlayerModule §2)。
|
||||
///
|
||||
/// 触发条件:空中贴墙时玩家按下朝向墙壁的方向键(由 FallState/JumpState 检测并调用 PrepareEnter)。
|
||||
/// 维持条件:进入后无需持续按键;主动按下反方向键或落地时解除。
|
||||
/// 维持条件:进入后无需持续按键;按下↓键或落地时解除;跳跃键触发蹬墙跳后由 WallJumpState 接管。
|
||||
///
|
||||
/// 脱离方式:
|
||||
/// - 跳跃键 → 蹬墙跳(WallJumpState,由 OnJumpPressed 响应)
|
||||
/// - ↓ 键 / 反方向键 → 主动脱离,进入 FallState;wall coyote 窗口内仍可触发蹬墙跳
|
||||
/// - 离开墙面 → 自然下落(FallState)
|
||||
/// - 着地 → 闲置(IdleState)
|
||||
///
|
||||
/// 下滑速度分为两档(均在 PlayerMovementConfigSO 配置):
|
||||
/// - 正常模式(低于等于 wallGrabY,可蹬墙跳)→ WallHangSpeed(缓慢下滑)
|
||||
/// - 受限模式(高于 wallGrabY,不可蹬墙跳) → WallSlideSpeed(较快下滑)
|
||||
///
|
||||
/// 高度记忆机制(防止单面墙反复爬升):
|
||||
/// - 首次抓墙(或切换到另一侧墙壁)时记录 _wallGrabY。
|
||||
@@ -73,9 +83,10 @@ namespace BaseGames.Player.States
|
||||
{
|
||||
var wd = Owner.WallDetector;
|
||||
|
||||
// 离开墙壁 → 下落
|
||||
// 离开墙壁 → 启动墙壁土狼时间后下落
|
||||
if (wd == null || !wd.IsTouchingWall)
|
||||
{
|
||||
Move.StartWallCoyote(_wallDir);
|
||||
Owner.TransitionTo(Owner.GetState<FallState>());
|
||||
return;
|
||||
}
|
||||
@@ -87,30 +98,35 @@ namespace BaseGames.Player.States
|
||||
return;
|
||||
}
|
||||
|
||||
// 主动按反方向键 → 脱离(松墙下落)
|
||||
float mx = Input.MoveInput.x;
|
||||
if (Mathf.Abs(mx) > 0.1f)
|
||||
// 按下方向键 → 启动墙壁土狼时间后主动脱离,自然下落
|
||||
if (Input.MoveInput.y < -0.5f)
|
||||
{
|
||||
int inputDir = mx > 0f ? 1 : -1;
|
||||
if (inputDir != _wallDir)
|
||||
{
|
||||
Owner.TransitionTo(Owner.GetState<FallState>());
|
||||
return;
|
||||
}
|
||||
Move.StartWallCoyote(_wallDir);
|
||||
Owner.TransitionTo(Owner.GetState<FallState>());
|
||||
return;
|
||||
}
|
||||
|
||||
// 按反方向键 → 启动墙壁土狼时间后脱离
|
||||
// wall coyote 存在时,离墙后短窗口内仍可触发蹬墙跳,不会误双跳
|
||||
float mx = Input.MoveInput.x;
|
||||
if (Mathf.Abs(mx) > 0.1f && (mx > 0f ? 1 : -1) != _wallDir)
|
||||
{
|
||||
Move.StartWallCoyote(_wallDir);
|
||||
Owner.TransitionTo(Owner.GetState<FallState>());
|
||||
return;
|
||||
}
|
||||
|
||||
// 每帧刷新正常/受限状态
|
||||
UpdateCanJump();
|
||||
}
|
||||
|
||||
public override void OnStateFixedUpdate()
|
||||
{
|
||||
if (_canJump)
|
||||
// 正常模式:静止悬挂,阻止向下速度
|
||||
Move?.ZeroVerticalVelocity();
|
||||
// 正常模式(低于等于 wallGrabY,可蹬墙跳):缓慢下滑,给玩家操作窗口
|
||||
Move?.ApplyWallSlide(Cfg.WallHangSpeed);
|
||||
else
|
||||
// 受限模式:持续下滑
|
||||
Move?.ApplyWallSlide();
|
||||
// 受限模式(高于 wallGrabY):较快下滑,不可蹬墙跳
|
||||
Move?.ApplyWallSlide(Cfg.WallSlideSpeed);
|
||||
}
|
||||
|
||||
// ── 内部 ──────────────────────────────────────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user