总览
Rig 解决“镜头怎么算”,Director 解决“现在该用哪个 Rig”。如果你的项目只有一个跟随相机,SingleCameraDirector 足够;如果你有探索、战斗、锁定、对话、载具、死亡、旁观,Director 就是相机系统的交通指挥。
架构分析
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 再用十几个参数切:短期快,长期很难调试。
源码依据
UStateTreeCameraDirector 的 StateTreeReference 带有 CameraDirectorStateTreeSchema 元数据;FGameplayCamerasActivateCameraRigTask 和 ViaProxy Task 负责在 StateTree 里激活 Rig;UCameraRigTransition 暴露 Conditions、Blend、InitialOrientation、FreezePreviousCameraRigs 和 Rig Merging。
源码路径索引
GameplayCameras/Public/Directors/SingleCameraDirector.hGameplayCameras/Public/Directors/StateTreeCameraDirector.hGameplayCameras/Public/Directors/StateTreeCameraDirectorTasks.hGameplayCameras/Public/Core/CameraRigTransition.h