Skip to content

Camera Actor

World cameras are instances of AOperatingSystemCCTVActor. The bundled BP_CCTV_Actor Blueprint adds a visible mesh and pre-wired Scene Capture Component 2D.

Plugin path:

OperatingSystemContent/Shared/Blueprints/Actors/CCTV/BP_CCTV_Actor

flowchart TB
  Actor["BP_CCTV_Actor"]
  Mesh["Static Mesh · camera body"]
  Capture["SceneCaptureComponent2D"]
  RT_Main["Main Render Target 2048×1024"]
  RT_Grid["Grid Render Target 512×256"]
  MID["Dynamic Material · Texture param"]

  Actor --> Mesh
  Actor --> Capture
  Capture --> RT_Main & RT_Grid
  RT_Main & RT_Grid --> MID
  1. Drag BP_CCTV_Actor from plugin content into your level.
  2. Position and rotate so the capture component faces the monitored area.
  3. Ensure Start Activated is true (default) so the actor registers on BeginPlay.
  4. Set a unique Camera Name for each instance.

Cameras register with UOperatingSystemCCTVWorldSubsystem under a Group name. Empty group defaults to Default.

flowchart LR
  Cam1["Lobby · Group Default"]
  Cam2["Parking · Group Default"]
  Cam3["Vault · Group Secure"]
  Sub["UOperatingSystemCCTVWorldSubsystem"]
  Cam1 & Cam2 --> Sub
  Cam3 --> Sub
  Sub --> Map["CameraMap: Group → Camera set"]
PropertyDefaultDescription
Start ActivatedtrueCalls Activate() on BeginPlay
Camera Nameauto Cam NShown in CCTV UI lists
GroupDefaultOrganize cameras for filtered queries
Zoom Adjust5FOV delta per zoom step
Min Max Zoom25100FOV clamp (degrees)
Main View Size2048 × 1024Single-view render target resolution
Grid View Size512 × 256Per-tile resolution in grid layouts
Override Material UInonePer-camera material; falls back to project settings

Leave empty to use Project Settings → CCTV Settings → UI Material (M_UI_CCTV). Set per actor only when a specific feed needs a different scan-line or distortion effect.

The capture component is tuned for performance:

SettingValueWhy
Capture Every FramefalseDriven by program data tick
Capture On MovementfalseAvoids redundant captures
Capture SourceFinal Tone Curve HDRMatches in-game lighting
Always Persist Rendering StatetrueStable feeds between captures

Captures run via Capture Scene Deferred when the CCTV program data object ticks (or on manual Capture Now).

sequenceDiagram
  participant Data as Program Data
  participant Cam as BP_CCTV_Actor
  participant SC as SceneCapture2D
  participant RT as Render Target

  Data->>Cam: Capture()
  Cam->>SC: CaptureSceneDeferred()
  SC->>RT: Write frame
  Note over RT: Widget reads via Get Main/Grid View MID

Query cameras by group from the world subsystem:

Event BeginPlay (your security desk actor)
→ Get Operating System CCTV World Subsystem
→ Get Camera Group Names → Groups
→ Get Cameras From Group ("Secure") → Secure Cameras
→ For Each → Print Camera Name
FunctionReturns
Get Camera Group NamesAll registered group names
Get Cameras From GroupAOperatingSystemCCTVActor array for one group
Camera Ids mapStable int ID → camera actor
On Security Breach Resolved
→ Lobby Camera → Toggle State (true)
On Power Outage
→ For Each (All CCTV Actors) → Toggle State (false)

Disabled cameras return nullptr from Get Main View MID / Get Grid View MID and skip capture calls.

On State Changed on the actor broadcasts the camera’s Camera Id — the CCTV widget’s On Camera State Changed event receives the same ID.

FunctionEffect
Zoom InDecrease FOV by Zoom Adjust (clamp to min)
Zoom OutIncrease FOV by Zoom Adjust (clamp to max)
Reset ZoomRestore FOV captured at BeginPlay

Zoom only applies when the camera is enabled.

Blueprint example — spawn camera at runtime

Section titled “Blueprint example — spawn camera at runtime”
Event Construct
→ Spawn Actor from Class (BP_CCTV_Actor)
Transform: Security Cam Socket World Transform
Camera Name: "Dynamic Cam 1"
Start Activated: true
→ (Camera auto-registers on BeginPlay)

Blueprint example — security zone filter

Section titled “Blueprint example — security zone filter”

Use groups to show only exterior cameras in one UI tab:

Function Get Exterior Cameras
→ Get Operating System CCTV World Subsystem
→ Get Cameras From Group ("Exterior") → Return

Assign Group = Exterior on outdoor BP_CCTV_Actor instances in the editor.

CamerasRecommendation
1–4FrameBased · Medium or Fast
5–9FrameBased · Slow or VerySlow
Many feeds, low priorityTimeBased · Capture Time 0.5–1.0 s
Snapshot onlyManual + Capture Now on button press

Lower Grid View Size (e.g. 256 × 128) when displaying nine feeds on a small in-game monitor mesh.