← 返回首页
《屏幕震动的艺术》:逐项验证动作反馈,而非只加震屏
依据讲座报道与公开演示项目镜像整理,拆解射击节奏、命中反馈、镜头、短暂停顿与战场痕迹;仅核读镜像步骤表与 GameMaker 脚本(未执行),代码细节只称「镜像实现」,不逐字对应 2013 年台上版本。
核心观点
手感可以从「逐项可比较的反馈」入手打磨:用同一个可玩原型观察微小改动如何改变射击体验。
原标题The Art of Screenshake
作者简介 Jan Willem Nijman · Vlambeer 联合创始人,参与《Super Crate Box》《Nuclear Throne》等动作游戏设计。
先建立可比较的原型,再逐项改变手感
- 可比较原型: 演示从平淡的横版射击开始,逐项增加或修改反馈,便于观察每项改动各自贡献了什么。
- 30 个步骤: 镜像中的
scrSteps.gml保存了 30 个步骤;控制器可以前后切换阶段,其他对象依据当前步骤启用相应行为。 - 可回退的结构: 玩法对象基本相同、变化可以回退,观众才容易辨认某一次调整到底贡献了什么。
- 并非单一参数: 最终效果并不是一个「震屏强度」参数产生的,而是命中频率、表现和压力共同变化的结果。
先调发生了什么,再调发生时看见什么
- 早期步骤: 除了基础动画和声音,还降低敌人生命、提高射速、增加敌人、放大子弹并提高弹速。
- 不是同一种润色: 生命与射速改变击杀节奏,弹速改变从开火到命中的时间,子弹外观则改变可见性。
- 镜像数值: 敌人生命从早期的 20 改为 3,基础子弹水平速度从 3 改为 12。
- 数值边界: 这些数值只属于这个演示,用来说明「更爽」有时来自规则与时间关系的变化,不能全部归因于粒子或音效。
- 后期加压: 随后加入一定散布,后期还有多发子弹和更多、更快的敌人;玩家输出与战场压力一起上升。
- 不是单向调强: 演示并非把所有参数单向调强,而是在新的反馈密度下继续组织挑战。
命中反馈由多个对象共同完成
- 多个对象分工: 步骤表把命中特效、受击动画、敌人击退分别列出。
- 镜像实现: 子弹命中后生成碰撞效果,伤害脚本切换受击姿态;允许击退时还检查后方位置是否可用,再改变敌人位置。
这些反馈分别回答不同问题:
| 反馈 | 玩家获得的信息 |
|---|---|
| 子弹与枪口表现 | 已经开火、射击朝向 |
| 命中特效与受击姿势 | 攻击接触到了目标 |
| 敌人位移 | 冲击改变了对方身体 |
| 尸体、弹壳等残留 | 刚才的行动在场景里留下痕迹 |
- 残留易被忽略: 后两项尤其容易被忽略;目标立即消失会结束反馈,而尸体和弹壳把动作结果保留在空间里,让战斗的变化可以积累。
镜头跟随、预留视野与震动是三件事
- 三件事分开: 镜像先加入平滑跟随,再按角色朝向和垂直运动调整镜头目标位置,之后才开启随机震动。
- 前两项管观察: 前两项决定平时怎样观察战场,震动则叠加在其上。
- 衰减规则: 震动强度会随时间下降,大幅震动还会额外衰减。
- 方向性后坐力: 后期开火时另给镜头一个与朝向相反的位移。
- 两种位移共存: 方向性的后坐力与随机晃动可以同时存在,但功能不同——前者连接射击方向,后者突出冲击。
- 小结:若基础跟随与视野分配不合适,继续增加震动只会放大问题;应先保证目标仍可追踪,再判断冲击反馈是否有帮助。
短暂停顿与武器延迟,让身体不再同步滑动
- 20 毫秒停顿: 镜像的伤害脚本在某一步加入 20 毫秒停顿,尸体生成还有不同停顿处理,把命中从连续运动中突出出来。
- 实现边界: 这里使用的是旧演示中的阻塞式实现,数值与方法不能直接当作现代项目的通用方案。
- 武器与身体分离: 武器表现逐渐与身体分开——一处使用上一帧的垂直位置造成跟随延迟,另一处在射击时设置武器后移量并逐步恢复。
- 重量印象: 它们让枪与身体存在短暂相对运动,增加武器的重量印象。
- 打击感是复合结果: 「打击感」不是一个瞬间效果,而是命中前后的时间分配、武器回弹与目标反应共同产生的。
爆炸之后,演示仍回到行为的意义
- 概率爆炸: 报道特别提到死亡时约三分之一概率出现额外爆炸,作为强化击杀体验的例子。
- 镜像对应: 镜像也有对应概率门槛,并在后续步骤放大爆炸、增加残留烟雾;不同保存版本的伤害细节不据此混同。
- 回到行为意义: 步骤表最后转向行动的意义,结尾重新解释玩家在场景中的角色。
- 反馈不回答动机: 大量反馈能让操作更有冲击,却不能独自回答玩家为什么做这些事。
设计启发:每一项改动都要能说清职责
✦ 一句话总结:复用这个方法时,可把修改分成节奏、命中确认、空间反应、镜头与结果残留,逐项开关比较。既检查是否更满足,也检查是否遮挡目标、改变难度或延迟控制。可迁移的是可比较的实验方式,不是把演示里的 30 项全部加到自己的游戏中。
本文由 GPT-6 Astra 于 2026/09/20 生成,由 DeepSeek V4.1 Flash 后续修改