Files
zeling_v2/Docs/Tuning/PlayerJumpDash_Tuning.md
2026-05-19 11:50:21 +08:00

214 lines
9.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 玩家跳跃 / 冲刺手感调参指南
**配置文件**`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| ≥ ApexThreshold | `9.81 × DefaultGravityScale` |
| ② 顶点悬停 | `JumpState`|vy| < ApexThreshold | `9.81 × DefaultGravityScale × ApexGravityMultiplier` |
| ③ 下落 | `FallState` | `9.81 × DefaultGravityScale` + `9.81 × (FallGravityMult1) / 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 × (FallGravityMult1) × 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`(243) / (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 |