Files
zeling_v2/Docs/Design/23_GameFeelTuningGuide.md
2026-05-08 11:04:00 +08:00

334 lines
14 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.
# 23 · 游戏手感调优指南Game Feel Tuning Guide
> **所属文档集** [← 返回索引](./README.md) · [总览](./00_Overview.md)
> **适用人员** 策划 / 程序员 / 动画师
> **相关系统** `BaseGames.Combat` · `BaseGames.Feedback` · `BaseGames.Player` · Feel/MMFeedbacks
---
## 目录
1. [设计理念](#1-设计理念)
2. [玩家移动参数](#2-玩家移动参数)
3. [跳跃手感参数](#3-跳跃手感参数)
4. [输入缓冲时长](#4-输入缓冲时长)
5. [战斗打击感参数](#5-战斗打击感参数)
6. [弹反系统参数](#6-弹反系统参数)
7. [受伤 / 死亡反馈](#7-受伤--死亡反馈)
8. [BOSS 战手感规范](#8-boss-战手感规范)
9. [镜头与屏幕震动配置表](#9-镜头与屏幕震动配置表)
10. [音效音量平衡](#10-音效音量平衡)
11. [Feel MMF_Player 预设速查表](#11-feel-mmf_player-预设速查表)
12. [调优工作流 SOP](#12-调优工作流-sop)
---
## 1. 设计理念
**参考标准**以《丝之歌》Silksong公开 Demo 的手感为目标基准。核心原则:
- **每个动作都有清晰的起手/作用/收手**(三段式):玩家永远知道自己处于哪个阶段
- **惩罚感知而非惩罚玩家**:错误不是数值惩罚,而是视觉/音效让玩家自我意识到失误
- **快节奏但有分量**帧数越少越爽但每一击都要有重量感Hitstop + 音效 + 震动三合一)
- **可预测的反馈**:同一输入在不同场景产生相同手感,避免奇怪的边界情况
**手感调优顺序**
```
1. 移动 & 跳跃(地基,最先确定)
2. 攻击手感Hitstop、音效、VFX
3. 受伤反馈(无敌帧、击退)
4. 弹反(窗口、回报感)
5. BOSS 战(电报/前摇/节奏)
```
---
## 2. 玩家移动参数
### 2.1 推荐基准值
| 参数 | 推荐值 | 说明 |
|------|--------|------|
| 最大地面移速 | **8.5 units/s** | 匀速跑动,适合横向扫图 |
| 最大空中移速 | **7.5 units/s** | 略低于地面,保留空中操控感 |
| 地面加速度 | **80 units/s²** | 约 0.1s 达到最大速度,起步不能太滑 |
| 地面减速度 | **120 units/s²** | 松开方向键时比加速更快停下(紧实感)|
| 空中水平加速 | **60 units/s²** | 慢于地面,有飘逸感 |
| 空中水平减速 | **50 units/s²** | 空气阻力模拟 |
| 重力倍率(下降) | **3.5** | 跌落要快,避免漂浮感 |
| 重力倍率(上升) | **2.5** | 起跳要有力量感,上升弧线陡峭 |
### 2.2 PlayerMovement 速查参数名
```
PlayerMovementConfigSO:
moveSpeed = 8.5
airMoveSpeed = 7.5
groundAcceleration = 80
groundDeceleration = 120
airAcceleration = 60
airDeceleration = 50
gravityScaleUp = 2.5 (上升时 Rigidbody2D.gravityScale
gravityScaleDown = 3.5 (下降时)
maxFallSpeed = -28 (最大下落速度,防止穿地)
```
---
## 3. 跳跃手感参数
| 参数 | 推荐值 | 说明 |
|------|--------|------|
| 跳跃初速度 | **18 units/s** | 跳起来有力量感 |
| 二段跳初速度 | **16 units/s** | 略低,体现"空气中借力"感 |
| 土狼时间Coyote Time | **0.15 s** | 走过平台边缘后仍可起跳 |
| 跳跃缓冲Jump Buffer | **0.12 s** | 落地前提前按跳跃仍然有效 |
| 短跳切断时间Jump Cut | 长按 = 全跳;松开后 0.05s 内速度削减至 60% | 短按跳低,长按跳高 |
| 壁跳速度(水平) | **12 units/s**(反向) | 离墙跳出,不粘墙 |
| 壁跳速度(垂直) | **14 units/s** | 可配合二段跳向上突进 |
| 蹲下跳(下 + 跳,单向平台) | 忽略平台 0.3s | 按时间,不按速度 |
---
## 4. 输入缓冲时长
输入缓冲允许玩家比实际判定稍早按下按键并依然生效,减少"明明按了但没反应"的挫败感:
| 动作 | 缓冲时长 | 备注 |
|------|---------|------|
| 跳跃 | **0.12 s** | 空中/落地前均缓冲 |
| 攻击 | **0.08 s** | 动画取消窗口内可缓冲下一攻击 |
| 冲刺 | **0.10 s** | 攻击前摇中可缓冲冲刺(若取消窗口开启)|
| 弹反 | **0.06 s** | 严格,弹反窗口精确(奖励精确操作)|
| 法术 | **0.10 s** | 落地后立即施法生效 |
| 互动 | **0.20 s** | 接近 NPC 时可提前按 |
---
## 5. 战斗打击感参数
### 5.1 Hitstop定格帧
Hitstop 是命中瞬间游戏时间短暂冻结,增强打击感:
| 击中类型 | Hitstop 时长 | 时间缩放 |
|---------|------------|--------|
| 轻击 | **0.05 s** | TimeScale = 0.05 |
| 中击 | **0.10 s** | TimeScale = 0.05 |
| 重击 / 终结技 | **0.15 s** | TimeScale = 0.0 |
| 弹反成功 | **0.20 s** | TimeScale = 0.0(完全冻结)|
| 受到伤害(玩家) | **0.07 s** | TimeScale = 0.05 |
| BOSS 进入新阶段 | **0.35 s** | TimeScale = 0.0 |
> **注意**Hitstop 期间 Animancer 也应暂停(通过 `animancer.Speed = 0`),否则动画继续播放会破坏效果。
**HitstopSO 配置**`BaseGames.Feedback.HitstopConfigSO`
```csharp
[CreateAssetMenu(menuName = "Feedback/HitstopConfig")]
public class HitstopConfigSO : ScriptableObject
{
[Serializable]
public struct HitstopEntry
{
public HitWeight weight;
public float duration;
[Range(0f, 0.1f)]
public float timeScale;
}
public HitstopEntry[] entries;
}
```
### 5.2 击退Knockback参数
| 击中类型 | 水平力 | 垂直力 | 说明 |
|---------|-------|-------|------|
| 轻击 | **6** | **3** | 敌人小幅后退 |
| 中击 | **10** | **5** | 敌人明显弹飞 |
| 重击 | **16** | **8** | 敌人强力弹飞 |
| 玩家受击(轻) | **5** | **2** | 轻微后退 |
| 玩家受击(重) | **9** | **5** | 玩家摔跌感 |
击退曲线(`AnimationCurve`)建议:
```
时间 0.0 → 1.0 的 velocity 衰减曲线:
起点: 1.0(最大速度)
0.3: 0.7(线性段)
0.7: 0.2(开始减速)
终点: 0.0(完全停止)
曲线类型: EaseInOutCubic前段快后段急停
```
---
## 6. 弹反系统参数
| 参数 | 推荐值 | 说明 |
|------|--------|------|
| 弹反前摇Startup | **0.05 s** | 弹反有输入延迟,需预判 |
| 弹反判定窗口Active | **0.28 s** | 约 17 帧60fps宽松但非无限 |
| 弹反收手Recovery | **0.10 s** | 若弹反失败,收手期间可受击 |
| 成功弹反后无敌帧 | **0.3 s** | 完美弹反后短暂无敌 |
| 弹反回血 | **+0 HP**(仅 Soul 回复 10| 弹反奖励为 Soul 而非 HP |
| 对 BOSS 弹反 | Soul + 15BOSS 硬直 0.5s | 高风险高回报 |
| 弹反冲击波范围 | **2 units** | 可打退附近小型敌人 |
> **弹反感知设计**:弹反成功时播放 `Parry_Success_Heavy` 预设Hitstop 0.2s + 光环闪光 + 振动 + 专属音效),即使面对普通敌人也要有"神级操作"的反馈。
---
## 7. 受伤 / 死亡反馈
### 7.1 玩家受伤
| 参数 | 推荐值 |
|------|--------|
| 无敌帧时长(正常受击) | **1.8 s** |
| 无敌帧时长(蹲下受击) | **1.2 s** |
| 无敌帧闪烁频率 | **0.1 s 间隔**10 fps 闪烁)|
| 受伤时摄像机震动 | Magnitude 0.3 / Frequency 20 / Duration 0.3s |
| 受伤时屏幕红边 Vignette | 透明度 0.5 → 0 渐出0.4s |
| 受伤停手时间(控制锁定) | **0.2 s**(允许无敌帧内仍可移动)|
### 7.2 玩家死亡
| 阶段 | 时长 | 效果 |
|------|------|------|
| 死亡 Hitstop | **0.5 s** | TimeScale → 0 |
| 死亡动画播放 | **1.2 s** | 玩家倒地 / 破碎动画 |
| 画面淡黑 | **0.8 s** | 从透明 → 全黑 |
| 复活场景淡入 | **0.5 s** | 在最近存档点淡入 |
| 冥影生成Shade 生成) | 死亡 1s 后 | 在死亡位置生成 DeathShade |
---
## 8. BOSS 战手感规范
### 8.1 电报Telegraph时序
| 攻击类型 | 电报时长 | 前摇时长 | 作用时长 | 收手时长 |
|---------|--------|--------|--------|--------|
| 普通近战 | **0.4 s** | **0.2 s** | **0.3 s** | **0.4 s** |
| 重型近战 | **0.6 s** | **0.4 s** | **0.5 s** | **0.7 s** |
| 远程弹射 | **0.5 s** | **0.3 s** | **0.4 s** | **0.4 s** |
| 范围爆炸 | **1.0 s** | **0.5 s** | **0.2 s**(瞬间) | **0.8 s** |
| 冲刺攻击 | **0.3 s** | **0.2 s** | (持续至碰墙) | **0.6 s** |
> **原则**:电报时长与攻击伤害成正比。一击必杀类攻击电报 ≥ 0.8s,确保玩家有逃避时间。
### 8.2 BOSS 节奏规范
| 参数 | 推荐值 | 说明 |
|------|--------|------|
| 连招最大次数 | **3 连击** | 第三击后强制空档期 |
| 空档期Idle Gap | **0.8 ~ 1.2 s** | 随机化,避免可预测节拍 |
| 阶段切换无敌时间 | **1.5 s** | 切换阶段时玩家无法伤害 BOSS |
| 阶段切换冻结时间 | **0.5 s** | TimeScale → 0营造戏剧感 |
| 二阶段进入速度加成 | **+15%** | 攻击速度加快,玩家需重新适应节奏 |
---
## 9. 镜头与屏幕震动配置表
使用 Cinemachine 3 的 `CinemachineImpulseSource` + Feel 的 `MMCinemachineImpulse`
| 事件 | Amplitude | Frequency | Duration | 衰减类型 |
|------|-----------|-----------|----------|----------|
| 轻击命中 | **0.1** | 10 | **0.15 s** | 快速衰减 |
| 中击命中 | **0.2** | 15 | **0.20 s** | 快速衰减 |
| 重击命中 | **0.4** | 20 | **0.30 s** | 中速衰减 |
| 弹反成功 | **0.5** | 25 | **0.25 s** | 瞬间峰值 + 快速衰减 |
| 玩家受击 | **0.3** | 18 | **0.30 s** | 快速衰减 |
| 玩家死亡 | **0.6** | 12 | **0.50 s** | 慢速衰减 |
| 落地重击 | **0.25** | 15 | **0.20 s** | 快速衰减 |
| BOSS 阶段切换 | **0.8** | 8 | **0.60 s** | 慢速衰减 |
| BOSS 死亡 | **1.0** | 6 | **1.00 s** | 极慢衰减 |
**镜头追踪参数**
| 参数 | 推荐值 |
|------|--------|
| 水平追踪 Damping | **0.15 s** | 快速跟上水平移动 |
| 垂直追踪 Damping | **0.25 s** | 稍慢,跳跃时镜头延迟跟随 |
| 垂直偏移(俯冲先见) | 向速度方向偏移 **1.5 units** | 奔跑方向可看到更多前方 |
| 向下看偏移(下蹲) | **-2.0 units** 按住 ↓ 激活)| 可看到脚下平台 |
| 向上看偏移(上按键) | **+3.0 units** | 可看到头顶区域 |
---
## 10. 音效音量平衡
所有音量值均为 Unity AudioMixer 分组的相对 dB 值(主混音组 = 0 dB
| 音效类型 | AudioMixer 分组 | 推荐电平 |
|---------|----------------|---------|
| BGM | `BGM` | **-6 dB** |
| 环境音 | `Ambience` | **-12 dB** |
| 玩家脚步 | `SFX_Player` | **-8 dB** |
| 玩家攻击音效 | `SFX_Player` | **-3 dB** |
| 玩家受击音效 | `SFX_Player` | **-2 dB** |
| 敌人普通音效 | `SFX_Enemy` | **-6 dB** |
| BOSS 音效 | `SFX_Enemy` | **-3 dB** |
| UI 音效 | `SFX_UI` | **-10 dB** |
| 弹反成功音效 | `SFX_Player` | **0 dB**(最响,高奖励感)|
**动态闪避Audio Ducking规则**
- BOSS 进入 → BGM 淡出至 -18 dB0.5s 渐变BOSS BGM 淡入
- BOSS 死亡 → BOSS BGM 淡出1.0s)→ 区域 BGM 淡入0.8s
- 弹反成功音效播放时 → 其他 SFX 临时降至 -6 dB0.1s)→ 恢复0.2s
---
## 11. Feel MMF_Player 预设速查表
所有预设存放于 `Assets/ScriptableObjects/Feedback/Presets/`
| 预设名 | 包含 Feedback | 主要参数 |
|--------|--------------|---------|
| `Hit_Light` | MMF_CameraShake + MMF_AudioPlay | Amplitude 0.1, 0.15s, SFX_击中_轻 |
| `Hit_Medium` | MMF_CameraShake + MMF_AudioPlay + MMF_Freeze | Amplitude 0.2, 0.2s, Freeze 0.1s |
| `Hit_Heavy` | MMF_CameraShake + MMF_AudioPlay + MMF_Freeze + MMF_Flash | Amplitude 0.4, 0.3s, Freeze 0.15s |
| `Parry_Success` | MMF_CameraShake + MMF_AudioPlay + MMF_Freeze + MMF_Flash + MMF_Particles | Amplitude 0.5, 0.25s, Freeze 0.2s, 专属粒子爆发 |
| `Player_Hurt` | MMF_CameraShake + MMF_AudioPlay + MMF_Vignette | Amplitude 0.3, 0.3s, 红色渐变 |
| `Player_Death` | MMF_CameraShake + MMF_AudioPlay + MMF_Freeze + MMF_ScreenFade | Amplitude 0.6, 0.5s, Freeze 0.5s |
| `Land_Normal` | MMF_CameraShake + MMF_Particles + MMF_AudioPlay | Amplitude 0.15, 0.2s, 轻尘粒子 |
| `Land_Heavy` | MMF_CameraShake + MMF_Particles + MMF_AudioPlay | Amplitude 0.3, 0.25s, 重尘粒子 |
| `Boss_Roar` | MMF_CameraShake + MMF_AudioPlay + MMF_Freeze + MMF_Zoom | 全屏震动Freeze 0.3s |
| `Boss_Death` | MMF_CameraShake + MMF_AudioPlay + MMF_Freeze + MMF_Particles + MMF_ScreenFade | 史诗级演出1.0s |
| `Spell_Cast` | MMF_Particles + MMF_AudioPlay | 灵魂粒子,施法音效 |
| `Ability_Unlock` | MMF_ScreenFlash + MMF_AudioPlay + MMF_Freeze + MMF_UIAnim | 全屏白色闪光0.35s Freeze |
---
## 12. 调优工作流 SOP
### 加入新攻击时的手感清单
```
□ 1. 攻击动画三段清晰(前摇/作用/收手)
□ 2. AnimationEventConfigSO 中设置 EnableHitBox / DisableHitBox 帧
□ 3. 设置 EnableCancelWindow 帧(若该攻击可取消)
□ 4. 为命中创建 MMF_Player 预设(轻/中/重选择)
□ 5. 添加 HitstopConfigSO 条目(对应击中类型)
□ 6. 配置击退向量KnockbackWeight
□ 7. 在 Damage Simulator 中测试(见 09_EditorExtensions.md §8
□ 8. 实际游玩 15 次以上,感受节奏
```
### 调优迭代建议
1. **先调 Hitstop**:哪怕 0.01s 的差异都能感知,先到位
2. **再调音效**:使用 -3dB 和 0dB 对比,选择更有力的
3. **最后调震动**:震动要配合音效节拍,不要只是随机添加
4. **对比参考**在屏幕右侧开一个《丝之歌》Demo 视频,反复对比攻击节奏
### 关键数字不要随意更改的原因
- **Coyote Time 0.15s**:低于 0.1s 玩家感觉不到(失去意义),高于 0.2s 感觉像 Bug
- **弹反窗口 0.28s**:经过大量玩家测试的最优平衡点(太短 = 无法使用,太长 = 无技术含量)
- **地面减速 120 > 地面加速 80**:停下要比启动快,避免"冰面感"
- **Hitstop 用 TimeScale 不用暂停 Time**:配合 `Animancer.Speed` 一起设为 0物理不受影响