LCM Nav3D Free demo Get it on Fab

LCM Nav3D - Editor Tools

Everything here lives behind the Nav3D button in the Level Editor toolbar. The panels are also under Window ▸ Level Editor.

The Nav3D toolbar menu, grouped into Set Up, Build, View and Help

Figure 1 - The Nav3D toolbar menu. Four groups, in the order you need them. Greyed entries are not broken: Build Octree is finite-only and Bake Skeleton appears only when something will actually read a bake, so the menu never offers you an action that would be an expensive no-op.


Quick start

  1. Nav3D ▸ Set Up Level... - creates and configures the manager, picks finite or streamed navigation to match your map, attaches navigation invokers, and builds.
  2. Nav3D ▸ Health Check - dock it and leave it open while you work.
  3. Add the LCM Nav3D FlyTo task to a Behavior Tree or StateTree, or drop the Mass crowd traits on a spawner.

Nav3D actors are also in the Place Actors panel under LCM Nav3D.

Keyboard shortcuts

Shortcut Action
Ctrl+Alt+N Health Check
Ctrl+Alt+B Build Octree
Ctrl+Alt+V Show Voxels

Rebind or clear them under Editor Preferences ▸ Keyboard Shortcuts.


The Welcome screen

Opens once per plugin version, and any time from Nav3D ▸ Welcome / Getting Started.

The LCM Nav3D welcome screen: brand header, three getting-started steps, required plugin checklist, and help links

Figure 2 - Welcome screen. The part worth reading is REQUIRED PLUGINS: it checks the dependencies declared in LCMNav3D.uplugin against what your project actually has enabled, and offers an Enable button on any that are off. If one is missing, the plugin's modules will fail to load - this panel is where you find that out, rather than from a startup error.

Links under HELP & COMMUNITY are read from the .uplugin descriptor, so the UI and the store listing cannot drift apart. A greyed link means that field is empty in the descriptor, not that the link is broken.


The Manager panel

Select the LCM Nav3D Manager in your level. Above the numbered settings sections you get a header card with live state pills (world model, residency, voxelizer), the context-appropriate build actions, and two readouts worth knowing about.

The manager Details panel: header card with state pills, Configuration Health, What You Get, and sections 1 Setup and 2 Voxels

Figure 3 - Manager Details, top half. Read it downwards:

The build actions

Only the buttons that mean something in your world model are shown - a finite world has no chunks to skeletonize, and a streamed world has no single SVO to save.

Button World What it does
Build SVO (Editor Preview) Finite Voxelizes now, into memory. EQS queries and the debug draw resolve without entering Play. Thrown away when you close the editor - it is a preview, not a build product
Bake to Asset Finite Writes the SVO to a ULcmSVODataAsset and attaches a streaming proxy that loads it. The shipped game stops voxelizing the world at every launch
Bake Skeleton Infinite, and only when Use Baked Skeleton is on Whole-map coarse connectivity, so long-range routing is complete from frame 0

Bake to Asset uses the manager's own World Extent, Min Voxel Size, Clearance Padding and collision filters, so the bake cannot describe a different world than the runtime expects. It records what it was baked against, which is what lets the health section tell you later that the bake has gone out of date. On success it also turns Auto Build On Play off: leaving both on is not belt-and-braces, because the proxy and the manager each write the navigation data during BeginPlay with no ordering guarantee between actors - which one wins is undefined, and when the rebuild wins you pay the full load-time stall the bake exists to remove.

Re-bake after moving level geometry or changing the voxel settings.

Save the level after baking. The asset is written to disk immediately, but the streaming proxy that loads it is a level actor. Close without saving and you are left with a bake nothing reads - and Auto Build On Play cleared on an actor that was discarded, so the level has no navigation at all.

The LCM Nav3D Bake Volume actor is the other way to bake, and it is for a different job - see Bake Volumes below. For a single finite world, the manager button is simpler and cannot disagree with the runtime settings. Both write the same asset format through the same code path.

Configuration Health

Setting combinations that no per-property clamp can express, checked live and shown where the settings are. Rows come in three tiers: a real hazard, i a property worth knowing, an all-clear.

⚠ Warning Why it matters
Voxel budget Exceeding it does not fail - generation silently coarsens Min Voxel Size until it fits, so you get less precision than you configured
Clearance Padding vs Min Voxel Size Padding inflates every solid surface, so padding ≥ 2× voxel size seals narrow openings. The right value is your agent radius, which only you know
Invoker radius vs Chunk Size A radius under one Chunk Size leaves an agent with no neighbouring chunks, so no route can be planned and nothing further streams
Residency demand An invoker bubble is a cube: chunks scale as (2R / ChunkSize)³, so halving Chunk Size costs 8× the chunks
Baked asset out of date A bake is a frozen snapshot and nothing at runtime can tell it stopped matching the level. It still loads - you just get agents avoiding open space or routing through geometry, with nothing logged
Auto Build On Play overrides the bake Both write the navigation data during BeginPlay with no ordering guarantee, so which one the level uses is undefined
i Information What it tells you
Finest leaf vs the floor The finest leaf is ChunkSize / 2ᵏ, landing anywhere in [2×, 4×] Min Voxel Size non-monotonically. Not a defect - see below

Why the leaf ratio is information, not a warning. It depends only on Chunk Size (it is identical at every Min Voxel Size), so it really asks "is Chunk Size a power-of-two multiple of the voxel floor" - and the Auto-Tuner's own candidate grid fails that test on most of its entries. Whether a coarse leaf actually hurts - a sealed opening, an unroutable pair - cannot be decided from the settings, and is exactly what the tuner measures. So the panel states the fact and lets the measurement carry the verdict.

What the staleness check can and cannot see. It compares the voxel settings the bake ran with, and an order-independent hash of every collidable actor inside the baked bounds - identity, transform, scale and local bounds. So it catches geometry moved, added, removed or rescaled, which is nearly always what "the level changed" means. It does not walk source triangles, so a mesh edited in place - same actor, same transform, new geometry - hashes identically. Re-bake after editing a mesh. Assets baked before this signature existed report as unverifiable rather than stale.

When a row is present the section offers one action: Tune Settings..., which opens the Auto-Tuner. There are deliberately no per-warning "apply this value" buttons - such a value would be derived, and this system's search space is non-monotonic, so only measurement can answer it.

These are the same checks that have always been written to the Output Log - the log is now a consumer of the same rules, so the two can never disagree.

What You Get

The values your settings actually resolve to, rather than the ones you typed:

Row Note
Navigable volume Finite only. The real world-space bounds - see the note below
Finest leaf edge The real smallest voxel, with its ratio to the achievable floor (2 × Min Voxel Size)
Voxels / chunk (or / world) Against the hard budget
Chunk builds / frame Derived from the Streaming Profile
Invoker radius floor What the profile raises an invoker's radius to, if anything

The finite volume is centred on the world origin, not on the manager actor. World Extent is a half-extent, so the volume spans [-WorldExtent, +WorldExtent] on each axis around (0,0,0). The manager is a logical singleton with no root component, so moving it does not move the navigable volume. Build your playable space around the origin, or use an infinite world.

Why the panel is short

The manager has no geometry, no collision and no transform, so the inherited Actor sections that cannot apply - Rendering, Collision, Physics, LOD, Cooking, Input, HLOD, Mobile, Ray Tracing, Texture Streaming, Virtual Texture - are hidden from this panel. They still exist on the class; they are just noise here.

Replication, Actor (tags) and World Partition are deliberately kept: the manager hosts multicast RPCs, tags are a legitimate way to find it from gameplay, and Is Spatially Loaded genuinely matters for a singleton that must not stream out.


Bake Volumes

Drop an LCM Nav3D Bake Volume from the Place Actors panel and resize the brush to cover the area you want baked. Its panel uses the same language as the manager's - header pills, one action, Configuration Health, What You Get.

I want two separate areas navigable. Which setup?

Grid mode + Infinite World. Nothing else does it. This is the single most common wrong turn, so it is worth being blunt about why:

A finite world has exactly one navigation volume - one slot, in memory. A single-volume Bake Volume writes it. The manager's Bake to Asset writes it. Both write it at the same chunk coordinate, so whichever ran last wins and the other area has no navigation at all. Overlapping the two does not join them - there is nothing in a finite world that could hold both. Baking area A, then baking area B, and finding only B navigable is the system working exactly as a finite world is defined, not a bug in the bake.

What you want Setup
One area Either producer - a single-volume Bake Volume or the manager's Bake to Asset. Not both
One bigger area Enlarge the volume, or raise the manager's World Extent
Two or more separate areas Snap To Global Grid on each volume + Infinite World on the manager

The manager's Bake to Asset now refuses to run while a single-volume Bake Volume is in the level, rather than silently replacing its output, and both Details panels flag the pair.

One volume or many?

This is the Snap To Global Grid switch, and the answer differs because the two settings feed different runtime containers:

Snap To Global Grid Produces Manager must be How many volumes
Off One chunk, sized to this volume Finite world Exactly one
On One chunk per grid cell Infinite world As many as you like

Off feeds the manager's single navigation slot, so a second single-volume bake has nowhere to go: both write the same asset name at the same chunk coordinate, and only the last one baked survives. To cover more ground with one volume, enlarge it - or raise the manager's World Extent.

On feeds a coordinate-keyed container that holds any number of chunks. This is the multi-region workflow, and it needs Infinite World on the manager. With a finite manager every proxy is routed into the one slot instead, so each chunk silently overwrites the last. The header pill turns amber when the two disagree, and Configuration Health says which way to resolve it.

"Infinite World" names how navigation is stored and streamed, not whether the data is generated at runtime. A fully baked, grid-aligned world is still an infinite-mode world - the chunks just arrive from disk instead of the voxelizer.

Do several connected volumes route across their seams?

Yes. Chunks are keyed by grid coordinate, so which volume produced a chunk does not matter; adjacent chunks connect the same way whether they came from one volume or four. What matters is that every volume uses the same Chunk Size, Min Voxel Size and Clearance Padding (the panel checks all three), and that they are grid-aligned, which Snap To Global Grid guarantees.

Seams are scanned at bake time and shipped with each chunk, so long-range routing across a chunk boundary is correct from the first frame.

Assets baked before 2026-08-03 are different, and the panel will tell you. They carry no seam data, so each boundary loaded as one full-face portal - a portal asserting the whole shared face was passable without checking the voxels, corrected only once an agent physically entered the chunk. A walled seam therefore looked open to long-range routing. The failure was a route that exists on the macro graph but not in the world, which is why it survived casual testing. Re-bake to fix it; Configuration Health reports how many chunks are still in that state.

Very large grids are the one exception. Scanning seams needs the whole grid resident at once (a portal is a property of the boundary between two chunks), so past r.LcmNav.Bake.MaxMacroChunks (default 1024) the bake falls back to writing chunks one at a time with no seam data. That is logged, and the completion dialog says so. Raise the cap if you have the memory, or bake in smaller volumes.

What the volume panel checks

Every rule here is about two actors disagreeing. The bake volume carries its own copy of the voxel settings and nothing reconciles them at runtime, so a mismatch does not fail - it bakes, it loads, and navigation is computed against a world that is not there.

⚠ Warning Why it matters
Bake mode vs manager world model Decides whether the chunks land in the single slot or the keyed container - the table above
Chunk Size ≠ the manager's Baked chunks are placed at coordinate × the runtime Chunk Size, so a mismatch puts every chunk in the wrong place and makes the streamer regenerate the map at load
Min Voxel Size / Clearance Padding ≠ the manager's The bake describes a differently-shaped world, and the staleness check compares against the manager's values - so the bake reads as out of date the moment it is written
Two single-volume bake volumes Same asset name, same coordinate: silent overwrite
Voxel budget per chunk Exceeding it coarsens Min Voxel Size silently, which is what voxelizes narrow openings shut
More than 512 chunks The bake is synchronous on the game thread with no cancel, and writes one asset each
Baked chunks without precomputed seams Assets from before 2026-08-03, or past the macro-bake cap - see the seam section above. Re-bake
The manager also bakes this volume Two producers, one finite slot - see the top of this section
Oblong brush in single-volume mode An octree root is a cube, so the bake inflates to the largest axis on all three and pays voxels for the remainder

Sizing the brush, and why the numbers don't match it

Three things surprise people here, so the panel states all three under What You Get:

Chunk Size is hidden unless Snap To Global Grid is on, because it is not read otherwise - resolution comes from Min Voxel Size in both modes. When it is shown, it is snapped to a whole multiple of Min Voxel Size as you type (chunk edges must land on voxel boundaries), so the panel reports the value actually in use, and flags it if the manager disagrees.

i Information What it tells you
No obstacle channels set Empty falls back to WorldStatic only; anything solid on another channel bakes as open air

There is deliberately no fix button here. Every warning is two settings disagreeing, and either side may be the one that is wrong - that is a choice only you can make.

After baking, the debug view shows the result

Baking from a volume used to draw nothing while the manager's own build drew immediately, which looked like the bake had failed. It had not - the debug renderer reads the manager's in-memory navigation, and a bake writes assets and spawns proxies that inject nothing until BeginPlay. The bake now loads its own output back into the editor manager, so both paths look the same. Tick Draw Debug Volumes on the manager to see it.


Setup Wizard

One page, because every control feeds the same live readout.

The Setup Wizard: five numbered sections from What's in this level through to Configuration check

Figure 4 - Setup Wizard. Note what section 1 has already worked out on its own: this is a World Partition map, so section 2 tells you Infinite is the only correct choice and says why - a finite octree would be built over cells that are not loaded. Section 4 is an explicit checklist, so nothing happens that is not written on screen, and section 5 re-runs the configuration check against the settings you are proposing rather than the ones currently saved.

Section What it does
What's in this level World Partition, geometry size, manager count, pawns, the GameMode's default pawn
Navigation mode Finite vs Infinite, plus the Streaming Profile
Resolution Chunk Size / World Extent, Min Voxel Size, Clearance Padding
What will be done An explicit checklist - nothing happens that isn't listed
Configuration check Live problems, updating as you change settings

Under What will be done, Build the octree now has a companion: ...and save it to an asset. That is the same voxelization with its result saved rather than discarded - the wizard's route to the Bake to Asset flow. It is off by default, unlike the other actions: those are reversible edits to settings, while this one writes content to /Game/LcmNavigation/BakedData and adds an actor to your level. Save the level afterwards.

The resolution readout

Finest voxel you actually get: 250 cm (best possible here: 200 cm - 1.25x)

This is the most important line in the wizard. The finest leaf is ChunkSize / 2^k, so it lands between 2x and 4x your Min Voxel Size and moves non-monotonically with Chunk Size. Measured at Min Voxel Size 100:

Chunk Size Finest leaf
3000 375 cm
5000 312 cm
7000 219 cm
8000 250 cm

A smaller chunk can give you a coarser voxel. Openings narrower than the leaf voxelize shut, which is why "it works at one Chunk Size and not another" is a real effect and not a bug in your level.

Everything the wizard does is one undo step. Nothing is saved for you.


Health Check

A dockable panel that reports anything which would stop agents moving, with a Fix button on each row.

The Health Check panel showing READY, with Set Up Level, Fix All, Show In Viewport and Refresh

Figure 5 - Health Check, on a level that passes. The verdict is one word - READY, WORKS, WITH WARNINGS or NOT READY - coloured and sized so it reads from across the room. Fix All greys out when there is nothing to bulk-fix, which is the state you want to end up in and then stop thinking about. Dock this panel and leave it open; it re-inspects itself whenever the map, its actors or any Nav3D setting changes.

The volume box is worth looking at once. World Extent is a half extent and the box is centred on the world origin, not on the Manager actor - the Manager has no root component, so dragging it 500 m away moves nothing. Everyone reads that in the tooltip; nobody believes it until they see the box sitting somewhere other than around their level.

Typical findings: no manager, more than one manager, a World Partition map set to Finite, no navigation invoker anywhere, over the voxel budget, Clearance Padding wide enough to seal openings.

Invoker radius below one Chunk Size is the classic one. The agent has no neighbouring chunks, so no route can be planned, so nothing further streams - and it looks exactly like "the AI refuses to move". The Automatic, Quality and Performance streaming profiles floor it for you; Manual does not.


Auto-Tuner

Builds the octree at each candidate setting, runs your routes through the real planner, and ranks what it measured.

It runs as three steps, shown as a rail across the top:

1 Routes to test → 2 What to measure → 3 Measured results

Auto-Tuner step 1 with no routes: the toolbar, and a panel listing the three ways to add one

Figure 6 - Step 1, before you have added anything. The empty state is the screen every user sees first, so it does the teaching: three numbered ways in, each naming what must already be in your level for it to work. Note the footer - the Next button is disabled and the reason is printed beside it in amber rather than hidden in a tooltip.

Choosing routes

A route is a journey your agents actually make. Every one must complete for a configuration to be considered, so use the journeys your game depends on - a setting that routes the open sky but not your stairwell will pass a convenient route and fail in play.

Start with Detect From Level. The toolbar above the list is grouped by intent, left to right:

Group Buttons When
Find them for me Detect From Level Always try this first. Appends; never replaces hand-built routes, and skips duplicates.
Build from selection Set Start, Add Goal(s), Add Pair You can see the endpoints in the level.
Place by hand Place Start, Place Goal Agents or goals only exist at runtime.
View Show All, Clear Viewport Check the endpoints before spending minutes on a sweep.
Discard Remove All -

What "Detect From Level" needs

Detection reads specific things out of the level. If none of them are there it correctly finds nothing - so this is the checklist for making it work, in descending order of confidence:

It looks for You get
A pair of LCM Nav Probe Markers sharing a Route Name The most reliable result - you stated the route explicitly
Actors carrying a Navigation Invoker component (instance or Blueprint) Start points, from the actual Nav3D agent signal
An AMassSpawner A start at the spawner's location
Plain placed Pawns Starts, flagged as a weak guess

Goals are never guessed, and this is the usual reason detection "does nothing". On most projects a goal comes from a blackboard key, a StateTree binding or a runtime tag - none of which exist at edit time. So a level full of pawns can detect plenty of agents and still produce zero complete routes. That is exactly what the Goal marker is for.

When detection adds nothing, the panel says which of those cases you are in and what to do about it, rather than reporting "0 routes added".

Detection appends - it never replaces routes you built by hand, and it skips duplicates by endpoint.

Building routes by hand

Each route carries its own agent width (diameter, cm), editable on its row - a gap a drone fits through may be unusable for a gunship, so one sweep can answer for a mixed fleet. 0 applies no size filtering.

Press Show on any route to highlight it in the viewport with the others drawn faintly for context.

Auto-Tuner step 1 with one route listed, showing the # / Route / Distance / Agent width columns and Show and Remove buttons

Figure 7 - Step 1, with a route added. Add Pair named it after the two actors it came from, in order, so a reversed route is obvious rather than something you debug later. Two things changed in the chrome the moment the route existed: step 1 in the rail gained a tick, and the footer's Next turned live.


Step 2 - What to measure

Auto-Tuner step 2: Quick / Standard / Thorough presets, the exact values each will try, and the cost estimate

Figure 8 - Step 2. A preset never leaves you guessing what it means: the exact Chunk Size, Min Voxel and Padding values it will try are printed underneath it. The amber line is the honest cost estimate - configuration count, worst-case chunk count and which Chunk Size produces that worst case, because a smaller chunk needs more of them for the same route.

Leave Also verify Mass FlowField can traverse the route off unless you ship a FlowField crowd. Behaviour Tree, StateTree and Mass PathFollowing all dispatch through the same planner the tuner already queries, so they are covered either way; FlowField is a different solver and costs an extra field solve per chunk per route.


How it ranks

  1. Completeness is a hard gate. A configuration that cannot plan a route is rejected however fast it is. "Complete" means the path reaches the goal, not merely that the query returned success.
  2. Among the survivors you get three picks - Best Quality (finest measured voxel), Fastest (cheapest to build and hold) and Recommended (the finest voxel within twice the cheapest one's memory).

The full matrix is always shown, so you can disagree on the merits. Click any column header to sort by it - the three picks keep their badges wherever they land, and sorting back to no column restores the ranked order. Copy Table puts every measured row on the clipboard as tab-separated text, which is a far better thing to attach to a support thread than a screenshot.

Auto-Tuner step 3: the measured results table with Chunk, Voxel, Pad, Leaf, Routes, Flow, Ratio, Build and Memory columns

Figure 9 - Step 3, measured results. How to read a row:

Column Read it as
Routes The hard gate. Green 1/1 survived; red 0/1 is out no matter how good the rest of the row looks.
Leaf The measured finest voxel - the number that decides what fits through a gap. Sort by it to rank quality.
Ratio Path length ÷ straight-line distance. 1.00 is a straight line; nothing can be lower.
Build / Memory What the configuration costs to produce and to hold. Sort by Memory to rank cost.
⚠ icon This row could not route, or its build hit the chunk budget. Hover the row for the reason.

Show is enabled on failed rows too, where Apply is not. That asymmetry is deliberate: applying a broken configuration would be wrong, but looking at one is the whole point - the red rings it draws mark where each route gave up, and that position is usually the answer.

Seeing the routes

A route you cannot see is a route you cannot check, and the single mistake that invalidates a whole sweep - an endpoint sitting inside a building or under the terrain - measures as "no configuration can route this level", which looks exactly like a real finding.

The red rings are usually the whole answer. A route that gives up against a doorway, vent or stairwell was not blocked by your level - it was blocked by Clearance Padding, which inflates every solid surface and seals openings narrower than the leaf voxel. Lower the padding and re-measure before concluding the level cannot be navigated.

Show is deliberately enabled on failed rows too, where Apply is not: applying a broken configuration would be wrong, but looking at why it broke is the point.

What it does and does not cover

Behavior Tree, StateTree, Mass PathFollowing Covered - all use the same planner
Mass FlowField Covered only with "Also verify Mass FlowField..." ticked - it is a different solver
Streaming (invoker radius, builds per frame) Not tuned - that is the Streaming Profile's job
Dynamic obstacles Voxelized where they currently sit; their motion is not simulated

Park moving obstacles in the positions that most constrain navigation before tuning, and set each route's agent diameter to whatever actually flies it.

A sweep voxelizes the level once per configuration. Expect minutes, not seconds. The progress dialog can be cancelled, and your settings are restored either way - nothing changes until you press Apply on a row.


Project Settings

Project Settings ▸ Plugins ▸ LCM Nav3D. Project-wide only - anything that can differ between two levels lives on the Manager actor, where it is saved with the level.

Content Locations

Setting Default
Baked Navigation Path /Game/LcmNavigation/BakedData
Baked Skeleton Path /Game/LcmNavSkeletons

Changing a path does not move an existing bake, but it does not orphan one either: the loaders probe the configured path first and the shipped default after, so an already-baked level keeps loading. Re-bake to migrate it properly.

New Level Defaults

What the Setup Wizard proposes for a level with no manager yet - Chunk Size, World Extent, Min Voxel Size, Clearance Padding, Streaming Profile and the obstacle collision channels. Set these once and "the way we set up a level here" stops being a convention someone has to remember.

They are proposals. Measured level geometry still overrides the world extent, an existing manager's authored values still win, and nothing here rewrites a level that is already configured.

If your project puts level geometry on a custom collision channel, adding it here is the difference between a one-time setup step and a bug on every new level. An empty channel list voxelizes the world as open air, and that failure is silent - open air passes every clearance filter and every quality metric.

Console Variable Overrides

A map of r.LcmNav.* / r.LcmGPU.* names to values, applied at startup. This is the escape hatch for the ~345 console variables the page deliberately does not curate: pinning one here puts it in DefaultGame.ini, so it is version-controlled, survives a restart, and is visible to the whole team.

Most of these variables exist to A/B a research question and their correct shipping value is the default. Check first whether the behaviour you want is already a real property on the Manager or on the FlyTo task - it usually is, and a property is saved with the asset that needs it instead of applied to everything.


Keyboard shortcuts

Shortcut Action
Ctrl+Alt+N Health Check
Ctrl+Alt+B Build Octree
Ctrl+Alt+V Show Voxels

Rebind or clear them under Editor Preferences ▸ Keyboard Shortcuts.


Where things are configured

Setting Where
World type, voxel sizes, collision channels Nav3D Manager, Details panel
Streaming aggressiveness Manager ▸ Streaming Profile
Per-agent size, smoothing, solver The FlyTo task / Mass trait
Output paths, new-level defaults, pinned CVars Project Settings ▸ Plugins ▸ LCM Nav3D
Everything else r.LcmNav.* console variables