总览
Gameplay Cameras 的复杂度来自组合;组合系统如果没有调试工具,很快会变成黑盒。好消息是源码里专门做了 DebugBlock、Debugger 面板、Trace Provider 和 Rewind Debugger Track。
架构分析
调试系统并不是额外装饰,它跟运行时结构一一对应:DirectorTree 对应上下文和 Director,NodeTree 对应 Camera Node Evaluator,BlendStacks 对应 Base/Main/Global/Visual 四层,Services 对应 Shake、Modifier、ParameterSetter 等运行时服务。
排查顺序
先查上下文,再查 Director,再查 Blend Stack,再查节点树,最后查参数。
- 当前 ViewTarget 是否正确。
- 是否存在 active EvaluationContext。
- Director 当前激活了哪个 Rig。
- Base/Main/Global/Visual 哪层有条目。
- NodeTree 里节点是否运行。
- VariableTable 和 ContextDataTable 是否有期望值。
- 最终
FCameraPose哪些字段被改过。
控制台变量
常用 cvar:
GameplayCameras.Debug.Enable 1
GameplayCameras.Debug.Categories nodetree
GameplayCameras.Debug.NodeTree.Filter BoomArm
GameplayCameras.Debug.BlendStacks.Filter Main
GameplayCameras.Debug.PoseStats.ShowVariableIDs 1
GameplayCameras.Debug.BlendStack.ShowDataIDs 1
GameplayCameras.Debug.Categories 可以看不同类别,例如 DirectorTree、NodeTree、Services、BlendStacks、PoseStats、Viewfinder。具体可用类别以 Debugger 面板和源码注册为准。
Rewind Debugger 和 Trace
编辑器模块里有 CameraSystemRewindDebuggerTrack,显示名是 Gameplay Camera System。运行时 FCameraSystemTrace::TraceEvaluation 会把评估结果和 DebugBlock 写进 trace,Rewind Debugger 才能回看某一帧相机系统是什么状态。
这对“偶尔切错镜头”特别有用。普通日志只能告诉你当时触发过什么事件,Rewind Debugger 可以回到那一帧,看 Director、Blend Stack 和 NodeTree。
Sequencer
GameplayCamerasEditor 里有 GameplayCameraComponentTrackEditor,它会为 GameplayCameraComponent 提供可关键帧属性路径,尤其是参数覆盖。适合过场里临时调相机参数,而不是复制一份专用过场 Rig。
但 Sequencer 不应该成为 gameplay 相机状态机。过场可以关键帧参数;战斗、锁定、探索仍然交给 Director 和 gameplay 状态。
使用案例
遇到“锁定偶尔切回探索”的 Bug,先录一段 Trace,在 Rewind Debugger 找到切回那一帧;看 DirectorTree 是否状态变化,再看 BlendStacks 里 LockOn Rig 是否被移除,最后看 ContextDataTable 里的 LockTarget 是否为空。这个顺序比盲目加日志快得多。
常见问题速查
| 现象 | 先查什么 |
|---|---|
| 完全没画面 | ViewTarget、组件激活、Camera Asset、Director |
| Rig 没切 | StateTree 条件、Activate Camera Rig Task、Transition |
| FOV 没变 | 参数是否暴露、VariableID、ParameterSetter 是否启动 |
| 切换抖动 | InitialOrientation、Blend、Dampen、ControlRotation |
| 受击效果不停止 | Shake ID、Modifier Rig InstanceID、StopCameraModifierRig |
项目落地
上线前给团队写一页“相机 Bug 模板”:录屏、当前状态、当前 Rig、期望 Rig、是否开启 Debug、cvar 截图、Rewind Debugger 帧号。相机问题靠肉眼描述很容易跑偏,用结构化信息能节省大量沟通时间。
常见坑
- 只看最终画面,不看 Blend Stack:你不知道有几个 Rig 同时在影响结果。
- 只查节点,不查上下文:节点可能根本没被激活。
- 过度依赖日志:相机是每帧系统,Rewind/Trace 更适合。
- Sequencer 里直接关键帧一堆内部参数:资产重构后容易断,尽量关键帧公共接口参数。
- 忽略
bIsCameraCut:某些切换需要明确 CameraCut,不能都靠平滑。
源码依据
RootCameraDebugBlock.cpp 注册 GameplayCameras.Debug.Enable、GameplayCameras.Debug.SystemID、GameplayCameras.Debug.Categories 等 cvar;BlendStacksCameraDebugBlock 和 CameraNodeEvaluatorDebugBlock 提供过滤;Editor 模块注册 Gameplay Cameras Debugger、Rewind Debugger Track 和 Sequencer Track Editor。
源码路径索引
GameplayCameras/Public/Debug/CameraSystemTrace.hGameplayCameras/Private/Debug/RootCameraDebugBlock.cppGameplayCamerasEditor/Private/Debugger/SGameplayCamerasDebugger.cppGameplayCamerasEditor/Private/Sequencer/GameplayCameraComponentTrackEditor.cpp