Gameplay Camera
Camera modes, state tags, project settings, mode transitions and the JSON to DataTable to Data Asset authoring pipeline
Gameplay Camera Reference
The gameplay half: modes, states, and the data behind them. This is the Beta half of the plugin and the one you integrate first.
The Runtime Pieces
| Piece | What it is |
|---|---|
UAgenticCameraComponent | The one component a pawn needs. A state container that also is an IAgenticCameraProvider, so the owning actor implements nothing. Guarantees a UGameplayCameraComponent and a camera asset with an Agentic director at registration. |
UAgenticCameraDirector | A UCameraDirector for a camera asset — not a PlayerCameraManager. Pure authoring data: which mode to start in, plus debug options. Its per-context evaluator owns everything mutable, so two contexts sharing one camera asset never see each other's state. |
IAgenticCameraProvider | The state contract. Implement GetCameraStates on the pawn to supply state tags yourself; the director asks the actor before its components. |
UAgenticCameraMode | The Data Asset that describes a rig: base Arm / FOV / Offset / Lag / Input, its Modifiers, and its per-state overrides. |
UAgenticCameraRegistry | Game-instance subsystem mapping tag → mode and tag → shot flow, built from the configured DataTables and the Asset Registry. |
UAgenticCameraDirector::GetRuntimeSnapshot(Camera, OutSnapshot) is the Blueprint-pure read of live director state: the active mode, the effective post-state runtime config, and the state container last read from the provider.
Project Settings
Project Settings → Game → Agentic Camera:
| Setting | Purpose |
|---|---|
Default Camera Mode DataTable | The mode rows the registry imports. Ships pointing at /AgenticGameplayCamera/Game/DT_GameCameraModes. |
Modifier DataTables | Tag → class registry for modifiers and params. Ships with /AgenticGameplayCamera/Game/DT_GameCameraModifiers. |
Default Camera Mode Tag | Mode used when a component supplies none. Ships as Agentic.Camera.Exploration. |
Show Debug Info | Switches on the debug draw without knowing the console variable's name. |
The plugin's own Config/Game.ini layers onto your project's Game branch, so a project that merely enables the plugin gets the shipped tables wired with no clicks. Your project's DefaultGame.ini still wins if it sets any of these keys — which is the usual reason a table reads as "not configured". Configure Shipped Defaults assigns every table reference still unset; Validate All Tables cross-checks them and regenerates the schema.
The cinematic half has nothing to configure here: UAgenticShotFlow assets are discovered from the Asset Registry by their FlowTag, and the corrections self-register.
Mode Tags
Activation targets for SetCameraMode / the director. Every tag below is registered — it resolves in a picker and in code — but only five have an authored mode behind them in the shipped table. The rest are vocabulary for modes you author.
| Tag | Purpose |
|---|---|
Agentic.Camera.Exploration | Default exploration and traversal |
Agentic.Camera.Combat | Generic combat |
Agentic.Camera.Combat.Melee | Close-range melee |
Agentic.Camera.Combat.Ranged | Ranged combat |
Agentic.Camera.Combat.Lockon | Locked-on target tracking |
Agentic.Camera.Aim | Aiming / precision targeting |
Agentic.Camera.Aim.Bow | Over-the-shoulder bow aim |
Agentic.Camera.Aim.Astra | Second authored aim variant |
Agentic.Camera.Dialogue | NPC dialogue framing |
Agentic.Camera.Dialogue.Close | Close-up dialogue |
Agentic.Camera.Cinematic | Cinematic sequence camera |
Agentic.Camera.Cinematic.Wide | Wide cinematic shot |
Agentic.Camera.Stealth | Stealth gameplay |
Agentic.Camera.Mounted / .Horse / .Chariot | Vehicle-mounted cameras |
Agentic.Camera.Swimming | Underwater |
Agentic.Camera.Climbing | Parkour and climbing |
Agentic.Camera.Death | Death and respawn |
Agentic.Camera.Spectator | Spectator / free camera |
Agentic.Camera.Photo | Photo mode |
Five modes ship authored, as both a row in DT_GameCameraModes and a browsable Data Asset under /AgenticGameplayCamera/Game/Modes/: Exploration, Combat Melee, Combat Ranged, Combat Lock-on and Aim Bow. Every other tag in the table above is a registered name with no row behind it yet — activating one logs not found in registry and keeps the previous mode. Author it by adding a row (or duplicating a shipped Data Asset and giving it that mode tag).
A tag with no matching row resolves fine and then finds no mode, so the director keeps the previous mode and logs "not found in registry". If you add a mode tag, add its row too — that is what Validate All Camera Tables checks.
State Tags
States are supplied by your game, never auto-detected. The director reads them each frame and, when the set changes, writes the state's values into the running rig's camera variables — a retarget, not a rebuild, so smoothing nodes keep their history. That covers everything exposed as a camera parameter. Where a state differs in a non-parameter property (a plain float, or an inner struct that cannot be driven as a variable), the candidate build's bake hash detects it and the rig is genuinely replaced, promoted with a cut; the log line for a state change says which of the two happened.
| Tag | Typical trigger (yours to decide) |
|---|---|
Agentic.Camera.State.Default | The base state when nothing else is pushed |
Agentic.Camera.State.Walking | Moving below the run threshold |
Agentic.Camera.State.Sprinting | Sprinting |
Agentic.Camera.State.Strafing | Moving sideways relative to facing |
Agentic.Camera.State.Crouching | Crouched |
Agentic.Camera.State.Jumping | Jump started |
Agentic.Camera.State.Falling | Airborne |
Agentic.Camera.State.Aiming | Aim / precision targeting entered |
Agentic.Camera.State.LockOn | Set by the component itself while an optional Agentic Targeting component on the same pawn holds a target — via the component's LockOnStateTag. With no targeting plugin installed, nothing sets it automatically and you can push it yourself. Clear that property to opt out. |
Multiple states can be active at once; their configs blend with equal weight.
The Component's State API
| Call | Notes |
|---|---|
SetStateActive(Tag, bool) | Wire a bool from gameplay. Repeating a value is a no-op — a tag lookup, then return: no revision bump, no event, no container copy. Cheap, not free; prefer your own transitions. |
AddState / RemoveState | On enter / on exit. |
SetStates(Container) | Replace the whole set: one revision, one event. |
HasState / GetActiveStates / ClearStates | Query and clear. |
SetStateOverride(Container) / ClearStateOverride / HasStateOverride | Tuning and test harnesses: report exactly these states until cleared, whatever the game pushes meanwhile. Lets a designer sit in Falling without jumping. |
GetStateRevision() | Monotonic counter bumped on every real mutation. The director caches it so unchanged frames skip even the container comparison. |
OnStatesChanged | Fires on every real change, never on a no-op. |
SetCameraMode / GetCameraMode / IsModeActive / OnModeChanged | The mode half of the same component. |
Component Configuration
| Property | Meaning |
|---|---|
Default Camera Mode Tag | Mode requested at BeginPlay when none has been set. Empty leaves the mode alone. |
Lock On State Tag | The one state the camera sets on its own (see above). Clear to opt out. |
Camera Asset | A camera asset whose director is an Agentic director, pushed onto the owner's gameplay camera at registration. Empty builds a transient default — nothing to author, nothing to keep in sync. |
Mode Transitions
Mode changes use Epic's BlendStack to blend the old rig's output into the new rig's target.
- The mode change clears persisted lag state.
- The new rig outputs its target pose directly, with no lag interpolation.
- BlendStack blends from the old output to that target over the incoming mode's blend-in time.
| Property | Default | Description |
|---|---|---|
Transition.BlendInTime — JSON key ModeBlendInTime | 0.3 | Seconds to blend into this mode. A mode → mode change always uses the incoming mode's value. |
Transition.BlendOutTime — JSON key ModeBlendOutTime | 0.3 | Output blend when leaving this mode for a rig that is not an Agentic gameplay mode — a cinematic or other foreign rig. It is not used for mode → mode blends. |
Transition.BlendCurve — JSON key BlendCurve | EaseInOut | Curve shape — see blend curves |
{
"Name": "Exploration",
"ModeTag": { "TagName": "Agentic.Camera.Exploration" },
"ModeBlendInTime": 0.5,
"ModeBlendOutTime": 0.3,
"BlendCurve": "EaseInOut"
}Mode vs State Transitions
| Transition | Mechanism | Use for |
|---|---|---|
| Mode (Combat Melee → Exploration) | BlendStack output blending | Genuinely different camera behavior |
| State (Default → Crouching) | Per-parameter blend times, or BlendStack — configurable | Same mode, different values |
A state's StateBlendInTime picks which:
StateBlendInTime | Behavior | Best for |
|---|---|---|
0 (default) | Each parameter uses its own BlendTime, smoothed by the lag node | Fine-grained per-property control |
> 0 | The whole camera output blends over that duration, like a mode change | One unified smooth blend |
{
"StateTag": { "TagName": "Agentic.Camera.State.Crouching" },
"StateBlendInTime": 0.3,
"Parameters": []
}Authoring Pipeline
The same mode data exists in three places, and the round-trip between them is the point:
JSON file ◄──► DataTable asset ◄──► Camera Mode Data Asset
(agents, (the registry (the Details panel,
diffs, review) imports this) a designer's view)| Artifact | Path |
|---|---|
| Mode rows, JSON | /AgenticGameplayCamera/Game/DT_GameCameraModes.json |
| Mode rows, DataTable | /AgenticGameplayCamera/Game/DT_GameCameraModes |
| Modifier registry | /AgenticGameplayCamera/Game/DT_GameCameraModifiers (+ .json) |
| Tag table | /AgenticGameplayCamera/Game/DT_GameCameraTags (+ .csv) |
| Mode Data Assets | /AgenticGameplayCamera/Game/Modes/DA_GameCameraMode_* |
| Generated schema | /AgenticGameplayCamera/Shared/AgenticCameraSchema.json |
On a mode Data Asset, the DataTable Sync section gives you three buttons: Import from DataTable fills the asset from the row matching its ModeTag, Update DataTable writes the asset back to that row, and Validate checks the tables. Results appear as a toast and in the Agentic Camera Message Log.
The generated schema is authoritative for parameter key names. Regenerate it whenever you validate — the two are kept in lockstep deliberately.
The Params. prefix in JSON is not a typo. Modifiers whose settings live in an inner struct — Constraints and Shake — need the dotted path (Params.PitchMin, Params.Pitch_Amplitude). The import resolver only descends into a struct when the path is explicitly dotted, so a bare PitchMin is reported as an unknown key and the modifier silently keeps its C++ default. Read the import report; it tells you.
Adding a Tag
Tags have one source of truth and an order that matters:
- Add the row to
DT_GameCameraTags.csv(or the cinematicDT_CinematicCameraTags.csv). - Reimport that DataTable in the editor.
- Only then reference the tag from a modifier registry row or a mode row.
The plugin registers its own tag search path at module startup, the same mechanism Game Feature plugins use, so a consumer project never edits its own DefaultGameplayTags.ini.
Debugging
| Control | Effect |
|---|---|
Agentic.Camera.DebugLevel 0 | Off. Per-node bDebugDraw flags still force their own site on. |
Agentic.Camera.DebugLevel 1 | Shapes: rig, focus, awareness, constraints, follow, lag, subjects |
Agentic.Camera.DebugLevel 2 | Shapes plus text labels and numbers |
| Show Debug Info setting | The same switch, in Project Settings |
log LogAgenticCamera Verbose | Registry imports, mode lookups, provider warnings |
Per-node flags — on a mode's Lag config, or on the YawFollow, PitchFollow, Focus, Awareness, Constraints and correction entries — mean "force this one on at full detail" regardless of the global level. That table of sites is the complete list of debug draws; see Modifiers for which flag lives where.
Colours are chosen to stay distinct from Agentic Targeting's cyan / yellow / green: blue for the director's arm and pivot (cyan at the camera socket), magenta for focus and lock-on, purple for awareness threats, orange for pitch and yaw constraints, dark green for yaw follow (green while actively recentring), olive for pitch follow, teal for lag, white for the director's state readout.
Every draw is also recorded to the Visual Logger under the AgenticCamera category, so a session can be scrubbed after it happened rather than watched live.