1. 为什么说手感一半是靠相机震动撑起来的
在UE5项目里打磨打击感或者驾驶体验的时候,很多人第一反应是调特效、调音效、调动画。但如果你把特效全关掉、声音静音,只留相机震动,再打一拳或者开一枪,会发现手感居然还在。反过来,震动关掉,哪怕特效堆满,打击反馈也会瞬间变得绵软无力。这个现象不是我编的,做动作游戏和射击游戏的团队基本都有同感——相机震动本质上是给玩家视觉系统的一记短促脉冲,它模拟的是人体受到冲击时头部/眼球产生的惯性位移,是最原始的"我被打中了/我打中了"的感官信号。
UE5的CameraShake系统就是干这个的。它允许你在任意时刻给玩家相机注入一段可控的震荡波形,表现形态包括位移抖动、旋转抖动、FOV变化等,并且可以通过蓝图和C++双向调用。这套系统在UE4时代就存在,UE5里保留了老的Legacy CameraShake,同时加入了基于Perlin噪声的新系统。很多人刚开始接触时容易懵,就是因为这两个东西名字相近、用法不同,网上教程又经常混着讲。
这篇文章我从实际项目角度出发,把CameraShake怎么选、怎么调、怎么接入到真实玩法逻辑里,以及我在项目里踩过的坑,一次性说清楚。不管你是纯蓝图开发还是C++为主,都能直接照着用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. CameraShake选型:Legacy和Perlin到底该用哪个
2.1 两套系统并存的历史原因
先讲背景。UE4早期只有一套CameraShake基类,叫CameraShake(后来UE4.26之后逐渐标记为deprecated,UE5里对应LegacyCameraShake)。它的工作逻辑是:你定义一个震荡持续时间和一组震荡参数(位置震荡幅度、旋转震荡幅度等),引擎用Perlin噪声函数生成位移曲线,然后叠加到相机Transform上。
UE5引入的新系统叫MatineeCameraShake(实际类名是UCameraShakeBase的子类,通常用的子类是UPerlinCameraShake),配合CameraShakeSourceComponent使用。它最大的变化是把"震源"这个概念引了进来——震动不再只是相机自己折腾自己,而是一个场景里的Actor(比如爆炸物、开枪的枪口、被打中的NPC)可以挂一个CameraShakeSource组件,玩家相机在范围内,根据距离自动计算衰减,距离越近震得越狠。
听上去新系统明显更好,对吧?实际使用中确实也是。但老系统也没有被完全废弃,因为有些场景下它更直接——比如你只是想让玩家挨打时屏幕微微顿一下,不需要配合场景中的震源Actor,直接调Legacy反而更省事。所以我的建议是:别把两套系统看成新老替代关系,而是看成"有源衰减"和"无源直震"两个工具,按场景挑。
| 对比维度 | Legacy CameraShake | Perlin CameraShake(新) |
|---|---|---|
| 基类 | UCameraShakeBase的子类(LegacyCameraShake) | UPerlinCameraShake / UMatineeCameraShake |
| 衰减支持 | 手动写距离判断 | 内置Attenuation,自动按距离衰减 |
| 触发方式 | 直接在某处Play | 通过CameraShakeSourceComponent触发 |
| 适合场景 | UI表现、无源反馈、简单直震 | 爆炸、开枪、技能命中、场景内定点反馈 |
| 蓝图支持 | PlayCameraShake节点 | PlayCameraShakeFromSource等节点 |
2.2 项目里我推荐的主方案
如果项目从零开始,我建议以新系统为主,Legacy兜底。原因有三个:
第一,新系统的衰减机制省掉大量重复代码。以前做手雷爆炸,要先算出玩家距离爆炸点的距离,然后手动把震动幅度按距离缩放,再调PlayCameraShake。现在只要在手雷爆炸处生成一个CameraShakeSource,配置好衰减半径,播放逻辑全自动。
第二,新系统的参数设计更直观。老系统里Rotation/Location的振幅频率混在一起,新手很容易调出"整个屏幕抽搐"的效果。新系统把BaseLocationAmplitude、BaseRotationAmplitude、Frequency等参数拆分得更清晰,按属性调不容易乱。
第三,新系统支持多源混合。玩家身边同时炸两个手雷,两个Source的震动会被自动混合成一个整体,不会出现后面的震动直接覆盖前面的情况。这在老系统里处理起来非常麻烦。
但Legacy也不能丢,后面会讲到它的一个典型用法。
3. 从根源拆解CameraShake参数配置:最容易被忽略的几组数
3.1 PerlinCameraShake的核心参数组
很多教程会给你一个参数表,告诉你哪个参数调大调小大概是什么效果。但你要真正学会调CameraShake,得先明白每类参数在引擎里是怎么被消费的。拿UPerlinCameraShake的公开属性来看
