UE5.8 Gameplay Cameras 专题系列

UE5.8 Gameplay Cameras 专题(六):参数、变量和 Context Data,怎么把玩法数据喂给相机

拆解 CameraParameter、CameraVariable、VariableTable、ContextDataTable、Camera Asset Interface 和 ParameterSetterComponent 的用法。

总览

相机复杂以后,真正难的不是把 Location 插值一下,而是“数据从哪里来”。角色速度、是否锁定、锁定目标、肩位、瞄准强度、冲刺 FOV、低血量后处理,这些都不该散落在节点硬编码里。

UE5.8 Gameplay Cameras 专题(六):参数、变量和 Context Data,怎么把玩法数据喂给相机 配图
可混合的数值走 VariableTable,不适合混合的对象和结构走 ContextDataTable。

三类数据

类型 适合放什么 原因
Camera Parameter FOV、臂长、阻尼、偏移量 可编辑、可暴露、可覆盖
Camera Variable SprintAlpha、AimAlpha、ShoulderOffset 可混合,能参与 Blend
Context Data TargetActor、WeaponClass、命中结果 非混合对象或结构,不能简单 Lerp

CameraParameters.h 里每个参数结构都有 ValueVariableIDVariable。默认值来自 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:参数覆盖突然跳变,比相机切换更刺眼。

源码依据

FBooleanCameraParameterFFloatCameraParameter 等参数都包含 Value、VariableID 和 Variable;FCameraContextDataTable 提供 Name、String、Enum、Struct、Object、Class 和数组读写;UGameplayCameraParameterSetterComponent 提供 StartParameterSettersStopParameterSetters,并支持 BlendIn/BlendOut/BlendType。

源码路径索引

  • GameplayCameras/Public/Core/CameraParameters.h
  • GameplayCameras/Public/Core/CameraVariableReferences.h
  • GameplayCameras/Public/Core/CameraContextDataTable.h
  • GameplayCameras/Public/GameFramework/GameplayCameraParameterSetterComponent.h