总览
如果你现在的相机只有一个 SpringArm、一个 CameraComponent、几个蓝图插值节点,Gameplay Cameras 可能会显得“重”。但当你开始处理战斗锁定、肩位切换、对话构图、受击 Shake、冲刺 FOV、场景遮挡、过场参数、多人分屏和调试回放时,传统写法很快会变成一团分支。
Gameplay Cameras 的核心价值是把相机拆成可组合资产:相机行为不再只藏在 Pawn Tick、SpringArm 参数和 PlayerCameraManager 里,而是被拆成 Camera Rig 的节点树、Camera Director 的选择逻辑、Transition 的切换规则、VariableTable 的可混合参数和 ContextDataTable 的非混合数据。
使用案例
| 需求 | 传统做法 | Gameplay Cameras 做法 |
|---|---|---|
| 探索跟随 | SpringArm 调臂长和旋转 | 一个 Follow Rig:Attach、BoomArm、Dampen、Collision |
| 锁定敌人 | PlayerCameraManager 里写分支 | LockOn Rig 或参数化 Follow Rig |
| 对话镜头 | SetViewTarget + Timeline | Dialogue Rig + Transition Blend |
| 受击效果 | CameraShake 或手写 PostProcess | Visual Layer Modifier Rig + CameraShakeAsset |
| 冲刺 FOV | Tick 中插值 FOV | 参数覆盖或 ParameterSetterComponent |
架构分析
传统相机的中心通常是“Actor 当前视图怎么计算”。Gameplay Cameras 的中心是“当前上下文里哪些相机 Rig 在运行,怎么混合成最终姿态”。这就是为什么源码里有 FCameraEvaluationContext、FCameraSystemEvaluator、UCameraDirector、UCameraRigAsset 和 UCameraNode 这些类型。
UGameplayCameraComponentBase 可以在组件上独立运行相机系统,也可以只提供 Evaluation Context 给外部系统。AGameplayCamerasPlayerCameraManager 则是更系统化的入口:它会根据 ViewTarget 创建或复用上下文,并把 Gameplay Cameras 的输出接到玩家视图。
怎么选型
先问三个问题。第一,相机状态是否超过三种?第二,内容团队是否需要调参数而不是等程序改 C++?第三,你是否需要看清楚“当前到底是哪条相机链路生效”?只要两个答案是“是”,Gameplay Cameras 就值得试点。
不要把它理解为“SpringArm 被废了”。更健康的理解是:简单游戏继续用 SpringArm;复杂角色项目可以让 Gameplay Cameras 做编排,必要时仍保留普通 CameraComponent 做输出和兼容。
项目落地
第一批试点建议选“锁定相机”或“冲刺相机”。原因很简单:它们有明确触发条件、结果肉眼可见、失败也容易回退。不要一开始就把全部探索、战斗、过场、载具都迁进去,否则你会同时调资产系统、输入、Director、Transition 和旧代码兼容。
常见坑
- 看到 Experimental 就直接上生产:不建议。先做局部试点和回退开关。
- 把所有逻辑塞到一个 Rig:Rig 应该表达一种稳定镜头方案,不该变成巨大蓝图。
- 忽略 PlayerCameraManager:多人、分屏、ViewTarget 和 ControlRotation 最终都绕不开它。
- 忽略调试:Gameplay Cameras 的好处之一是可视化 NodeTree、BlendStacks、Services,不用就亏了。
源码依据
GameplayCameras.uplugin 明确写着 FriendlyName 为 Gameplay Cameras,描述是模块化、数据驱动相机系统,并依赖 EnhancedInput、StateTree、TemplateSequence。运行时核心类型分布在 Core、Nodes、Directors、GameFramework、Services 和 Debug 目录。
源码路径索引
GameplayCameras.upluginGameplayCameras/Public/GameFramework/GameplayCameraComponentBase.hGameplayCameras/Public/GameFramework/GameplayCamerasPlayerCameraManager.hGameplayCameras/Public/Core/CameraPose.h