A modifier is a runtime-added override that targets a specific camera node class and changes selected node parameters. Modifiers let gameplay states change how a non-transient camera behaves without creating a new camera type or editing the active type asset.
Examples:
- Raise
FieldOfViewNodewhile sprinting. - Reduce
LookAtNodeweight while stunned. - Disable or retune
CollisionPushNodefor a scripted room. - Swap a
ControlRotateNoderesponse curve during aim.
Modifiers do not add or remove nodes. They only affect nodes that already exist on the active camera.
Not Unreal's UCameraModifier¶
Unreal's built-in UCameraModifier post-processes the final Player Camera
Manager view. ComposableCameraSystem modifiers sit below that final output:
they target individual nodes before the camera finishes evaluating, so
downstream nodes see the changed parameter values.
Authoring Model¶
Create a Node Modifier Data Asset in the Content Browser. The asset is the
unit you add and remove at runtime.
Each asset contains one or more fixed wrapper entries in its Modifiers array.
A wrapper has two authoring modes:
| Mode | Use when | What you edit |
|---|---|---|
| Node Type | You only need to override properties on an existing node class. | Choose a node type, enable the properties to override, then edit their values directly. |
| Custom Modifier Class | You need Blueprint or C++ logic. | Choose a UComposableCameraModifierBase subclass and implement ApplyModifier. |
The Node Type mode is the normal path for most gameplay camera tuning. It copies only the checked properties from a template node. Runtime wires, exposed parameters, and default pin values still exist, but checked modifier properties win while the modifier owns that field.
Use Custom Modifier Class when the override needs procedural logic or compatibility with an older Blueprint modifier asset.
Apply Modes¶
The data asset's ApplyMode controls what happens after the modifier manager
decides the asset is effective for the current camera.
ReactivateCamera is the default. Adding or removing the modifier reconstructs
the current type-asset camera as a fresh instance and blends from the old camera
pose to the new camera pose. Node Type overrides are applied before node
initialization, so the node starts its activation with the modified values.
Custom Blueprint modifier callbacks keep the legacy post-initialize timing.
ModifyExistingInstance keeps the same camera actor and node instances alive.
The runtime state takes ownership of the checked node fields, writes target
values into the live node, and optionally blends supported property types over
time. This is useful for gameplay tuning such as FOV, offsets, speeds, weights,
and response curves where rebuilding the whole camera would be unnecessary.
Continuous value transitions are handled by
UComposableCameraModifierTransitionBase. Discrete fields switch at the
transition's DiscreteSwitchWeight. If no value transition is set, the value
changes immediately.
Camera Tag Queries¶
Camera types and spawned cameras carry CameraTags, an
FGameplayTagContainer. A modifier asset carries CameraTagQuery, a full
gameplay tag query.
- Empty
CameraTagQuerymatches every camera. ANY,ALL, andNONEquery expressions are supported through Unreal's native tag query editor.- Legacy single
CameraTagvalues migrate intoCameraTags. - Legacy modifier
CameraTagslists migrate into anANYquery.
Gameplay still controls when the modifier asset is active. The tag query controls which running cameras it can affect.
Priority¶
When two active modifier assets both target the same camera and the same node class, Node Type entries resolve independently for each checked property. The higher-priority asset wins only for overlapping properties.
Priority is evaluated per (camera, exact node class, property). One asset can
win FieldOfViewNode.FieldOfView while another simultaneously wins
FieldOfViewNode.FieldOfViewOffsetCurve, as long as their checked properties do
not overlap. Equal priority preserves later-registration-wins behavior.
Custom Modifier Class entries remain whole-node winners because arbitrary Blueprint side effects cannot declare which properties they own.
Transitions¶
ReactivateCamera assets use camera-pose transitions when an add/remove changes
the effective modifier set:
OverrideEnterTransitionon the incoming modifier asset, when adding.OverrideExitTransitionon the outgoing modifier asset, when removing.- The normal transition resolution chain for the camera type.
- A hard cut.
ModifyExistingInstance assets use value transitions instead:
OverrideEnterValueTransitionon the incoming modifier asset, when adding.OverrideReplaceValueTransitionon the incoming modifier asset, when it replaces another asset for the same checked property.OverrideExitValueTransitionon the outgoing modifier asset, when removing.- Immediate value application when the selected transition is unset or has zero duration.
If Replace is unset, the runtime keeps the legacy priority handoff rule: incoming Enter is used when the incoming priority is at least the outgoing priority; otherwise outgoing Exit is used.
This keeps modifier application deterministic while letting simple property tuning avoid full camera reactivation.
Adding and Removing at Runtime¶
From Blueprint, use the Add Modifier and Remove Modifier functions in
UComposableCameraBlueprintLibrary. Both take a resolved
AComposableCameraPlayerCameraManager and a
UComposableCameraNodeModifierDataAsset.
From C++, prefer the same library when you need world/player resolution. If you
already own a PCM reference, AddModifier and RemoveModifier are available
directly on the PCM.
Mesh Camera Layers use the same system internally: a mesh profile supplies modifier assets, the world subsystem duplicates those assets per player camera manager, and the PCM replaces the old set with one camera refresh.
In Summary¶
- Modifier assets are the runtime unit; individual wrapper entries are not registered directly.
- Node Type mode lets designers override checked node properties without authoring a Blueprint modifier class.
- Custom Modifier Class mode keeps the older Blueprint/C++ extension path.
CameraTagQueryscopes modifier assets to camera tag containers.- Highest priority wins per checked property; disjoint Node Type properties on the same node class can compose.
ReactivateCamerarebuilds and pose-blends the current camera.ModifyExistingInstancekeeps the live camera and value-blends supported properties.
Next: lightweight, self-expiring per-frame behaviors via Actions.