总览
Gameplay Cameras 的运行时可以拆成四个问题:当前谁在驱动相机,当前有哪些上下文,当前 Director 选择了哪些 Rig,最终姿态写到了哪里。把这四个问题分开,调试会轻松很多。
架构分析
FCameraSystemEvaluator 是主执行器。它持有 Context Stack、Root Node Evaluator、Evaluation Services 和当前结果。每帧调用 Update 后,GetEvaluatedResult 返回 FCameraSystemEvaluationResult,其中包含 FCameraPose、FCameraVariableTable、FCameraContextDataTable、PostProcess、CameraCut 和有效标记。
FCameraEvaluationContext 是“谁在被评估”的包装。它持有 Owner、PlayerController、CameraAsset、InitialResult、DirectorEvaluator 和子 Context。一个 Actor、一个 GameplayCameraComponent、一个 ViewTarget 都可能对应上下文。
FCameraPose 是最终镜头姿态的核心数据结构。它包含 Location、Rotation、TargetDistance、FieldOfView、FocalLength、FocusDistance、SensorWidth、SensorHeight、Aperture、ISO、OrthographicWidth、FirstPersonFieldOfView、ProjectionMode 等字段,并用 ChangedFlags 记录哪些值被节点修改过。
PlayerCameraManager 接入
AGameplayCamerasPlayerCameraManager 是官方提供的 PlayerCameraManager。它覆盖 SetViewTarget:如果 ViewTarget 有 GameplayCameraComponent,就使用它的 Evaluation Context;如果只有 CameraComponent,就包装普通相机;如果是普通 Actor,就基于 Actor 的 CalcCamera 输出创建上下文。
#include "GameFramework/GameplayCamerasPlayerCameraManager.h"
AMyGameMode::AMyGameMode()
{
PlayerCameraManagerClass = AGameplayCamerasPlayerCameraManager::StaticClass();
}
如果你暂时不想替换项目里的 CameraManager,可以先走 UGameplayCameraComponent 独立运行。等需要统一处理 ViewTarget、全局 Modifier、Shake 和 ViewRotation 时,再迁到 GameplayCamerasPlayerCameraManager。
四层 Rig 的心智模型
源码里 DefaultRootCameraNode 有 Base、Main、Global、Visual 四层 Blend Stack。可以这样用:
| 层 | 推荐用途 | 例子 |
|---|---|---|
| Base | 长期基础镜头 | 跟随角色、载具基础镜头 |
| Main | 当前状态镜头 | 探索、锁定、对话、处决 |
| Global | 会影响语义的叠加 | 冲刺 FOV、低血量紧张感 |
| Visual | 纯视觉后处理 | 受击抖动、屏幕倾斜、后处理 |
使用案例
角色探索时 Main 层运行 Follow Rig;玩家按锁定键后 Director 切到 LockOn Rig;角色冲刺时 Global 层启动 SprintFOV Modifier;受到攻击时 Visual 层启动 HitShake Rig。这样四件事互不抢代码,也能在 BlendStacks 调试里看见每层到底在跑什么。
项目落地
项目里先决定一个 Host 策略:局部试点用 UGameplayCameraComponent 独立运行,全局角色系统再迁到 AGameplayCamerasPlayerCameraManager。不要同一个玩家一会儿由组件独立评估,一会儿由 CameraManager 评估,否则上下文和控制旋转会很难解释。
常见坑
- 以为
SetViewTarget的 BlendTime 会处理全部切换:Gameplay Cameras 自己还有 Rig Transition 和 Blend Stack。 - 忽略
bIsValid:结果无效时不要继续认为节点算错,先查上下文和 Director。 - 用 Visual 层改 gameplay 语义:Visual 层更适合最后一层表现,瞄准方向这类逻辑不要放那里。
- ControlRotation 和 ViewRotation 混用:输入篇会专门讲
ViewRotationMode和UGameplayControlRotationComponent。
源码依据
FCameraSystemEvaluator 暴露 PushEvaluationContext、RemoveEvaluationContext、PopEvaluationContext、Update、ViewRotationPreviewUpdate、GetEvaluatedCameraView。AGameplayCamerasPlayerCameraManager 的注释说明了 SetViewTarget 如何复用 GameplayCameraComponent、CameraComponent 或 Actor CalcCamera。
源码路径索引
GameplayCameras/Public/Core/CameraSystemEvaluator.hGameplayCameras/Public/Core/CameraEvaluationContext.hGameplayCameras/Public/Core/CameraPose.hGameplayCameras/Public/GameFramework/GameplayCamerasPlayerCameraManager.h