总览
相机复杂以后,真正难的不是把 Location 插值一下,而是“数据从哪里来”。角色速度、是否锁定、锁定目标、肩位、瞄准强度、冲刺 FOV、低血量后处理,这些都不该散落在节点硬编码里。
三类数据
| 类型 | 适合放什么 | 原因 |
|---|---|---|
| Camera Parameter | FOV、臂长、阻尼、偏移量 | 可编辑、可暴露、可覆盖 |
| Camera Variable | SprintAlpha、AimAlpha、ShoulderOffset | 可混合,能参与 Blend |
| Context Data | TargetActor、WeaponClass、命中结果 | 非混合对象或结构,不能简单 Lerp |
CameraParameters.h 里每个参数结构都有 Value、VariableID、Variable。默认值来自 Value;如果绑定变量,就从 VariableTable 读;如果被参数覆盖,VariableID 可以指向非用户变量。
使用案例
做一个锁定相机,推荐这样分:
| 数据 | 放置位置 |
|---|---|
| 是否锁定 | Boolean Camera Variable 或 Director State |
| 锁定目标 Actor | Context Data |
| 锁定 FOV | Float Camera Parameter |
| 肩位偏移 | Vector3d Camera Parameter |
| 锁定强度 Alpha | Float Camera Variable |
| 目标屏幕偏移 | 自定义节点输出或 Context Data |
这样做的好处是:FOV 和肩位可以被内容团队调,锁定目标仍然由 gameplay 系统决定,切换时 AimAlpha 可以跟随 Transition 混合。
Parameter Setter
UGameplayCameraParameterSetterComponent 适合区域或状态驱动的参数覆盖。比如玩家进入狭窄走廊时,缩短臂长并提高碰撞推近速度;离开区域后 BlendOut。
// 蓝图等价:Overlap Begin -> StartParameterSetters
// Overlap End -> StopParameterSetters(false)
UPROPERTY(EditAnywhere)
UGameplayCameraParameterSetterComponent* CorridorCameraOverride;
void ACameraVolume::NotifyActorBeginOverlap(AActor* OtherActor)
{
CorridorCameraOverride->StartParameterSetters();
}
void ACameraVolume::NotifyActorEndOverlap(AActor* OtherActor)
{
CorridorCameraOverride->StopParameterSetters(false);
}
架构分析
FCameraVariableTable 适合可混合值。比如从 Explore Rig 切 Aim Rig 时,FOV、Offset、Alpha 可以平滑混合。FCameraContextDataTable 是它的伴侣,源码注释明确说它用于各种类型的任意值,适合非 blendable 数据。Actor、Class、Struct、数组都可以走这里。
UCameraAsset 还有 Interface Parameters,可以把内部 Rig 的参数暴露成 Camera Asset 的公共接口。项目里不要把所有 Rig 内部参数都暴露,只暴露稳定、有设计意义的参数。
项目落地
建议建立一张“相机数据合同表”:名字、类型、来源、更新频率、是否可混合、默认值、谁维护。比如 Camera.AimAlpha 来自战斗组件,每帧更新,可混合;Camera.LockTarget 来自锁定组件,事件更新,不可混合;Camera.SprintFOV 来自角色移动状态,可覆盖。
常见坑
- 把 Actor 放进 VariableTable:对象引用不适合做数值混合。
- 暴露参数太多:内容团队看到一百个参数,最后没人知道该调哪个。
- 参数名随意改:Sequencer、蓝图、资产引用都可能断。
- 用 Tick 到处 Set 参数:先考虑 ParameterSetter、Component 或统一相机数据桥。
- 忽略 BlendIn/BlendOut:参数覆盖突然跳变,比相机切换更刺眼。
源码依据
FBooleanCameraParameter、FFloatCameraParameter 等参数都包含 Value、VariableID 和 Variable;FCameraContextDataTable 提供 Name、String、Enum、Struct、Object、Class 和数组读写;UGameplayCameraParameterSetterComponent 提供 StartParameterSetters 和 StopParameterSetters,并支持 BlendIn/BlendOut/BlendType。
源码路径索引
GameplayCameras/Public/Core/CameraParameters.hGameplayCameras/Public/Core/CameraVariableReferences.hGameplayCameras/Public/Core/CameraContextDataTable.hGameplayCameras/Public/GameFramework/GameplayCameraParameterSetterComponent.h