INSODIMENSIONStudios
CameraReference

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

PieceWhat it is
UAgenticCameraComponentThe 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.
UAgenticCameraDirectorA 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.
IAgenticCameraProviderThe state contract. Implement GetCameraStates on the pawn to supply state tags yourself; the director asks the actor before its components.
UAgenticCameraModeThe Data Asset that describes a rig: base Arm / FOV / Offset / Lag / Input, its Modifiers, and its per-state overrides.
UAgenticCameraRegistryGame-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:

SettingPurpose
Default Camera Mode DataTableThe mode rows the registry imports. Ships pointing at /AgenticGameplayCamera/Game/DT_GameCameraModes.
Modifier DataTablesTag → class registry for modifiers and params. Ships with /AgenticGameplayCamera/Game/DT_GameCameraModifiers.
Default Camera Mode TagMode used when a component supplies none. Ships as Agentic.Camera.Exploration.
Show Debug InfoSwitches 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.

TagPurpose
Agentic.Camera.ExplorationDefault exploration and traversal
Agentic.Camera.CombatGeneric combat
Agentic.Camera.Combat.MeleeClose-range melee
Agentic.Camera.Combat.RangedRanged combat
Agentic.Camera.Combat.LockonLocked-on target tracking
Agentic.Camera.AimAiming / precision targeting
Agentic.Camera.Aim.BowOver-the-shoulder bow aim
Agentic.Camera.Aim.AstraSecond authored aim variant
Agentic.Camera.DialogueNPC dialogue framing
Agentic.Camera.Dialogue.CloseClose-up dialogue
Agentic.Camera.CinematicCinematic sequence camera
Agentic.Camera.Cinematic.WideWide cinematic shot
Agentic.Camera.StealthStealth gameplay
Agentic.Camera.Mounted / .Horse / .ChariotVehicle-mounted cameras
Agentic.Camera.SwimmingUnderwater
Agentic.Camera.ClimbingParkour and climbing
Agentic.Camera.DeathDeath and respawn
Agentic.Camera.SpectatorSpectator / free camera
Agentic.Camera.PhotoPhoto 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.

TagTypical trigger (yours to decide)
Agentic.Camera.State.DefaultThe base state when nothing else is pushed
Agentic.Camera.State.WalkingMoving below the run threshold
Agentic.Camera.State.SprintingSprinting
Agentic.Camera.State.StrafingMoving sideways relative to facing
Agentic.Camera.State.CrouchingCrouched
Agentic.Camera.State.JumpingJump started
Agentic.Camera.State.FallingAirborne
Agentic.Camera.State.AimingAim / precision targeting entered
Agentic.Camera.State.LockOnSet 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

CallNotes
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 / RemoveStateOn enter / on exit.
SetStates(Container)Replace the whole set: one revision, one event.
HasState / GetActiveStates / ClearStatesQuery and clear.
SetStateOverride(Container) / ClearStateOverride / HasStateOverrideTuning 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.
OnStatesChangedFires on every real change, never on a no-op.
SetCameraMode / GetCameraMode / IsModeActive / OnModeChangedThe mode half of the same component.

Component Configuration

PropertyMeaning
Default Camera Mode TagMode requested at BeginPlay when none has been set. Empty leaves the mode alone.
Lock On State TagThe one state the camera sets on its own (see above). Clear to opt out.
Camera AssetA 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.

  1. The mode change clears persisted lag state.
  2. The new rig outputs its target pose directly, with no lag interpolation.
  3. BlendStack blends from the old output to that target over the incoming mode's blend-in time.
PropertyDefaultDescription
Transition.BlendInTime — JSON key ModeBlendInTime0.3Seconds to blend into this mode. A mode → mode change always uses the incoming mode's value.
Transition.BlendOutTime — JSON key ModeBlendOutTime0.3Output 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 BlendCurveEaseInOutCurve shape — see blend curves
{
    "Name": "Exploration",
    "ModeTag": { "TagName": "Agentic.Camera.Exploration" },
    "ModeBlendInTime": 0.5,
    "ModeBlendOutTime": 0.3,
    "BlendCurve": "EaseInOut"
}

Mode vs State Transitions

TransitionMechanismUse for
Mode (Combat Melee → Exploration)BlendStack output blendingGenuinely different camera behavior
State (Default → Crouching)Per-parameter blend times, or BlendStack — configurableSame mode, different values

A state's StateBlendInTime picks which:

StateBlendInTimeBehaviorBest for
0 (default)Each parameter uses its own BlendTime, smoothed by the lag nodeFine-grained per-property control
> 0The whole camera output blends over that duration, like a mode changeOne 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)
ArtifactPath
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:

  1. Add the row to DT_GameCameraTags.csv (or the cinematic DT_CinematicCameraTags.csv).
  2. Reimport that DataTable in the editor.
  3. 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

ControlEffect
Agentic.Camera.DebugLevel 0Off. Per-node bDebugDraw flags still force their own site on.
Agentic.Camera.DebugLevel 1Shapes: rig, focus, awareness, constraints, follow, lag, subjects
Agentic.Camera.DebugLevel 2Shapes plus text labels and numbers
Show Debug Info settingThe same switch, in Project Settings
log LogAgenticCamera VerboseRegistry 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.