9.8 KiB
玩家跳跃 / 冲刺手感调参指南
配置文件:Assets/_Game/ScriptableObjects/Player/PlayerMovementConfig.asset
对应脚本:PlayerMovementConfigSO.cs
影响状态:JumpState · FallState · DashState · AerialDashState
一、跳跃系统
1.1 物理模型概述
跳跃分为三段,每段使用不同的有效重力:
vy ↑
│ ╭──╮ ← ② 顶点悬停段:|vy| < ApexThreshold,
│ ╯ ╰╮ 重力 = DefaultGravityScale × ApexGravityMultiplier
│ ╯ ╰──── ← ③ 下落段(FallState):
│╯ 重力 = DefaultGravityScale(由 Unity 施加)
│ ↑ ① 上升段 + FallGravityMult 额外速度叠加
────┼──────────────→ 时间
| 阶段 | 激活状态 | 有效重力 |
|---|---|---|
| ① 上升 | JumpState( |
vy |
| ② 顶点悬停 | JumpState( |
vy |
| ③ 下落 | FallState |
9.81 × DefaultGravityScale + 9.81 × (FallGravityMult−1) / FixedDeltaTime |
1.2 参数说明与推荐值
基础重力
| 参数 | 类型 | 当前默认 | 推荐(高速手感) | 说明 |
|---|---|---|---|---|
DefaultGravityScale |
float | 3.0 | 6.0 | Rigidbody2D 的 gravityScale。越高上升减速越快、跳跃弧线越短促。这是影响整体跳跃节奏的最核心参数。 |
⚠️ 修改
DefaultGravityScale后必须同步调整JumpForce,否则弹跳高度会改变。
跳跃初速
| 参数 | 类型 | 当前默认 | 推荐(高速手感) | 说明 |
|---|---|---|---|---|
JumpForce |
float | 19.0 | 24.0 | 按下跳跃键瞬间赋予的垂直速度(单位/秒)。 |
DoubleJumpForce |
float | 19.0 | 24.0 | 二段跳/空中追加跳的垂直速度。通常与 JumpForce 保持一致以获得等高跳跃。 |
跳跃高度速查公式(忽略顶点悬停段):
H_{apex} \approx \frac{JumpForce^2}{2 \times 9.81 \times DefaultGravityScale}
| DefaultGravityScale | JumpForce = 19 | JumpForce = 24 |
|---|---|---|
| 3.0 | ≈ 6.1 单位 | ≈ 9.8 单位 |
| 5.0 | ≈ 3.7 单位 | ≈ 5.9 单位 |
| 6.0 | ≈ 3.1 单位 | ≈ 4.9 单位 |
顶点悬停
| 参数 | 类型 | 当前默认 | 推荐(高速手感) | 说明 |
|---|---|---|---|---|
ApexThreshold |
float | 3.0 | 3.0 | 当 |垂直速度| 低于此值时触发悬停。单位:单位/秒。 |
ApexGravityMultiplier |
float [0,1] | 0.3 | 0.3 | 悬停期间重力系数。0 = 完全停止;1 = 无效果。 |
调整方向:
- 想要更明显的"飘"感 → 调高
ApexThreshold(更早进入悬停)或调低ApexGravityMultiplier - 想要更紧实干脆 → 调低
ApexThreshold(接近 0 等于关闭功能)
下落段
| 参数 | 类型 | 当前默认 | 推荐(高速手感) | 说明 |
|---|---|---|---|---|
FallGravityMult |
float | 3.5 | 2.5 | 在 FallState 中每 FixedUpdate 额外叠加的速度量 = 9.81 × (FallGravityMult−1) × fixedDeltaTime。注意:已有 DefaultGravityScale 提供基础重力,此值是叠加量,不是总倍率。 |
MaxFallSpeed |
float | 22.0 | 28.0 | 终端速度(最大下落速度,单位/秒)。防止无限加速。 |
💡
DefaultGravityScale = 6时,基础下落加速度已达58.9 m/s²,FallGravityMult只需设 2.5(额外 14.7 m/s²)即可达到总体73.6 m/s²的快速下落,等效重力倍率约 7.5×。FallGravityMult不需要再设很高。
变高跳(松键截断)
| 参数 | 类型 | 当前默认 | 推荐(高速手感) | 说明 |
|---|---|---|---|---|
JumpCutMultiplier |
float [0,1] | 0.35 | 0.35 | 松开跳跃键时将当前垂直速度乘以此值。越小 → 短跳越矮,跳跃高度范围越大。 |
CoyoteTime |
float | 0.12 | 0.10 | 离开平台边缘后仍可起跳的宽限时间(秒)。 |
最小 / 最大跳跃高度配置方法
跳跃分短按(立即松键,速度被截断)和长按(全程按住,达到最大高度):
高度计算公式(忽略顶点悬停段微小修正):
H_{max} = \frac{JumpForce^2}{2 \times 9.81 \times DefaultGravityScale}
H_{min} = \frac{(JumpForce \times JumpCutMultiplier)^2}{2 \times 9.81 \times DefaultGravityScale} = H_{max} \times JumpCutMultiplier^2
反向推导(已知目标高度求参数):
JumpForce = \sqrt{2 \times 9.81 \times DefaultGravityScale \times H_{max}}
JumpCutMultiplier = \sqrt{\frac{H_{min}}{H_{max}}}
不同比例对应的 JumpCutMultiplier 参考表(DefaultGravityScale = 6):
| 目标 H_max | 目标 H_min | 比例 | JumpForce | JumpCutMultiplier |
|---|---|---|---|---|
| 5.0 单位 | 1.25 单位 | 1:4 | 24.3 | 0.50 |
| 5.0 单位 | 0.80 单位 | 1:6 | 24.3 | 0.41 |
| 5.0 单位 | 0.50 单位 | 1:10 | 24.3 | 0.32 |
| 4.0 单位 | 0.60 单位 | 1:7 | 21.7 | 0.39 |
💡 当前推荐值
JumpCutMultiplier = 0.35对应约 1:8 的高度比,短按跳跃约为长按的 12%,手感短促有力。
若希望短按有一个明显可见的小跳(约 1 格高),比例控制在 1:4 ~ 1:5,JumpCutMultiplier ≈ 0.45 ~ 0.50。
1.3 推荐参数组合
以下三组参数可直接在 SO 中录入作为起点:
| 风格 | DefaultGravityScale | JumpForce | ApexThreshold | ApexGravityMultiplier | FallGravityMult | JumpCutMultiplier |
|---|---|---|---|---|---|---|
| 高速紧实(类空洞骑士) | 6.0 | 24.0 | 3.0 | 0.30 | 2.5 | 0.35 |
| 标准平台(居中) | 4.5 | 21.0 | 2.5 | 0.35 | 3.0 | 0.40 |
| 漂浮感(慢节奏) | 3.0 | 19.0 | 4.0 | 0.20 | 2.0 | 0.50 |
1.4 跳跃节奏速查(高速紧实组合)
使用 DefaultGravityScale=6, JumpForce=24, ApexThreshold=3, ApexGravityMultiplier=0.3 时:
- 上升段时长(vy: 24 → 3):
(24−3) / (9.81×6) ≈ 0.357s - 顶点悬停时长(vy: 3 → 0,重力×0.3):
3 / (9.81×6×0.3) ≈ 0.170s - 总上升时长:
≈ 0.53s - 顶点高度:
≈ 5.0 单位 - 下落至起跳点时长(总重力 ~73.6 m/s²):
≈ 0.37s - 总跳跃时长:≈ 0.90s
二、冲刺系统
2.1 物理模型概述
地面冲刺: ──────────────────────► 结束 → 双轴速度归零 → Idle/Fall
重力关闭 DashSpeed ZeroVelocity() + 恢复重力
空中冲刺: ──────────────────────► 结束 → 双轴速度归零 → FallState(垂直坠落)
重力关闭 DashSpeed ZeroVelocity() + 恢复重力
两者使用完全相同的 DashSpeed × DashDuration,冲刺距离由设计保证一致。
若实测感觉有差异,是地面摩擦/碰撞响应造成的视觉误差,不影响实际数值距离。
结束行为差异(设计意图,非 bug):
| 地面冲刺结束 | 空中冲刺结束 | |
|---|---|---|
| 速度处理 | ZeroVelocity() — 双轴立即归零 |
ZeroVelocity() — 双轴立即归零 |
| 视觉效果 | 角色在冲刺末端原位停止 | 角色在原位瞬间停止,垂直坠落 |
| 撞墙提前结束 | 同上,ZeroVelocity() + 恢复重力 |
同左 |
2.2 参数说明与推荐值
| 参数 | 类型 | 当前默认 | 推荐(类空洞骑士) | 说明 |
|---|---|---|---|---|
DashSpeed |
float | 25.0 | 22.0 | 冲刺水平速度(单位/秒)。影响单次冲刺位移 = DashSpeed × DashDuration。 |
DashDuration |
float | 0.35 | 0.30 | 冲刺持续时长(秒)。 |
DashCooldown |
float | 0.60 | 0.50 | 落地后到可再次冲刺的等待时长(秒)。 |
MaxAerialDashes |
int | 1 | 1 | 每次腾空可使用的空中冲刺次数,落地重置。 |
单次冲刺水平位移速查:
| DashSpeed | DashDuration | 水平位移 |
|---|---|---|
| 25.0 | 0.35s | 8.75 单位 |
| 22.0 | 0.30s | 6.60 单位 |
| 20.0 | 0.32s | 6.40 单位 |
💡 项目网格如果是 1 unit = 1 格,推荐控制冲刺位移在 6-8 格;过长会导致跳过障碍物布局。
2.3 无敌帧参数
| 参数 | 类型 | 推荐值 | 说明 |
|---|---|---|---|
DashInvincibilityDuration |
float | 0.20 | 冲刺无敌窗口时长(秒)。仅为前段,窗口结束前角色仍在冲刺中可被打断。 |
DashInvincibilityCooldown |
float | 0.90 | 无敌帧专属冷却(秒)。CD 内再次冲刺不获得无敌,防止连冲无限无敌。 |
⚠️ 无敌功能还依赖
PlayerStats中的HasAbility(InvincibleDash)能力解锁,未解锁时此参数无效。
三、常见调参问题排查
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 跳跃感觉很"飘",落地慢 | DefaultGravityScale 过低,或 FallGravityMult 过低 |
调高 DefaultGravityScale(→5-6),同步调高 JumpForce |
| 顶点没有悬停感 | ApexThreshold 过低或 ApexGravityMultiplier 过高 |
调高 ApexThreshold(→3-5),调低 ApexGravityMultiplier(→0.2-0.3) |
| 短按跳跃与长按高度差不明显 | JumpCutMultiplier 过高 |
调低至 0.25-0.35 |
| 空中冲刺结束后角色向前飞 | 旧版本 bug(已修复):AerialDashState 结束时未归零速度 | 确认使用当前版本代码 |
| 冲刺距离太长,穿越关卡障碍 | DashSpeed × DashDuration 过大 |
降低 DashSpeed 或 DashDuration |
| 冲刺 CD 太长,影响流畅感 | DashCooldown 过高 |
降至 0.4-0.5s |
| 离开平台边缘后无法起跳 | CoyoteTime 太短 |
调高至 0.10-0.15s |
四、修改历史
| 日期 | 修改内容 |
|---|---|
| 2026-05-17 | 初版:新增顶点悬停参数(ApexThreshold / ApexGravityMultiplier);修复空中冲刺结束速度未归零问题;JumpCutMultiplier 默认值从 0.45 调整为 0.35 |