UE5.8 Gameplay Cameras 专题系列

UE5.8 Gameplay Cameras 专题(三):Runtime 栈,Evaluator、Context、Pose 怎么串起来

深入运行时主链路:FCameraSystemEvaluator、FCameraEvaluationContext、FCameraSystemEvaluationResult、FCameraPose 和 GameplayCamerasPlayerCameraManager。

总览

Gameplay Cameras 的运行时可以拆成四个问题:当前谁在驱动相机,当前有哪些上下文,当前 Director 选择了哪些 Rig,最终姿态写到了哪里。把这四个问题分开,调试会轻松很多。

UE5.8 Gameplay Cameras 专题(三):Runtime 栈,Evaluator、Context、Pose 怎么串起来 配图
Runtime 栈的重点不是节点有多少,而是谁创建上下文、谁选择 Rig、谁输出最终视图。

架构分析

FCameraSystemEvaluator 是主执行器。它持有 Context Stack、Root Node Evaluator、Evaluation Services 和当前结果。每帧调用 Update 后,GetEvaluatedResult 返回 FCameraSystemEvaluationResult,其中包含 FCameraPoseFCameraVariableTableFCameraContextDataTable、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 混用:输入篇会专门讲 ViewRotationModeUGameplayControlRotationComponent

源码依据

FCameraSystemEvaluator 暴露 PushEvaluationContextRemoveEvaluationContextPopEvaluationContextUpdateViewRotationPreviewUpdateGetEvaluatedCameraViewAGameplayCamerasPlayerCameraManager 的注释说明了 SetViewTarget 如何复用 GameplayCameraComponent、CameraComponent 或 Actor CalcCamera。

源码路径索引

  • GameplayCameras/Public/Core/CameraSystemEvaluator.h
  • GameplayCameras/Public/Core/CameraEvaluationContext.h
  • GameplayCameras/Public/Core/CameraPose.h
  • GameplayCameras/Public/GameFramework/GameplayCamerasPlayerCameraManager.h