Top Down Camera

A standalone native top-down camera with responsive pointer controls, movement profiles, terrain and camera collision handling, perspective or orthographic group framing, advanced planar boundaries, smooth saved views, local occlusion options, and an optional shared-focus replication bridge.

Version 1.1.0 Unreal Engine 5.4–5.8 Win64 Code plugin Enhanced Input Blueprint-ready

Quick start

  1. Install the Top Down Camera package matching Unreal Engine 5.4, 5.5, 5.6, 5.7, or 5.8 and enable it in Edit → Plugins. Restart the editor if prompted.
  2. Open a map. In Place Actors → All Classes, place a Top Down Camera actor.
  3. In the actor's Details panel, enable Is Active On Begin Play.
  4. Press Play. The included keyboard, mouse, gamepad, and touch controls are assigned automatically.
  5. Enable only the optional pointer, terrain, collision, boundary, occlusion, or shared-focus behavior that the project needs.
No project GameMode change is required. The included GameMode, showcase controller, targets, HUD, and runtime exhibits are used only by the example map.

To inspect a working setup, enable Show Plugin Content in the Content Browser and open TopDownCamera/Example/Maps/TopDownCamera.

Legacy-safe defaults: a newly placed reusable camera starts with Immediate movement, a Circle boundary, and optional edge scrolling, drag panning, terrain following, camera collision, cursor-anchored zoom, soft boundaries, and occlusion disabled. The example controller changes some settings only on its example camera so every feature can be tried without changing the reusable defaults.

Requirements and compatibility

ItemSupported release surface
Plugin version1.1.0
Unreal Engine5.4 through 5.8 inclusive, supplied as descriptor-pinned packages for each engine version
Target platformWindows 64-bit (Win64)
Required engine pluginEnhanced Input, supplied with Unreal Engine
Delivery typeSource-included C++ code plugin with included example content

The runtime has no dependency on another product plugin or on content under a host project's /Game mount. Blueprint-only projects can use the exposed actors, components, structs, properties, functions, and events.

Release scope: the current source snapshot passed native validation, blank-project packaging, and runtime tests on Unreal Engine 5.4, 5.5, 5.6, 5.7, and 5.8 for Win64. Final customer-package nomination remains in progress.

What is included

  • Camera-relative planar and bounded vertical movement with Immediate, Smooth, and Inertial response profiles.
  • Reusable viewport-edge scrolling and left, middle, or right mouse-drag panning.
  • Perspective arm-length zoom, orthographic width zoom, and optional zoom toward the pointer or pinch center.
  • Downward terrain traces and optional Spring Arm probe collision with separate configurable channels.
  • Weighted trackers, three tracking modes, and automatic group fitting in both perspective and orthographic projection.
  • Circle, Rectangle, Polygon, and placeable Region boundaries, plus an optional inward soft-deceleration zone.
  • Serializable view-state values, named runtime bookmarks, smooth camera travel, and actor or location focus commands.
  • Local-player occluder hiding or notification events for a project-owned material fade or roof system.
  • An optional replicated shared-focus component that transports deliberate focus intent without replicating local camera control.
  • A self-contained native example map with authored feature exhibits, an animated Canvas HUD, eight redistributable CC0 example sounds, replaceable Enhanced Input assets, full C++ source, tests, and versioned public documentation on GitHub.

Included controls

The supplied IMC_TopDownCamera mapping contains 21 key-to-action mappings across ten replaceable input actions. The table below describes those mappings. Touch gestures are sampled directly by the active camera and do not require a separate UI asset.

DeviceInputCamera action
KeyboardW / SMove camera-relative forward / backward.
KeyboardD / AMove camera-relative right / left.
KeyboardE / QMove the pivot height offset up / down within its configured range.
KeyboardTabCycle Manual, Follow Group, and Auto Frame.
MouseMouse Y / XPitch with reversed vertical direction / yaw using per-event delta actions.
MouseMouse wheelZoom using a per-event delta action. When Zoom Toward Pointer is enabled, the camera also compensates its planar pivot toward the resolved world anchor.
GamepadLeft stickMove on camera-relative forward and right axes.
GamepadRight stickPitch and yaw through dedicated held-rate actions.
GamepadRight / left triggerZoom in / out through a dedicated held-rate action.
GamepadRight / left shoulderMove the pivot height offset up / down.
GamepadFace button top (Y / Triangle)Cycle tracking mode.
TouchOne-finger drag in the left 45% of the viewportPan the camera.
TouchOne-finger drag in the remaining viewportPitch and yaw.
TouchTwo-finger pinch / vertical dragZoom and move the pivot height offset.

The supplied four stick-axis mappings include an 18% axial dead zone. Mouse pitch, mouse yaw, and wheel zoom use the main actions in Delta mode. The separate gamepad overrides are each a dedicated rate action; they always use held-rate timing and are independent of the three main action mode selectors.

Reusable pointer controls

Enable Edge Scrolling samples the pointer inside the configured viewport edge band and combines that normalized direction with keyboard, stick, touch, and External Move Input. In split screen, the edge band, drag fallback scale, and native touch pan/rotate regions use the owning ULocalPlayer view rectangle, including its pixel origin; a pointer or touch in another local player's rectangle does not drive this camera. By default, edge scrolling requires a visible cursor. Enable Mouse Drag Panning lets the selected mouse button pull the map beneath the pointer. It first tries exact deprojection against the pivot-height plane and uses a projection-aware screen-to-world fallback when that plane cannot be resolved.

Both pointer systems are camera features rather than requirements of the showcase controller. They are opt-in so projects can decide when a visible cursor, selection tool, or UI state should own pointer input.

Feature example

The included map uses ATopDownCameraGameMode, ATopDownCameraShowcaseGameState, ATopDownCameraShowcasePlayerController, and ATopDownCameraShowcaseHUD. The development .uproject opens this map by default in both the editor and a launched game; this host-project convenience is not part of the packaged plugin. The controller applies example-only settings after the active camera is ready. It starts the example in Immediate movement with a 180 cm soft boundary zone, cursor-anchored zoom, and local-hide occlusion enabled. Terrain following and camera collision start disabled so each result can be compared directly. The cursor remains visible, selection and commands are always available, middle-mouse drag rotates, and edge scrolling remains active. The HUD sorts movement and interaction shortcuts vertically at the top left and places seven clickable feature controls in a centered 4-plus-3 bottom grid, including Sound. A setting change slides a large, wrapped explanation down at the top right for five seconds; another change immediately dismisses and replaces it.

The removable showcase also includes clearly audible looping ambience, spatial footsteps for moving targets, and separate feedback for toggle changes, hint entry and exit, unit selection, and valid move commands. Press M to mute or restore the complete local showcase mix. All eight sounds are example content and can be removed without affecting the reusable camera runtime.

Polygon versus Spline Region: Polygon uses the camera actor's explicit local straight-edged vertex list. Spline Region reads an independently placeable Boundary Region actor, so designers can reshape and move the shared region in the level. The current runtime boundary is still piecewise linear between sampled spline points; the Region workflow is chiefly about placeable authoring and reuse.

The two plateaus, steep connecting slopes, lowered center, dotted boundary geometry, and spline Boundary Region are ordinary serialized actors in the example map. Showcase units sample the terrain height, remain aligned to world up, and stop at Pawn-blocking geometry while roaming or moving to commands. Random patrol points are limited to tagged terrain with a clear direct path, blocked units immediately resume reachable roaming, and commands beyond the arena are pulled back to the last valid terrain point. The old under-foot unit and target discs are intentionally hidden or removed. The removable example controller only changes the dotted outline transforms when the selected boundary shape changes; it does not create or destroy the exhibit geometry at runtime.

Example versus integration: the authored exhibits, arena, roaming targets, selection and command example, custom cursor, materials, and Canvas HUD are demonstration content. A normal integration needs only the camera, optional trackers or boundary region, chosen input assets or direct calls, and any optional shared-state component the project's networking design requires.

Project setup

Use the supplied input

Leave Input Mapping and the ten action overrides at their supplied defaults. The main mouse X, mouse Y, and mouse-wheel actions use Delta value mode. Separate pitch-rate, yaw-rate, and zoom-rate actions provide frame-rate-independent held input: the supplied preset maps yaw rate to Q/E and the right stick, and vertical movement to Z/X and the shoulder buttons. Cycle Tracking Mode is a Boolean action. When the camera activates, it adds its mapping to the local player's Enhanced Input subsystem if that context is not already active. On deactivation it removes only the mapping it added.

Use project input assets

  1. Create an Enhanced Input Mapping Context and Axis1D actions for forward movement, right movement, vertical movement, pitch, yaw, and zoom.
  2. Assign the context to Input Mapping.
  3. Expand Input → Action Overrides and assign the matching objects. When one preset combines mouse deltas with held sticks or triggers, assign separate Pitch Rate, Yaw Rate, and Zoom Rate actions. Assign an optional Boolean action to Cycle Tracking Mode.
  4. Under Input → Value Modes, choose how the main pitch, yaw, and zoom values are interpreted. Dedicated rate actions always use held-rate timing and do not use those selectors.
  5. Set Input Mapping Priority when this context must win or lose against another active context.

The camera binds the action objects assigned in its Details panel; their asset names do not need to match the supplied names. Movement is per-second input. Delta yaw, pitch, and zoom values are consumed as event impulses. Rate values are multiplied by frame time.

Activation and multiple cameras

Activate resolves the local Player Controller at Player Index, takes its view target, resets perspective zoom, orthographic width, rotation, height offset, velocity, travel, and all input state, then enables input. Deactivate releases only input and mapping state owned by this camera and restores the prior view target.

Activation of a second Top Down Camera for the same player safely releases the first camera. Activation and deactivation view-target blend settings are editable per camera.

Local players only: activation requires a local Player Controller. A dedicated server has no local camera to activate, and camera discovery or tracker retry work is disabled there.

Tracking and automatic framing

  1. Add a Top Down Camera Tracker component to each actor that should influence the camera.
  2. Assign Top Down Camera on the tracker when the level contains more than one camera. If empty, the component looks for an active camera and then the first valid camera.
  3. Enable Follow Tracked Objects, Zoom To Fit Tracked Objects, or select a tracking mode that enables them.
SettingWhat it does
Tracking WeightControls an actor's influence on the followed center. Zero excludes the tracker.
Is EnabledIncludes or excludes the tracker without removing the component.
Follow Tracked ObjectsMoves the pivot to the weighted center without automatic fit. Tracking Affects Height decides whether tracker Z is included.
Zoom To Fit Tracked ObjectsEnables Auto Frame: follows the weighted center, suppresses manual planar movement, and fits active tracker bounds by changing Spring Arm length in Perspective or Ortho Width in Orthographic.
Zoom Tracking Offset / SpeedAdds perspective distance and controls its exponential response.
Ortho Tracking Offset / SpeedAdds world-space padding on both axes and controls interpolation of orthographic width.
Tracking modeFollowAutomatic fit
ManualOffOff
Follow GroupOnOff
Auto FrameOnOn

Perspective fitting evaluates the tracked world bounds against the rendered camera rotation, FOV, viewport dimensions, aspect-ratio constraint, and Spring Arm socket offset. Orthographic fitting projects all eight bounds corners onto the rendered view's right and up axes, then selects a width that fits both the horizontal requirement and the vertical requirement multiplied by viewport aspect.

Auto Frame owns the planar pivot and the active projection's zoom. It follows the tracked center, ignores keyboard, stick, edge-scroll, drag, and touch planar movement, and clears accumulated planar velocity. If no valid trackers are available, it holds the current pivot instead of accepting manual planar movement. Spring Arm position lag can smooth the automatic movement separately.

Tracker components do not tick. They register on Begin Play and unregister when their owner leaves play.

Camera settings

GroupImportant settings
MoveMove Speed, Movement Profile, acceleration, braking, inertial coast, vertical speed, and height-offset limits.
Move → TerrainEnable Terrain Following, trace channel, trace height and depth, optional sphere radius, terrain offset, and response speed.
CollisionEnable Camera Collision plus Spring Arm probe size and channel.
ZoomPerspective default/min/max arm length, Zoom Speed, Zoom Toward Pointer, anchor strength, and anchor trace channel.
Zoom → OrthographicDefault/min/max Ortho Width plus orthographic tracking padding and response.
RotateDefault yaw and pitch, pitch limits, event-delta speed, and dedicated held-rate speed.
TrackingFollow, automatic fit, perspective and orthographic fit settings, and height participation.
BoundaryFive shape choices, shape-specific authoring data, optional Region actor, and soft-zone response.
ViewsAuthored or runtime bookmarks, travel curve and exponent, and input cancellation.
OcclusionDisabled, Hide For Local Player, or Notify Only plus channel, sweep radius, five-point target sampling, minimum blocked fraction, conservative projected-overlap fraction, enter/exit delays, target offset, and query interval.
InitBegin-play activation, Player Index, and view-target transition settings.
InputMapping context, priority, action overrides, value modes, reusable pointer controls, and touch gestures.

Movement profiles

Immediate applies requested planar velocity and stops immediately, preserving version 1.0 behavior. Smooth moves velocity toward the target using Movement Acceleration and uses Movement Deceleration after release or reversal. Inertial accelerates and reverses like Smooth but uses the lower Inertia Deceleration after release. Get Current Movement Speed reports the resulting world-space planar speed.

Terrain following and camera collision

Terrain following runs a line trace or optional sphere sweep downward at the boundary-clamped requested pivot. The final pivot height is the sampled impact height plus Terrain Height Offset plus the user's persistent manual Height Offset. Terrain tracing ignores the camera and registered tracker owners. Tune the trace channel so decorative roofs or units do not become terrain unless that is intended.

Camera collision is separate. It updates SpringArm.bDoCollisionTest, Probe Size, and Probe Channel from the camera properties, allowing Unreal's Spring Arm to retract the rendered camera around blocking geometry. It does not move the pivot or replace terrain following.

Projection and zoom ordering

Perspective zoom changes Target Arm Length between Min Zoom and Max Zoom. Orthographic zoom changes Ortho Width between Min Ortho Width and Max Ortho Width. These values remain separate when Set Projection Mode or Toggle Projection Mode changes projection.

When pointer anchoring is enabled for a manual zoom update, the camera resolves the pointer or pinch-center ray against Zoom Anchor Trace Channel and falls back to the current pivot-height plane. It then applies planar compensation, boundary clamping, and terrain following. Zoom Anchor Strength blends between no compensation and full compensation.

Runtime update order

  1. Resolve the owning local controller and refresh tracker bounds when follow or automatic fit is active.
  2. Apply Spring Arm collision settings, then sample reusable pointer and touch input.
  3. Cancel active travel when configured and manual input is present. While travel remains active, it owns the complete camera value state for that update.
  4. Otherwise update movement, clamp the boundary, apply terrain height, update rotation, and then update manual or automatic projection zoom.
  5. After the camera transform is final, query occlusion from the rendered camera to the followed target or pivot.
Defensive ranges: pitch, perspective zoom, orthographic width, and height ranges are ordered before use. Reversing a minimum and maximum does not disable clamping.

Boundary authoring

Every built-in boundary constrains planar X/Y while preserving the requested Z. Get Boundary Outline can return 3 to 1024 evenly spaced world points for runtime visualization. Invalid or unavailable authoring data fails safely rather than manufacturing a different shape.

ShapeAuthoring and behavior
CircleUses Max Boundary Range around the camera actor's placed world location.
RectangleUses world-XY Rectangle Half Extents around the camera actor location.
PolygonStores camera-local Polygon Boundary Points directly on this camera. The points move and rotate with the camera actor; convex and concave closed polygons are supported when at least three valid points are supplied.
RegionReferences a separate, placeable Top Down Camera Boundary Region actor. Use Box Volume for a transformed box footprint or Closed Spline to edit a straight-edged polygon with viewport spline control points.

Polygon versus Closed Spline Region: both use the same straight-edge containment and closest-edge clamping behavior. Polygon is lightweight data owned by one camera and edited as an array. Closed Spline Region is a reusable world actor that can be positioned, rotated, scaled, assigned to a camera, and edited visually through spline control points. Closed Spline still requires at least three non-collinear points; curves and tangents are intentionally ignored. Its authoring components have collision and overlap generation disabled.

Boundary Soft Zone Width defines an inward band. Only velocity moving closer to the hard edge is scaled, from full speed at the inner edge toward Boundary Soft Zone Minimum Speed Scale at the hard edge. Inward and non-approaching movement remains full speed, and the hard clamp still prevents escape. Zero width retains the version 1.0 hard-only result.

Saved views, focus, and smooth travel

FTopDownCameraViewState stores a pivot location, yaw, pitch, perspective zoom, orthographic width, projection mode, and tracking mode. It deliberately omits live input, controller references, view-target ownership, transient terrain samples, and occlusion state.

  • Capture View State returns the current value state.
  • Apply View State cancels active travel, clamps values to configured ranges, and optionally constrains the pivot to the current boundary.
  • Travel To View State boundary-clamps the destination, interpolates location, shortest-path angles, zoom, and orthographic width, and changes projection halfway through the trip. Tracking is Manual during travel and the destination tracking mode is restored on completion. An inactive camera applies the destination immediately because it has no active travel tick.
  • Focus Location travels the pivot without changing framing. Focus Actor uses component bounds and can calculate a fitting perspective distance or orthographic width. Orthographic framing projects all eight corners of the actor's world-space component AABB onto the current camera Right and Up axes, then applies the effective constrained or owning-local-player aspect policy plus Ortho Tracking Offset.
  • Cancel Camera Travel stops at the current interpolated state. By default, direct movement, rotation, zoom, touch, edge-scroll, or drag input also cancels travel.

FTopDownCameraBookmark pairs a unique name with a view state. The editable Saved Views array can contain authored presets. Save Current View adds or replaces a named runtime entry; Recall, Remove, and Get Saved View Names provide the remaining operations.

Bookmarks are values, not automatic disk persistence. Runtime changes live on that camera instance. Copy the exposed bookmark or view-state data into the project's SaveGame system when presets must survive a new world or application session.

On Camera Travel Completed fires after immediate or timed travel reaches its destination. On Camera Travel Cancelled fires when an active trip is explicitly cancelled, replaced, or interrupted by enabled manual-input cancellation.

Occlusion and roof integration

Unreal Engine's renderer already performs visibility and occlusion culling for objects that are hidden behind other surfaces, but that optimization does not make the foreground wall or roof transparent so the player can see a tracked subject. This optional camera feature performs that separate gameplay-facing job.

Queries run from the rendered Camera Component to a five-point cross around the followed tracking bounds when following valid targets, or around the Spring Arm pivot otherwise. The cross uses camera-right and camera-up directions, expands to the tracked bounds, and never becomes smaller than Occlusion Target Sample Radius. A component must first block at least Occlusion Minimum Blocking Fraction of those samples. It must then overlap at least Occlusion Minimum Projected Overlap Fraction of its own projected screen bounds with the target sample footprint before the whole component may hide. The default 0.6 screen-space gate keeps a large wall or roof rendered when only a small portion covers the focus; zero disables this second gate. Invalid projections fail conservatively and remain visible. Occlusion Enter Delay and Occlusion Exit Delay add temporal hysteresis to prevent one-query flashes. Registered tracker owners are ignored. Occlusion Probe Radius selects sphere sweeps; zero selects line traces. Occlusion Update Interval can reduce query frequency.

ModeBehavior
DisabledPerforms no query and releases local-hide or notification state owned by this camera.
Hide For Local PlayerAdds blocking primitive components to that Player Controller's HiddenPrimitiveComponents. It removes only entries it added when they stop blocking, the mode changes, the camera deactivates, or play ends.
Notify OnlyLeaves rendering unchanged and emits begin/end On Occluder Changed events for project logic.
No universal material fade is implied. Hide For Local Player is a binary local visibility mask, not opacity interpolation. Notify Only is the integration point for a project's own fade parameters, dithered materials, roof layers, or building-visibility rules because arbitrary project materials do not share one safe fade parameter.

Optional shared-focus replication bridge

UTopDownCameraSharedStateComponent is an optional component for deliberate presentation intent such as co-op pings, spectator cues, or a director asking clients to look at a location. FTopDownCameraSharedFocusState contains a network-quantized fallback location, an optional focus actor, tracking mode, optional perspective zoom, optional orthographic width, and a server-assigned revision.

OperationAuthority boundary
Capture Camera Focus StateCreates a revision-zero request from a local camera and optional actor. It does not send anything.
Request Shared FocusBroadcasts On Shared Focus Requested locally. It is not an RPC and does not modify authoritative state.
Publish Shared Focus StateSucceeds only on an authoritative owner, sanitizes optional values, assigns a new nonzero revision, and marks the component for replication.
Apply Latest State To CameraUses a valid focus actor's component-bounds center, or the quantized fallback location, while preserving explicit zoom, orthographic width, and tracking intent through the camera's local travel API. The component never remotely takes a view target or replicates camera input or transform.
Set Local Camera / Auto ApplyStores a transient, non-replicated local reference for optional automatic application. Assigning a different valid camera also applies the newest state already accepted, so late local camera discovery does not miss a revision.
This component is not an RPC, permission system, or complete multiplayer camera solution. The project must route requests through an appropriately client-owned RPC, validate team/role/rate permissions on the server, and publish on an authoritative replicated owner that is relevant to intended recipients. A replicated component cannot overcome a non-replicated or owner-only actor. An optional Focus Actor also needs the project's normal actor replication and relevancy; otherwise clients use the fallback location.

Included cross-player transport example

ATopDownCameraShowcaseGameState is the example's replicated, always-relevant owner for one Shared State component. The example GameMode selects it without requiring a map edit. Each local showcase controller resolves that component from Game State and assigns only its own transient local camera; a dedicated server can validate and publish focus without constructing or retaining any local camera.

The removable transport implementation remains available in the example source, but the solo showcase deliberately assigns no Share or Apply hotkey because its replicated result is not legible in a one-player demonstration. An integration can capture focus locally, broadcast the reusable On Shared Focus Requested delegate, and call the owning Player Controller's reliable Server Request Shared Focus RPC. The server allows at most one transport attempt per controller every 0.5 seconds, rejects non-finite data, limits each fallback-location coordinate to ±1,000,000 cm, limits requested perspective zoom and orthographic width to 100,000 cm, accepts only a Top Down Camera Showcase Target from the same server world or no actor, clears the untrusted client revision, and then publishes through the authoritative Game State component. If a non-replicated showcase target reference is unavailable on the server, the policy clears that actor request and preserves its quantized fallback location.

The server policy is deliberately permissive example code, not production authorization. It proves an owned request route, bounded validation, rate limiting, authoritative publication, and all-player relevance. Replace it with the project's team membership, roles, cooldowns, spatial rules, logging, and abuse response. Reliable RPC rate limiting controls accepted work but does not make untrusted reliable-message flooding harmless.

A Focus Actor still follows normal Unreal actor reference replication and relevancy. If it is unavailable on a receiving client, the network-quantized fallback location remains usable. The Game State transport does not replicate local camera transforms, input, view targets, bookmarks, or unit commands.

Blueprint API

Normal configuration is available in the Details panel. The following public API supports runtime integrations.

Camera node or eventUse
Activate / Deactivate / Is Top Down Camera ActiveOwn, release, or query the local view target and camera input.
Move Forward / Move Right / Move VerticalSupply signed movement input.
Set External Move InputSupply an additional persistent planar channel. Built-in edge and drag input are separate channels.
Turn / Look Up / Zoom In / Zoom OutSupply rotation and zoom input.
Set Delta Rotation Input Suppressed / Is Delta Rotation Input SuppressedGate mouse-style delta rotation without blocking held-rate rotation.
Reset Camera Input StateClear movement, pointer, vertical, delta, held-rate, and touch input plus accumulated movement velocity.
Compute Edge Scroll DirectionCalculate normalized right/forward edge input for custom cursor integrations.
Get Current Movement SpeedRead post-profile planar speed in centimeters per second.
Register Tracker / Unregister Tracker / Get Registered TrackersManage tracker membership.
Calculate Tracking Bounds / Set Tracking BoundsRefresh default bounds or publish custom bounds from an override.
Get Tracking PositionRead the current weighted center.
Get / Set / Cycle Tracking ModeQuery or select all four follow/fit combinations.
Get / Set / Cycle Boundary ShapeQuery or select all five boundary modes.
Get Boundary OutlineSample the active valid shape as evenly spaced world points.
Capture View State / Apply View StateRead or immediately restore camera value state.
Travel To View State / Cancel Camera Travel / Is Camera TravelingStart, stop, or query smooth travel; inactive cameras apply destinations immediately.
Focus Location / Focus ActorTravel to a location or optionally frame actor bounds.
Save Current View / Recall Saved View / Remove Saved View / Get Saved View NamesManage the instance's named bookmark array.
Set Projection Mode / Toggle Projection ModeSelect Perspective or Orthographic.
Get Desired LocationOverride or inspect the next movement/tracking target before boundary and terrain handling.
On Camera Activated / On Camera DeactivatedObserve local view ownership.
On Camera Travel Completed / On Camera Travel CancelledObserve smooth-trip completion or interruption.
On Occluder ChangedReceive primitive begin/end state in either active occlusion mode.

Boundary Region nodes

Contains World Point, Clamp World Point, Get Boundary Outline, Get Distance Inside Boundary, and Set Closed Spline Points are available on Top Down Camera Boundary Region. Region queries ignore or preserve Z as documented on their pins.

Tracker component nodes

Enable, Disable, Set Top Down Camera, Get Tracking Location, Get Tracking Enabled, and Is Tracking Enabled are available on a tracker. Get Tracking Enabled returns the configured flag; Is Tracking Enabled also requires a valid owner and a finite weight above zero.

Shared State component nodes

Request Shared Focus, Publish Shared Focus State, Capture Camera Focus State, Apply Latest State To Camera, Set Local Camera, Has Shared Focus State, and Get Latest Shared Focus State expose the bridge described above. On Shared Focus Requested and On Shared Focus Changed are assignable events.

The removable showcase harness additionally exposes Get Shared State and the owned reliable Server Request Shared Focus RPC on its Player Controller. Production projects should normally replace the showcase request policy rather than inherit it unchanged.

Optional C++ use

C++ is not required. A native consumer adds TopDownCamera to its module dependencies and includes only the public headers it uses.

#include "TopDownCamera.h"
#include "TopDownCameraBoundaryRegion.h"
#include "TopDownCameraTrackerComponent.h"

// Camera is an ATopDownCamera*.
Camera->Activate();
Camera->MovementProfile = ETopDownCameraMovementProfile::Smooth;
Camera->bEnableEdgeScrolling = true;
Camera->bZoomTowardCursor = true;
Camera->SetProjectionMode(ETopDownCameraProjectionMode::Orthographic);
Camera->SetTrackingMode(ETopDownCameraTrackingMode::AutoFrame);

// Named views are runtime values unless the project copies them to SaveGame.
Camera->SaveCurrentView(TEXT("Squad"));
Camera->FocusActor(TargetActor, 0.75f, true);

The reusable integration types are ATopDownCamera, UTopDownCameraTrackerComponent, ATopDownCameraBoundaryRegion, and the optional UTopDownCameraSharedStateComponent. The GameMode, Game State, Example Character, Showcase Target, Showcase Player Controller, and Showcase HUD are removable native example helpers.

Customization

Create Blueprint subclasses of Top Down Camera, Top Down Camera Tracker, or Top Down Camera Boundary Region for project defaults. Keep project subclasses outside the plugin.

Override Calculate Tracking Bounds for a different group-framing rule and call Set Tracking Bounds from the override. Override Get Desired Location for a custom target before boundary and terrain processing.

Use On Occluder Changed in Notify Only mode to connect project-owned materials, roof layers, or visibility systems. Use the shared component's local request delegate to connect a project-owned and validated networking route. These hooks intentionally leave material conventions, RPC ownership, authorization, and gameplay policy with the consuming project.

The native activation, input ownership, and view-target handoff functions are deliberately non-overridable so cleanup cannot be skipped. Use their delegates for project events.

Troubleshooting

ProblemChecks
The camera does not become active.Enable Is Active On Begin Play or call Activate. Confirm Player Index resolves a local Player Controller and another system does not replace the view target afterward.
The view works but mapped input does not.Confirm Enhanced Input is enabled, the mapping and actions are assigned, and another UI or mapping context is not consuming the controls. Check Input Mapping Priority.
Edge scrolling does nothing.Enable it, verify the pointer is inside Edge Scroll Region Pixels, and show the mouse cursor or disable Edge Scroll Requires Visible Cursor.
Pointer input rotates when I only want to select.Keep delta rotation suppressed while the cursor is free and enable it only for an explicit gesture. The example reserves plain left-click for selection and held middle mouse for rotation.
Smooth or inertial movement feels unresponsive.Compare Movement Acceleration to Move Speed, then tune Movement Deceleration or Inertia Deceleration. Check whether a soft boundary is also scaling outward velocity.
Terrain following chooses a roof or misses the floor.Use a dedicated Terrain Trace Channel, verify blocking responses, trace height/depth, and optional probe radius, and keep non-terrain objects from blocking that channel.
The camera still passes through a wall.Enable Camera Collision and confirm the wall blocks Camera Collision Probe Channel. Probe Size affects Spring Arm collision, not the pivot boundary.
Zoom does not stay under the pointer.Enable Zoom Toward Pointer, verify the anchor channel hits the intended surface, show a valid pointer or supply a touch pinch center, and check whether the boundary limits the compensation.
Automatic fit ignores wheel input.Automatic fit owns zoom while valid trackers and Zoom To Fit Tracked Objects are active. Switch to Manual or Follow Group for manual zoom.
Orthographic framing is too loose or tight.Tune Ortho Tracking Offset and its min/max width. The viewport aspect and rendered view rotation affect the required width.
The camera stops before a saved destination.Travel destinations are constrained to the currently active boundary. Check the shape, Region reference, and authoring data.
Polygon or spline boundary does not clamp.Supply at least three valid points. Closed Spline needs three non-collinear linear control points and an assigned Region actor.
Local Hide removes too much geometry.Raise Occlusion Minimum Projected Overlap Fraction so large meshes must cover more of their own screen footprint, then tune Minimum Blocking Fraction or Target Sample Radius. For partial roofs, split the mesh into sensible sections or use Notify Only with project-specific fade materials.
A shared-focus request does not reach the server.Expected: Request Shared Focus is a local delegate, not an RPC. Route it through an appropriately owned project RPC, validate it on the server, and publish from an authoritative replicated owner.
A shared Focus Actor is null on another client.Confirm that actor is replicated and relevant. The bridge retains a quantized fallback location for unavailable actor references.
Runtime bookmarks disappear after restarting.Copy Saved Views or captured view states into the project's SaveGame data and restore them onto the camera instance.
Plugin assets are hidden.Enable Show Plugin Content in the Content Browser settings.

Performance and networking

  • The camera ticks while active, or while a requested begin-play activation waits for its local controller.
  • Pointer input, movement, rotation, zoom, travel, and optional traces are processed only by the active local view camera.
  • Tracker components do not tick. Enabled trackers without a camera use a low-frequency retry in standalone or player worlds.
  • Tracking bounds are read only while follow or automatic fit is enabled.
  • Terrain following performs one line trace or sphere sweep per active movement update while enabled.
  • Camera collision delegates probing to the Engine Spring Arm.
  • Occlusion uses its configurable update interval; the default is 0.05 seconds while enabled.
  • The shared-state component does not tick and replicates only its compact latest focus state. The showcase Game State owns the example instance so accepted revisions are relevant to every player.
  • The removable showcase targets tick only while roaming, waiting, or moving. Showcase movement is disabled on a dedicated server.

When tracking is enabled, the active camera reads bounds from every enabled registered target on each camera update. No universal target-count limit is advertised because actor complexity and frame budget differ. Profile representative scenes; for very large groups, override Calculate Tracking Bounds and publish cached or rate-limited bounds.

The camera actor, local input, view target, pointer state, bookmarks, travel, terrain sample, occlusion ownership, and tracker registration are not replicated by default. Run presentation control on each owning client. The optional shared component replicates only explicitly published focus intent and still depends on the owning actor's replication and relevancy. The included example satisfies that owner requirement with its always-relevant Game State; a component placed on an owner-only Player Controller would not reach unrelated clients.

Known limitations

  • The validated release surface is Unreal Engine 5.4 through 5.8 inclusive on Win64; other engine versions and platforms are not claimed.
  • Boundaries are planar. Polygon and Closed Spline edges are straight, and Region Box Volume Z extent does not constrain camera height.
  • Terrain following and occlusion rely on project collision-channel responses; they do not classify semantic terrain or roofs automatically.
  • Hide For Local Player is binary visibility. Arbitrary material fading is not included; Notify Only exposes the integration event.
  • Spring Arm collision protects the rendered camera, not the pivot or general gameplay navigation. The removable showcase units separately stop at Pawn-blocking geometry but do not find a path around it.
  • Runtime bookmarks are not automatically written to SaveGame.
  • The reusable shared-focus component supplies state, revision filtering, replication, and local application helpers; it does not itself supply an RPC or authorization policy. The removable showcase adds an owned reliable RPC, basic bounds and actor validation, a 0.5-second per-controller limit, and an always-relevant Game State owner, but intentionally does not define production team rules, roles, logging, abuse response, or Focus Actor relevancy.
  • The included always-on selection and command surface is a removable planar example. It does not provide navigation-mesh pathfinding, obstacle avoidance, advanced formations, combat, behavior trees, or replicated unit commands.
  • The touch preset divides the viewport into pan and rotate regions. Projects with their own mobile UI can disable it and call the public controls.

Versioning, public API, and migration

Top Down Camera uses a three-part version number: major.minor.patch. Patch releases are intended for compatible fixes, minor releases may add compatible functionality, and major releases may contain breaking public API or saved-data changes.

When a public Blueprint or C++ API must be replaced, the old API will normally remain deprecated for at least one published minor release with a documented replacement. Removal is reserved for a major release unless an Unreal Engine incompatibility, security issue, or data-safety defect requires earlier action.

Back up the project and commit source control before changing plugin versions. Changes to saved properties, configuration keys, reflected names, or asset paths require release-specific migration notes and an automated compatibility test where Unreal supports one.

Migrating from 1.0.0 to 1.1.0

  • Existing Circle and Rectangle enum values and properties are preserved. Circle remains the default.
  • Immediate movement preserves the prior direct response. New acceleration and inertia profiles are optional.
  • Edge scrolling, drag panning, terrain following, camera collision, pointer anchoring, soft boundaries, and occlusion are disabled by default on the reusable camera.
  • Perspective remains the normal existing projection. Orthographic width has an independent default and range.
  • Existing input action references remain valid. The supplied context now contains 21 mappings, including keyboard, mouse, gamepad, vertical movement, held Q/E yaw, and tracking-cycle controls.
  • Saved Views, advanced boundary authoring, and the shared-state component add new reflected data without requiring a redirect for version 1.0 assets.
  • The example controller intentionally starts in Immediate movement while enabling a soft zone and pointer-anchored zoom on the example camera. Its feature exhibits and Boundary Region are serialized in the map, and those example settings do not change reusable class defaults.
  • The example no longer gates selection behind an RTS mode. Is Rts Command Mode remains as a deprecated always-true compatibility query, and Toggle Rts Command Mode remains as a deprecated no-op so existing example integrations compile.
First release: version 1.0.0 has no earlier public Top Down Camera release or customer data format to migrate. It intentionally ships without legacy redirects. Version 1.1.0 retains its public names and compatibility defaults while adding optional functionality.

Changelog

VersionSummary
1.1.0Added reusable edge scrolling and mouse-drag panning; Smooth and Inertial movement profiles; terrain-height following and Spring Arm camera collision; pointer-anchored perspective and orthographic zoom; Polygon, Box Volume, and Closed Spline Region boundaries with soft approach zones; orthographic tracker fitting; serializable view states, named bookmarks, focus commands, and cancellable smooth travel; five-point occlusion coverage sampling, conservative projected-overlap qualification, and temporal hysteresis; an optional replicated shared-focus state bridge plus a removable Game State and owned-RPC transport example; an always-visible custom cursor; always-on selection and commands; terrain-grounded roaming units that remain upright and stop at Pawn-blocking walls; a vertical top-left shortcut legend; a centered seven-button HUD with Collision on C, no Occlusion control, a clickable M Sound tile, and larger animated five-second explanations; and eight CC0 showcase sounds for ambience, footsteps, UI, selection, and commands. Rebuilt the authored arena around integrated dark terrain slopes, fully realtime daylight and fill lighting, no under-foot target discs, and no oversized standalone exhibit geometry. Added descriptor-pinned Win64 package support for Unreal Engine 5.4 through 5.8 inclusive.
1.0.0Initial native C++ product version with movement, responsive delta rotation, zoom, bounded vertical rig movement, weighted tracking, four cycleable tracking modes, perspective group fitting, activation handoff, circle and rectangle boundaries, keyboard/mouse, gamepad and touch camera controls, plus a removable random-waypoint RTS command example with forgiving full-body selection, retained WASD/left-stick/wheel camera control, cursor-edge scrolling, and command-line/target-circle feedback.

Support

Support and bug reports: community support.

If Top Down Camera has helped your project, please consider leaving an honest review on the Top Down Camera Fab listing.