hitstop、屏幕震动、缓动曲线:用threejs-gameplay-systems为Three.js游戏注入手感
【免费下载链接】threejs-game-skillsAgent skills for building playable, polished Three.js browser games with gameplay, AAA-style graphics, UI, QA, and optional AI-generated 3D, image, and audio assets.项目地址: https://gitcode.com/gh_mirrors/th/threejs-game-skills
本文基于开源项目 threejs-game-skills,围绕其中的 gameplay 技能 threejs-gameplay-systems,讲透 hitstop(顿帧)、trauma 式屏幕震动、缓动曲线这三大手感技巧,帮你在一个下午内让 Three.js 浏览器游戏拥有 AAA 级的打击感与反馈。🎮
上图是"少即是多"的典型:没有粒子风暴,只有竞技场、角色和几个拾取物。但只要拾取反馈、相机跟随和 HUD 脉冲调到位,它就已经"像个游戏"了。
什么是游戏手感:先记住5层反馈顺序
很多新手调手感的第一步是"加特效",结果越加越乱。references/game-feel.md 给出了一条清晰的施工顺序——每层都依赖上一层:
- 输入延迟:玩家的主操作必须在约100ms内产生可见响应。这是地基,控制再烂,堆再多特效也救不回来;
- 响应曲线:玩家自身运动的加速、减速、缓动与过冲;
- 接触反馈:撞击、拾取、得分瞬间的闪烁、挤压、顿帧、震动;
- 相机:震动、踢击、FOV 冲击,放大冲击感但不遮挡战场;
- 视听同步:声音与画面同一帧触发,并带一点音高/音量抖动,避免"机关枪式"的机械重复。
⚠️可读性铁律:反馈必须帮助玩家理解状态,绝不能遮住下一个要决策的目标。震动、闪白、顿帧如果挡住了玩家下一步要看的东西,那是 bug,不是打磨。
Hitstop 顿帧:给重击注入"重量感"的 60–90ms
Hitstop 是重击后极短的一下"微卡",是成本最低、效果最炸的重力感来源。threejs-gameplay-systems 对它的三条铁律值得直接背下来:
- 只缩放"游戏时间",从不暂停渲染循环。顿帧期间世界慢放,但相机、震动、补间、HUD 依然用真实时间帧帧更新——冻结的那一瞬间必须看得见,画面才能传达冲击;
- 时长建议 60–90ms,时间缩放约 0.05,且只用于"重接触"(大爆炸、玩家受击、Boss 命中);
- 每个小事件都顿帧是反模式:游戏会显得卡顿而不是有力量。
一个直觉类比:拾取金币不需要顿帧,爆炸必须顿帧。分层越对,游戏越"贵"。
配合顿帧的还有FOV 冲击(加速/受击时 FOV 加 4°–8° 再回落)和挤压拉伸(跳跃起跳拉高 1.15 倍、落地压扁 0.9 倍)。三者叠加,就是一帧之间的"电影感"。
屏幕震动:trauma 式震动的三个参数
直接"相机随机抖一下"是新手方案,调不好就恶心。skill 采用trauma(创伤值)模型,三个关键参数:
| 参数 | 作用 | 推荐值 |
|---|---|---|
| trauma² 曲线 | 小事件几乎不动,大事件猛震 | 震动幅度 = trauma 的平方 |
| 每秒衰减 | 震得下去 | 约 1.4/秒 |
| 硬上限 | 连续爆炸不把相机甩飞 | 封顶 1.0 |
官方推荐的事件强度:拾取 0.15、受击 0.4、爆炸 0.7。拾取只是轻轻一晃,爆炸则整个屏幕一颤——强度差本身就是信息量。
另一个隐藏细节:震动的噪声要用累计游戏时间驱动,而不是系统时钟——否则顿帧和掉帧时,特效会和模拟状态脱节。
缓动曲线:覆盖90%手感工作的3条曲线
references/game-feel.md 内置了一个零依赖的 Tween 管理器,只用三条曲线就够:
- easeInQuad:越来越快,适合蓄力、下坠开场;
- easeOutCubic:先快后慢,覆盖绝大多数"减速归位"反馈——拾取弹窗上浮、发光回落、镜头收拢;
- easeOutBack:结尾会"冲过头"的过冲曲线,就是弹性回弹的来源,挤压拉伸的"Q弹"全靠它。
记住一个体积守恒技巧:挤压时 Y 轴缩小s倍,X/Z 轴放大1/√s倍,角色才不会越压越"瘪"。
反馈栈速查表:每个事件的参数清单
手感不是单个特效,而是一整套叠加。这是 skill 调优表的核心内容:
| 事件 | 反馈栈 |
|---|---|
| 拾取 | 拾取弹出 + HUD 数字弹跳 + 音高抖动提示音 + 0.15 trauma |
| 玩家受击 | 70ms 顿帧 + 0.4 trauma + 受击闪光 + 手柄震动 180ms + HUD 脉冲 |
| 击杀敌人 | 40ms 顿帧 + 0.3 trauma + 闪光 + 音高抖动爆炸音 |
| 加速/冲刺 | FOV +6° + 拉伸 1.15 倍 + 呼啸音 + 轻震动 |
| 跳跃/落地 | 起跳拉伸、落地压扁 0.9 + 脚步声 + 落地 0.2 trauma |
| 爆炸 | 90ms 顿帧 + 0.7 trauma + 全屏白闪 + FOV +8° + 重震动 |
强事件层数更多、幅度更大;弱事件保持克制。对照 checklists/game-feel.md 逐项打勾,是判断"手感是否达标"的最快方式。✅
6个最常被踩的手感翻车点
- ❌常开震动或震而不衰:令人恶心,还遮住战场;
- ❌顿帧滥用:小事也卡,游戏像坏了;
- ❌反馈卡输入:主操作永远不能等动画播完才能按;
- ❌用系统时钟驱动特效:掉帧即穿帮,必须用累计游戏时间;
- ❌随机数直接 Math.random:会破坏项目的确定性测试钩子和截图基线,要走 src/utils/random.ts 的带种子随机;
- ❌发光材质忘了设基础 emissive:受击闪白什么都看不见。
快速上手:从安装到第一次手感调优
git clone https://gitcode.com/gh_mirrors/th/threejs-game-skills cd threejs-game-skills ./install.sh --codex # 或 ./install.sh --claude / --all然后在 Codex 或 Claude Code 里用自然语言点名技能即可,例如:
Use threejs-game-director to build a playable arena game, then use threejs-gameplay-systems to tune game feel: hitstop, trauma-based screenshake, easing and a full feedback stack for every core event.新项目可以直接用打包脚手架起步:
python3 skills/threejs-gameplay-systems/scripts/create_threejs_game.py ./my-game它会生成一套 Vite + TypeScript + Three.js 工程(含相机跟随 CameraRig.ts、碰撞、音频系统、HUD 和确定性测试钩子),你只需要在 Game.ts 的update里按"输入 → 玩法 → 反馈 → 相机 → HUD"的顺序把特效插进去。
参考资料在哪里
- 技能入口:SKILL.md
- 手感完整配方(含全部代码级参考):references/game-feel.md
- 手感验收清单:references/checklists/game-feel.md
- 玩法与调优流程:references/gameplay-workflows.md
- 完整游戏脚手架:assets/threejs-vite-game/
💡 一句话总结:先修输入延迟,再上响应曲线,最后才谈打击反馈——顺序对了,Three.js 游戏的手感自然"贵"起来。
【免费下载链接】threejs-game-skillsAgent skills for building playable, polished Three.js browser games with gameplay, AAA-style graphics, UI, QA, and optional AI-generated 3D, image, and audio assets.项目地址: https://gitcode.com/gh_mirrors/th/threejs-game-skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考