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.
Quick start
- 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.
- Open a map. In Place Actors → All Classes, place a Top Down Camera actor.
- In the actor's Details panel, enable Is Active On Begin Play.
- Press Play. The included keyboard, mouse, gamepad, and touch controls are assigned automatically.
- Enable only the optional pointer, terrain, collision, boundary, occlusion, or shared-focus behavior that the project needs.
To inspect a working setup, enable Show Plugin Content in the Content Browser and open TopDownCamera/Example/Maps/TopDownCamera.
Requirements and compatibility
| Item | Supported release surface |
|---|---|
| Plugin version | 1.1.0 |
| Unreal Engine | 5.4 through 5.8 inclusive, supplied as descriptor-pinned packages for each engine version |
| Target platform | Windows 64-bit (Win64) |
| Required engine plugin | Enhanced Input, supplied with Unreal Engine |
| Delivery type | Source-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.
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.
| Device | Input | Camera action |
|---|---|---|
| Keyboard | W / S | Move camera-relative forward / backward. |
| Keyboard | D / A | Move camera-relative right / left. |
| Keyboard | E / Q | Move the pivot height offset up / down within its configured range. |
| Keyboard | Tab | Cycle Manual, Follow Group, and Auto Frame. |
| Mouse | Mouse Y / X | Pitch with reversed vertical direction / yaw using per-event delta actions. |
| Mouse | Mouse wheel | Zoom using a per-event delta action. When Zoom Toward Pointer is enabled, the camera also compensates its planar pivot toward the resolved world anchor. |
| Gamepad | Left stick | Move on camera-relative forward and right axes. |
| Gamepad | Right stick | Pitch and yaw through dedicated held-rate actions. |
| Gamepad | Right / left trigger | Zoom in / out through a dedicated held-rate action. |
| Gamepad | Right / left shoulder | Move the pivot height offset up / down. |
| Gamepad | Face button top (Y / Triangle) | Cycle tracking mode. |
| Touch | One-finger drag in the left 45% of the viewport | Pan the camera. |
| Touch | One-finger drag in the remaining viewport | Pitch and yaw. |
| Touch | Two-finger pinch / vertical drag | Zoom 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.
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.
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
- Create an Enhanced Input Mapping Context and Axis1D actions for forward movement, right movement, vertical movement, pitch, yaw, and zoom.
- Assign the context to Input Mapping.
- 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.
- 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.
- 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.
Tracking and automatic framing
- Add a Top Down Camera Tracker component to each actor that should influence the camera.
- 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.
- Enable Follow Tracked Objects, Zoom To Fit Tracked Objects, or select a tracking mode that enables them.
| Setting | What it does |
|---|---|
| Tracking Weight | Controls an actor's influence on the followed center. Zero excludes the tracker. |
| Is Enabled | Includes or excludes the tracker without removing the component. |
| Follow Tracked Objects | Moves the pivot to the weighted center without automatic fit. Tracking Affects Height decides whether tracker Z is included. |
| Zoom To Fit Tracked Objects | Enables 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 / Speed | Adds perspective distance and controls its exponential response. |
| Ortho Tracking Offset / Speed | Adds world-space padding on both axes and controls interpolation of orthographic width. |
| Tracking mode | Follow | Automatic fit |
|---|---|---|
| Manual | Off | Off |
| Follow Group | On | Off |
| Auto Frame | On | On |
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
| Group | Important settings |
|---|---|
| Move | Move Speed, Movement Profile, acceleration, braking, inertial coast, vertical speed, and height-offset limits. |
| Move → Terrain | Enable Terrain Following, trace channel, trace height and depth, optional sphere radius, terrain offset, and response speed. |
| Collision | Enable Camera Collision plus Spring Arm probe size and channel. |
| Zoom | Perspective default/min/max arm length, Zoom Speed, Zoom Toward Pointer, anchor strength, and anchor trace channel. |
| Zoom → Orthographic | Default/min/max Ortho Width plus orthographic tracking padding and response. |
| Rotate | Default yaw and pitch, pitch limits, event-delta speed, and dedicated held-rate speed. |
| Tracking | Follow, automatic fit, perspective and orthographic fit settings, and height participation. |
| Boundary | Five shape choices, shape-specific authoring data, optional Region actor, and soft-zone response. |
| Views | Authored or runtime bookmarks, travel curve and exponent, and input cancellation. |
| Occlusion | Disabled, 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. |
| Init | Begin-play activation, Player Index, and view-target transition settings. |
| Input | Mapping 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
- Resolve the owning local controller and refresh tracker bounds when follow or automatic fit is active.
- Apply Spring Arm collision settings, then sample reusable pointer and touch input.
- Cancel active travel when configured and manual input is present. While travel remains active, it owns the complete camera value state for that update.
- Otherwise update movement, clamp the boundary, apply terrain height, update rotation, and then update manual or automatic projection zoom.
- After the camera transform is final, query occlusion from the rendered camera to the followed target or pivot.
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.
| Shape | Authoring and behavior |
|---|---|
| Circle | Uses Max Boundary Range around the camera actor's placed world location. |
| Rectangle | Uses world-XY Rectangle Half Extents around the camera actor location. |
| Polygon | Stores 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. |
| Region | References 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.
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.
| Mode | Behavior |
|---|---|
| Disabled | Performs no query and releases local-hide or notification state owned by this camera. |
| Hide For Local Player | Adds 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 Only | Leaves rendering unchanged and emits begin/end On Occluder Changed events for project logic. |
Blueprint API
Normal configuration is available in the Details panel. The following public API supports runtime integrations.
| Camera node or event | Use |
|---|---|
Activate / Deactivate / Is Top Down Camera Active | Own, release, or query the local view target and camera input. |
Move Forward / Move Right / Move Vertical | Supply signed movement input. |
Set External Move Input | Supply an additional persistent planar channel. Built-in edge and drag input are separate channels. |
Turn / Look Up / Zoom In / Zoom Out | Supply rotation and zoom input. |
Set Delta Rotation Input Suppressed / Is Delta Rotation Input Suppressed | Gate mouse-style delta rotation without blocking held-rate rotation. |
Reset Camera Input State | Clear movement, pointer, vertical, delta, held-rate, and touch input plus accumulated movement velocity. |
Compute Edge Scroll Direction | Calculate normalized right/forward edge input for custom cursor integrations. |
Get Current Movement Speed | Read post-profile planar speed in centimeters per second. |
Register Tracker / Unregister Tracker / Get Registered Trackers | Manage tracker membership. |
Calculate Tracking Bounds / Set Tracking Bounds | Refresh default bounds or publish custom bounds from an override. |
Get Tracking Position | Read the current weighted center. |
Get / Set / Cycle Tracking Mode | Query or select all four follow/fit combinations. |
Get / Set / Cycle Boundary Shape | Query or select all five boundary modes. |
Get Boundary Outline | Sample the active valid shape as evenly spaced world points. |
Capture View State / Apply View State | Read or immediately restore camera value state. |
Travel To View State / Cancel Camera Travel / Is Camera Traveling | Start, stop, or query smooth travel; inactive cameras apply destinations immediately. |
Focus Location / Focus Actor | Travel to a location or optionally frame actor bounds. |
Save Current View / Recall Saved View / Remove Saved View / Get Saved View Names | Manage the instance's named bookmark array. |
Set Projection Mode / Toggle Projection Mode | Select Perspective or Orthographic. |
Get Desired Location | Override or inspect the next movement/tracking target before boundary and terrain handling. |
On Camera Activated / On Camera Deactivated | Observe local view ownership. |
On Camera Travel Completed / On Camera Travel Cancelled | Observe smooth-trip completion or interruption. |
On Occluder Changed | Receive 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
| Problem | Checks |
|---|---|
| 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 Moderemains as a deprecated always-true compatibility query, andToggle Rts Command Moderemains as a deprecated no-op so existing example integrations compile.
Changelog
| Version | Summary |
|---|---|
| 1.1.0 | Added 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.0 | Initial 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.