chore: initial commit

This commit is contained in:
2026-05-08 11:04:00 +08:00
commit f55d2a57c3
6278 changed files with 866081 additions and 0 deletions

View File

@@ -0,0 +1,333 @@
# 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物理不受影响