20. Camera and battle presentation
In short: one camera framing system keeps every camera (exploration, each battle mode, cinematic shots) out of rocks and walls, and the battle presentation system turns the results the rules already computed into a show: timelines of cues for animation, effects, sound, camera, hit-stop and text. Use this chapter to tune how cameras behave, to give an ability a look, and to understand what is data and what is automatic.
20.1 Basics
20.1.1 The cameras you get
| Where | Camera |
|---|---|
| Exploration | The party RPG camera: either Tactical (high above the party at a tactical angle, zoom, rotation, smooth follow, optional pan) or Third Person (behind the leader). Pick it in Project Settings → RPG Saga Engine → Exploration → Camera. |
| Grid Tactics | ARSETacticsCameraPawn on the same camera arm, following the active unit and the cursor. |
| Free Tactics | ARSEFreeTacticsCameraPawn, following the active unit and the cursor. |
| ATB and turn-based | A fixed stage camera, framed once when the battle starts. |
| Action | ARSEActionCameraRig, with the player's own yaw and pitch. |
| Cinematic shots | Camera Shot cues in an ability's presentation, plus an optional automatic Cinematic Battle Camera. |
You do not have to set any of this up. The defaults frame every mode, and the framing system avoids obstructions in all of them.
20.1.2 Make your cameras obstruction-proof (already on)
- Open Project Settings → RPG Saga Engine → Camera Framing. Enabled is on by default.
- Mark anything that must move the camera instead of fading with the actor tag
RSE.CameraBlocker, and anything that must never fade withRSE.NoFade. - Play a battle. If the camera sits inside geometry, switch on the debug view: console
RSE.Camera.FramingDebug 1draws the probe sphere and the candidate poses.
Small things (thin walls, props, trees) fade locally as in exploration (Camera Occlusion). What cannot fade (landscapes, terrain-tagged objects, anything tagged RSE.CameraBlocker or RSE.NoFade, anything at least Camera Occlusion → Max Fade Size wide on both horizontal axes, 1500 cm by default) moves the camera.
20.1.3 Give an ability a look
Every ability can name a presentation asset (Presentation on the ability). Without one, the plugin builds a default timeline: the body of the approach (run in, stay put or shoot) and the hit reaction on the target.
- Content Browser → Add → Miscellaneous → Data Asset → RSE Battle Presentation Data.
- Add cues to its list, in order: for example Move / Approach (To Target), Montage, VFX, Sound, Impact, Move / Approach (To Home).
- On the ability, set Presentation to the asset.
- Press Play in a battle and use the ability. Use the Ability Test and preview tools (see 06-abilities-and-statuses.md) to iterate without fighting.
20.2 How it works
20.2.1 The presentation flow
The rules (RSECore) resolve an action instantly and emit events. The presentation (RSE) plays them back. A director hands the action to the cue player component (URSEBattleCuePlayerComponent), which runs the timeline of cues; the Impact cue is the moment the director shows the already-computed results (numbers, falls, statuses) and the targets react. With no Impact cue the results appear at the end of the timeline. Because the result never depends on the show, headless simulations skip it and stay identical.
Each cue starts after its Delay. The next cue waits only if the previous one has Wait For Completion, so cues overlap freely (an effect that starts with the swing, for example). Common cue fields: Delay, Wait For Completion, Only In Modes (Battle.Mode.* tags; empty means every mode; Battle.Mode.ATB also covers turn-based), and Optional (skipped when effects are reduced). Cues act on roles, not on named units: Caster, Primary Target, All Targets or Each Target, Targets Center, Midpoint. One asset therefore works for every character in every mode.
20.2.2 The cue types
| Cue (display name) | Class | What it does |
|---|---|---|
| Move / Approach | URSECue_Move | Run to the target or back home. In Tactics this becomes a short step (units stay on their tile). |
| Pose (procedural) | URSECue_Pose | Placeholder motion (lunge, hop, spin, shake, recoil) for units without animation |
| Montage | URSECue_Montage | A montage on units with a skeletal mesh; RSEImpact notifies time the next Impact cue |
| VFX | URSECue_VFX | A Niagara (or legacy particle) system at an anchor (chest or ground) or a body anchor (hand, weapon tip, muzzle, head, feet) |
| Sound | URSECue_Sound | A sound or a catalog tag, 2D or at an anchor |
| Camera Shot | URSECue_Camera | Close-up on caster or target, over the shoulder, two-shot, orbit, return; blend, hold, distance, height, FOV |
| Camera Shake | URSECue_CameraShake | A procedural shake |
| Hit Stop | URSECue_HitStop | A brief freeze |
| Slow Motion | URSECue_SlowMotion | Time dilation with blend in and out |
| Screen Flash / Fade | URSECue_ScreenFlash | A color flash or fade |
| Text / Banner | URSECue_Banner | The ability's name or your own text, as a banner or a title |
| Wait | URSECue_Wait | A pause |
| Impact | URSECue_Impact | Show the results; several Impact cues make a multi-hit |
| Projectile | URSECue_Projectile | A projectile flight from the caster to the targets |
| Weapon Attack, Weapon Shot, Weapon Hit Effects, Weapon Animation | URSECue_Weapon* | The weapon's own show (see 18-weapons.md) |
| Paired Animation | URSECue_PairedAnimation | Two synced montages for a finisher or counter (see 17-characters-visuals-and-animation.md) |
Approach on the ability: Auto picks from the data (physical damage to enemies → Melee; row-ignoring → Ranged; everything else → In Place), or choose Melee, Ranged, In Place or Custom (only your cues).
20.2.3 Camera policy
The battle camera stays on the fixed view for ordinary actions. Camera cues run only when the policy allows it (Battle Presentation → Camera Policy):
- Classic Camera Policy (default Special Only) and Tactics Camera Policy (default All): Fixed never, Special Only only for special actions, All always.
- A special action has Presentation → Cinematic Camera on, is a super move, or is a summon. Boss and summon intros are special.
- Enemy Special Camera (default off) lets enemies trigger it for the player side; Boss Special Camera (default on) lets bosses.
- Shake In Fixed View keeps shakes even with a fixed camera.
20.2.4 Cinematic moments
| Moment | When | Default |
|---|---|---|
| Super move | Ability with Presentation → Moment = Super Move | Close-up on the caster, slow motion, flash, title, then a side or over-shoulder shot and the attack body with shake and hit-stop |
| Summon entrance | After the action that brings a summon | Flash, close-up, slow motion, the summon's title, a jump, shake, orbit |
| Boss intro | At battle start, when the encounter has a VIP enemy | Orbit around the boss, its name as a title, a tremor |
All can be replaced by assets in the settings (Super Move Prelude, Summon Entrance, Boss Intro), switched off (Summon Entrance, Boss Intro toggles), and skipped with Confirm or Cancel. The battle HUD hides while they run.
20.2.5 Speed, skip and reduced effects
Playback Speed (1 = normal) and Fast Forward Speed while a key from Fast Forward Keys is held. Cinematic moments always skip with Confirm or Cancel; ordinary actions only with Allow Skip Actions. On a skip the remaining impacts fire, so results always appear. Reduce Effects turns off shake, flash, hit-stop and optional cues for weak PCs and accessibility. The player's own options (Reduced battle effects, Battle animation speed) override the rule; the order is console variable, then player choice, then the rules.
20.2.6 How framing chooses a pose
The framer (FRSECameraFramer, in RSECameraFraming) runs on a timer (Check Interval, 0.1 s), not every frame:
- It tries poses around the desired one, cheapest first: yaw in steps (Yaw Step 20 deg × Yaw Steps 2), a steeper angle (Pitch Step 10 deg × Pitch Steps 2, up to Max Pitch 80), alternative sides (Alternate Yaws), then moving closer (down to Min Distance Share 0.6 or Min Distance 300 cm).
- Each pose is tested with a sphere (Probe Radius 24 cm) from the pivot toward the camera, against the focus heights (Focus Heights, up to Max Focus Targets).
- Hysteresis stops flicker: a blocked pose is left after Switch Delay (0.1 s); a free pose changes to a cheaper one only after the cheaper one has stayed better for Return Delay (0.8 s) and by Switch Margin.
- Offsets glide to the chosen pose at Blend Speed.
- Never inside geometry: every frame, a safety sphere (at least the near clip plane plus Near Clip Margin) is swept from the pivot to the displayed pose. It enters instantly and leaves smoothly (Release Speed).
Per mode: Exploration keeps the player's yaw (only angle and distance adapt); Grid Tactics tries small steps, a steeper angle or another side (90 or 180 deg) before moving in, so the grid stays readable; ATB frames once at battle start without changing sides; Action keeps the player's yaw and pitch and uses the framer instead of a simple probe.
20.2.7 The cinematic battle camera
Off by default; for captures and trailers. Turn it on in Camera Framing → Cinematic Battle (Enabled) or with RSE.Camera.CinematicBattle 1. Each action gets shots chosen on the spot and checked for visibility: over the shoulder of the attacker (one target), a wide shot (Wide Shot Targets or more targets, default 2), and the target's reaction at the first impact (Reaction Shot). It follows the 180-degree rule, cuts or glides depending on how far the view turns (Cut Angle, default 40 deg), and holds each shot at least Min Shot Seconds (0.6 s). Distances and field of view are in the same group (Over Shoulder Distance 420 cm, Wide Distance 1100 cm, Field Of View 50).
20.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSEBattlePresentationData | RSE | The timeline of cues (an ability's presentation) |
URSEBattleCue, URSEBattleCue_Custom | RSE | Base cue; the Blueprint-extendable cue with On Cue Start, On Cue Update, On Cue Stop |
URSEBattleCuePlayerComponent | RSE | Plays timelines for the ATB and Tactics directors |
URSEBattlePresentationSettings | RSE | Project Settings → Battle Presentation |
URSECameraFramingSettings | RSE | Project Settings → Camera Framing |
URSECameraOcclusionSettings, URSECameraOcclusionSubsystem | RSE | Fade and hide of what hides the party |
URSERPGCameraArm | RSE | The party RPG camera arm |
ARSETacticsCameraPawn, ARSEActionCameraRig | RSE | Grid Tactics and Action cameras |
IRSECameraFocusInterface | RSE | Lets your camera pawn tell the occlusion system what to keep visible (Get Camera Focus) |
ARSEFreeTacticsCameraPawn | RSE | The Free Tactics camera |
URSEAudioSettings, URSESoundCatalog | RSE | Music, sound catalog and the mixer |
20.4 Settings
Project Settings → RPG Saga Engine. Full list: Appendix B.
- Camera Framing: Enabled, Camera Blocker Tag (
RSE.CameraBlocker), rules per mode (Exploration, Grid Tactics, Free Tactics, ATB, Action, Shot, Capture), Cinematic Battle, capture clearance values. - Camera Occlusion: Check Interval 0.1 s, Max Targets 4, Never Fade Tag (
RSE.NoFade), Max Fade Size 1500 cm, Hide Delay 0.15 s, Show Delay 0.4 s, ghost and hide fallbacks, Ground Tags (RSE.Ground). - Exploration → Camera: Camera Style (Tactical or Third Person) and the values of each style (zoom limits, tilt, rotation, follow smoothing for Tactical; distance, shoulder offset and so on for Third Person).
- Battle Presentation: playback and fast-forward speed, approach values and default timelines, Camera Policy, Reduce Effects, cinematic moments, floating text styles, the action banner.
- Audio: Context Music and Map Music, fades, a Sound Catalog (
URSESoundCatalog: gameplay tags to sounds), battle event sounds (critical, perfect, block) and the mixer channels.
20.5 Blueprint usage
Authoring is mostly data. For custom behavior, subclass RSE Battle Cue Custom in Blueprint:
- Content Browser → Add → Blueprint Class → search Custom (Blueprint) (class
URSEBattleCue_Custom). - In the class defaults set Duration (0 means instant: only start and stop run), Subjects (which units the events receive), Receive Update (only if you need per-frame work) and Is Impact (the results show when the cue starts).
- Override On Cue Start (Player, Subject Actors): for example For Each Loop over Subject Actors → Spawn Emitter Attached.
- Override On Cue Update (Alpha, 0 to 1 over Duration) for continuous effects and On Cue Stop (Skipped) to leave things in their final state. The events are
const: the cue is shared data, so keep state on the subject actors, not in the cue. - Add your cue to a presentation asset's cue list, with its Delay and Wait For Completion.
To tell the occlusion system what must stay visible on your own camera pawn, implement the RSE Camera Focus Interface (Class Settings → Interfaces → Add) and override Get Camera Focus, returning the feet of the characters to keep visible (most important first) and the actors never to hide. Dev commands for tuning the exploration camera while playing: RSE.Camera zoom in|out|min|max|<distance>, RSE.Camera yaw <deg>, RSE.Camera tilt up|down|reset, RSE.Camera pan <x> <y>, RSE.Camera style tactical|thirdperson, and RSE.Camera prop wall|pillar|bigtree|mesh to drop a test obstruction in front of the camera (props are tagged RSE.CameraTestProp).
20.6 C++ usage
// A new cue type: a timed pause the timeline can wait for.
UCLASS(meta = (DisplayName = "My Beat"))
class UMyCue_Beat : public URSEBattleCue
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, Category = "Beat", meta = (ClampMin = "0", Units = "s"))
float Seconds = 0.2f;
virtual void Start(URSEBattleCuePlayerComponent& Player, FRSECueState& State) const override
{
State.Duration = Seconds; // the player ends the cue when this has elapsed
}
virtual float EstimateDuration(const URSEBattleCuePlayerComponent&) const override { return Seconds; }
};
Extension points: subclass URSEBattleCue (or the Blueprint-friendly URSEBattleCue_Custom); implement IRSECameraFocusInterface on your actor to feed the framer a focus; use FRSECameraFramer with your own FRSECameraFramingRules for a camera of your own; add presentation assets per ability. A new battle mode only needs to use the cue player component and call the framer.
20.7 Advanced
- Per-mode rules. Each
FRSECameraFramingRuleshas costs (Yaw Cost, Pitch Cost, Pull Cost, Alternate Cost, Blocked Cost) that decide which pose wins. Raise Pull Cost if you hate the camera moving closer; raise Yaw Cost if you want it to rotate less. - Performance. Pose probes run on a timer, only the safety sphere runs every frame. Cue player components do not tick when idle. Soft assets (montages, Niagara, sounds) load asynchronously before the first cue, and the abilities of a battle preload at its start.
- Co-op. Time dilation (slow motion, hit-stop) is refused in co-op sessions, so one player's show never slows another's. See 22-networking.md.
- Capture tools. The framing rules include a Capture set and checks for capture points: camera in geometry, look target hidden, a wall closer than Capture Min Clear Distance (400 cm) in front of the view. Occluded points are moved to a free pose.
- Debug CVars.
RSE.Camera.Framing 0(off),RSE.Camera.FramingDebug 1,RSE.Camera.CinematicBattle 1,RSE.Battle.Presentation.Speed,RSE.Battle.Presentation.ReduceEffects(-1 = settings, 0 or 1). See Appendix C. - Limits. Returning from a cinematic shot to the battle camera uses the engine's view-target blend (both ends are clean, the path is not probed). The ATB camera frames once; the stage can call
FrameCameraagain after changes.
20.8 Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Camera sits inside a rock | The rock is wider than Max Fade Size but not tagged | Tag it RSE.CameraBlocker; check with RSE.Camera.FramingDebug 1 |
| A small prop never fades | It carries RSE.NoFade | Remove the tag |
| The camera jumps around a pillar | Hysteresis too short | Raise Switch Delay and Return Delay in the mode's rules |
| An ability has no camera shot | The policy is Fixed, or the action is not special | Set the policy to All, or tick Cinematic Camera on the ability |
| Effects fire but results never appear | The timeline has no Impact cue and the cue was skipped mid-way | Add an Impact cue; skipping always fires the remaining impacts, so check the cue asset loaded |
| Shake and flash are missing | Reduce Effects is on (setting, option or CVar) | Check RSE.Battle.Presentation.ReduceEffects and the player's option |
| A cinematic moment cannot be skipped | Input is captured elsewhere, or a super move without camera lost its prelude | Check the policy; the HUD stays visible in that case |
| Camera cues play in ATB but not as expected | Classic Camera Policy is Special Only | Switch to All or mark the ability special |
20.9 See also
- 06-abilities-and-statuses.md for ability presentation fields and the ability preview.
- 08-battle-common.md for directors, events and modes.
- 09-battle-tactics.md, 10-battle-atb-and-turn-based.md, 11-battle-free-tactics.md, 12-battle-action.md for each mode's camera.
- 18-weapons.md for the weapon cues.
- Design notes:
docs/design/camera-framing.md,docs/design/battle-presentation.md.