14 KiB
14 KiB
23 · 游戏手感调优指南(Game Feel Tuning Guide)
所属文档集 ← 返回索引 · 总览
适用人员 策划 / 程序员 / 动画师
相关系统BaseGames.Combat·BaseGames.Feedback·BaseGames.Player· Feel/MMFeedbacks
目录
- 设计理念
- 玩家移动参数
- 跳跃手感参数
- 输入缓冲时长
- 战斗打击感参数
- 弹反系统参数
- 受伤 / 死亡反馈
- BOSS 战手感规范
- 镜头与屏幕震动配置表
- 音效音量平衡
- Feel MMF_Player 预设速查表
- 调优工作流 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):
[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 + 15;BOSS 硬直 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 dB(0.5s 渐变),BOSS BGM 淡入
- BOSS 死亡 → BOSS BGM 淡出(1.0s)→ 区域 BGM 淡入(0.8s)
- 弹反成功音效播放时 → 其他 SFX 临时降至 -6 dB(0.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 次以上,感受节奏
调优迭代建议
- 先调 Hitstop:哪怕 0.01s 的差异都能感知,先到位
- 再调音效:使用 -3dB 和 0dB 对比,选择更有力的
- 最后调震动:震动要配合音效节拍,不要只是随机添加
- 对比参考:在屏幕右侧开一个《丝之歌》Demo 视频,反复对比攻击节奏
关键数字不要随意更改的原因
- Coyote Time 0.15s:低于 0.1s 玩家感觉不到(失去意义),高于 0.2s 感觉像 Bug
- 弹反窗口 0.28s:经过大量玩家测试的最优平衡点(太短 = 无法使用,太长 = 无技术含量)
- 地面减速 120 > 地面加速 80:停下要比启动快,避免"冰面感"
- Hitstop 用 TimeScale 不用暂停 Time:配合
Animancer.Speed一起设为 0,物理不受影响