总览
真实项目不会只有一个 Follow Rig。角色通常至少有探索、瞄准、锁定、对话、处决、载具几类相机。Gameplay Cameras 的正确打开方式,是把这些做成多个小 Rig,再让 Director 决定当前运行谁。
架构分析
多 Rig 协作的重点是边界:Gameplay 系统提供状态和目标,Director 选择镜头,Rig 负责构图,Transition 负责过渡。这样锁定系统换算法时不需要改镜头节点,镜头美术调肩位时也不会影响战斗判定。
Rig 拆分建议
| Rig | 职责 | 不该做的事 |
|---|---|---|
CR_Explore_Follow |
普通移动跟随 | 不处理锁定目标 |
CR_Combat_Aim |
瞄准肩位、窄 FOV | 不决定能否开火 |
CR_Combat_LockOn |
保持目标构图 | 不选择目标 |
CR_Dialogue_OTS |
对话过肩镜头 | 不管理对话流程 |
CR_Execution_Cinematic |
处决短镜头 | 不修改角色动画 |
CR_Vehicle_Chase |
载具追尾相机 | 不复用角色输入曲线 |
相机 Rig 只消费 gameplay 状态,不拥有 gameplay 状态。锁定目标由战斗/锁定组件选,相机只负责把目标拍好。
使用案例
例如玩家从探索进入战斗:战斗组件设置 bInCombat,Director 进入 Combat/Aim,Aim Rig 收窄 FOV 并偏右肩;玩家锁定敌人后,锁定组件写入目标 Actor,Director 进入 LockOn,LockOn Rig 用目标位置做构图;目标死亡时清空目标,Director 回到 Aim 或 Explore。
StateTree 决策示例
CameraDirectorStateTree
Exploration
Condition: !bInCombat && !bInDialogue
Task: Activate CR_Explore_Follow
Combat
Aim
Condition: bIsAiming && !HasLockTarget
Task: Activate CR_Combat_Aim
LockOn
Condition: HasLockTarget
Task: Activate CR_Combat_LockOn
Dialogue
Condition: bInDialogue
Task: Activate CR_Dialogue_OTS
Vehicle
Condition: bInVehicle
Task: Activate CR_Vehicle_Chase
CameraRigProxy 的用法
如果多个角色共用同一套 Director StateTree,但具体 Rig 不同,就用 Proxy。StateTree 里激活 Proxy_CombatAim,每个 Camera Asset 再把它映射到自己的 CR_Hero_Aim、CR_Boss_Aim 或 CR_Vehicle_Aim。这样决策逻辑复用,镜头资产可差异化。
Transition 设计
探索到瞄准:短 Blend,保留 PreviousYawPitch。瞄准到锁定:中等 Blend,尽量保持目标方向。锁定到探索:不要立即回正,给玩家半秒恢复控制。进入对话:较长 Blend,可冻结上一批 Rig。处决:通常使用更强的 CameraCut 或专用 cinematic Rig。
项目落地
为角色写一张相机状态矩阵:行是 gameplay 状态,列是相机 Rig、Transition、输入策略、参数覆盖和回退 Rig。团队评审时看矩阵,不要直接打开复杂资产讨论。
| 状态 | Rig | 输入 | Transition |
|---|---|---|---|
| Explore | Follow | 玩家控制 + 自动回正 | 默认 |
| Aim | Combat_Aim | 玩家控制,低灵敏度 | Smooth 0.15 |
| LockOn | Combat_LockOn | 玩家切目标 | PreviousAbsoluteTarget |
| Dialogue | Dialogue_OTS | 冻结或弱控制 | Smooth 0.4 |
常见坑
- 相机自己判断战斗状态:职责错位,和 Gameplay 逻辑迟早打架。
- 一个 StateTree 同时管角色行为和相机:可以通信,但不建议混在一个资产里。
- 忘记回退状态:目标死亡、对话取消、载具销毁时必须回到稳定 Rig。
- 处决镜头没有失败路径:动画中断时要安全返回上一相机。
- 用 Tag 但没有命名规范:建议
Camera.State.*、Camera.Rig.*、Camera.Modifier.*分层。
源码依据
UCameraRigAsset 实现 IGameplayTagAssetInterface 并持有 GameplayTags;FGameplayCamerasActivateCameraRigViaProxyTask 支持通过 CameraRigProxy 激活具体 Rig;GameplayTagTransitionConditions 提供基于 GameplayTag 的 Transition 条件。
源码路径索引
GameplayCameras/Public/Directors/StateTreeCameraDirector.hGameplayCameras/Public/Directors/StateTreeCameraDirectorTasks.hGameplayCameras/Public/Core/CameraRigAsset.hGameplayCameras/Public/Transitions/GameplayTagTransitionConditions.h