UE5.8 Gameplay Cameras 专题系列

UE5.8 Gameplay Cameras 专题(五):Director、StateTree 和 Transition,镜头什么时候切

详解 Single、StateTree、Blueprint、PriorityQueue Director,以及 Camera Rig Transition 的 Blend、Condition、InitialOrientation 和 Rig 合并。

总览

Rig 解决“镜头怎么算”,Director 解决“现在该用哪个 Rig”。如果你的项目只有一个跟随相机,SingleCameraDirector 足够;如果你有探索、战斗、锁定、对话、载具、死亡、旁观,Director 就是相机系统的交通指挥。

UE5.8 Gameplay Cameras 专题(五):Director、StateTree 和 Transition,镜头什么时候切 配图
Director 负责每帧选 Rig,Transition 负责旧 Rig 到新 Rig 怎么过渡。

架构分析

Director 运行在 FCameraEvaluationContext 内部,它每帧产出“本帧要激活哪些 Camera Rig”的请求,Root Camera Node 再把这些请求交给 Blend Stack。Transition 不负责判断 gameplay 状态,它只负责旧 Rig 到新 Rig 的过渡质量。

Director 类型

Director 适合场景 备注
USingleCameraDirector 第一台相机、固定镜头 只有一个 CameraRig 属性
UStateTreeCameraDirector 状态明确、条件复杂 StateTree 里用 Activate Camera Rig Task
UBlueprintCameraDirector 快速试验、自定义逻辑 蓝图里每帧调用 ActivateCameraRig
UPriorityQueueCameraDirector 多来源竞争 高优先级子 Director 获胜

StateTree Director 怎么用

创建 StateTree 时 Schema 要选 CameraDirectorStateTreeSchema。状态里放 Activate Camera Rig Task,选择对应 Camera Rig。这个 Task 的 bRunOnce 决定进入状态后是立刻完成,还是持续 Running 等 Transition 触发。

一个角色项目可以这样拆:

Root
  Exploration -> Activate CR_Explore_Follow
  Combat
    Aim      -> Activate CR_Combat_Aim
    LockOn   -> Activate CR_Combat_LockOn
  Dialogue   -> Activate CR_Dialogue_OverShoulder
  Vehicle    -> Activate CR_Vehicle_Chase

Transition 不是 SetViewTarget

UCameraRigTransition 有 Conditions、Blend、InitialOrientation、FreezePreviousCameraRigs 和 bAllowCameraRigMerging。Condition 决定这条 Transition 是否可用;Blend 决定如何从旧 Rig 过渡到新 Rig;InitialOrientation 决定新 Rig 初始朝向是默认、上下文朝向、上一 Rig 朝向,还是保持上一个目标。

锁定相机最常见的坑就是切入瞬间甩镜头。此时优先看 ECameraRigInitialOrientation:从自由视角切锁定时,通常希望保留上一 Rig 的目标或朝向,而不是让新 Rig 用自己的默认角度。

使用案例

探索到战斗:当角色拔出武器,StateTree 进入 Combat,激活 Aim Rig。按锁定键且有目标,进入 LockOn,Transition 使用 Smooth Blend,InitialOrientation 选择 PreviousAbsoluteTarget。进入对话时,对话系统发事件,Director 进入 Dialogue,激活 Dialogue Rig,并冻结旧 Rig 或用较长 Blend。

项目落地

内容团队更容易维护的是“状态名 + Rig 名 + 条件名”,而不是复杂蓝图线。建议每个 Camera Asset 只管理一类角色相机,状态不要过深。跨角色复用时,用 CameraRigProxyAsset 让 StateTree 里引用代理,再在不同 Camera Asset 里映射到具体 Rig。

常见坑

  • StateTree Schema 选错:普通 StateTree 不能直接当 Camera Director StateTree 用。
  • 每帧用 Blueprint Director 激活不同 Rig:会导致 Blend Stack 复杂且难查。
  • Transition 没 Condition:所有切换都匹配,表现像随机。
  • 忘记 Rig 初始朝向:切换时抖动、反向、Aim 丢失常常出在这里。
  • 所有状态共用一个 Rig 再用十几个参数切:短期快,长期很难调试。

源码依据

UStateTreeCameraDirectorStateTreeReference 带有 CameraDirectorStateTreeSchema 元数据;FGameplayCamerasActivateCameraRigTask 和 ViaProxy Task 负责在 StateTree 里激活 Rig;UCameraRigTransition 暴露 Conditions、Blend、InitialOrientation、FreezePreviousCameraRigs 和 Rig Merging。

源码路径索引

  • GameplayCameras/Public/Directors/SingleCameraDirector.h
  • GameplayCameras/Public/Directors/StateTreeCameraDirector.h
  • GameplayCameras/Public/Directors/StateTreeCameraDirectorTasks.h
  • GameplayCameras/Public/Core/CameraRigTransition.h