A modifier is a runtime-added override that targets a specific camera node class and changes selected node parameters when a non-transient camera is constructed. Modifiers let gameplay states change how the current camera behaves without creating a new camera type or editing the active type asset.

Examples:

  • Raise FieldOfViewNode while sprinting.
  • Reduce LookAtNode weight while stunned.
  • Disable or retune CollisionPushNode for a scripted room.
  • Swap a ControlRotateNode response 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 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 for that activation.

Use Custom Modifier Class when the override needs procedural logic or compatibility with an older Blueprint modifier asset.

Camera Tag Queries

Camera types and spawned cameras now carry CameraTags, an FGameplayTagContainer. A modifier asset carries CameraTagQuery, a full gameplay tag query.

  • Empty CameraTagQuery matches every camera.
  • ANY, ALL, and NONE query expressions are supported through Unreal's native tag query editor.
  • Legacy single CameraTag values migrate into CameraTags.
  • Legacy modifier CameraTags lists migrate into an ANY query.

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, only the higher-priority asset wins for that node class.

Priority is evaluated per (camera, node class). One asset can win for FieldOfViewNode while another wins for ControlRotateNode.

If you need additive behavior on the same node class, combine the effect into one modifier entry or split the behavior across different node classes.

Reactivation

Adding or removing a modifier can change the effective modifier set. When that happens, the PCM reactivates the current type-asset camera as a fresh instance and blends into it.

The transition is resolved in this order:

  1. OverrideEnterTransition on the incoming modifier asset, when adding.
  2. OverrideExitTransition on the outgoing modifier asset, when removing.
  3. The normal transition resolution chain for the camera type.
  4. A hard cut.

This keeps modifier application deterministic. 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.

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.

Indoor Camera Layers use the same system internally: an indoor 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.
  • CameraTagQuery scopes modifier assets to camera tag containers.
  • Highest priority wins per node class; modifiers do not stack on the same node class.
  • Effective modifier changes reactivate the current non-transient camera.

Next: lightweight, self-expiring per-frame behaviors via Actions.