角色能力,存档

This commit is contained in:
2026-05-19 11:50:21 +08:00
parent d25f237e76
commit 2dcb7a961a
136 changed files with 36035 additions and 27551 deletions

View File

@@ -0,0 +1,213 @@
# 玩家跳跃 / 冲刺手感调参指南
**配置文件**`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 |