Tutorial 11 - LCMNav3D in the Gameplay Debugger
TL;DR: LCMNav3D ships an LCMNav3D
category in the stock UE5 Gameplay Debugger. In PIE, press the standard
Gameplay Debugger key (usually apostrophe '), select an
agent → the category renders per-agent + plugin-wide state alongside
Recast / BT / EQS / Perception. Zero project setup beyond the plugin
being loaded.
What it shows
Plugin-wide block (always)
== LCMNav3D ==
Manager: resolved
Loaded chunks: 7
NavLink registry: 3
NavArea registry: 1
NavSystem bridge: active
| Field | Meaning |
|---|---|
Manager |
Green when ALcmNavigationManagerSVO is in the world;
red if missing |
Loaded chunks |
ActiveVirtualChunks.Num for infinite worlds; 1 for
finite |
NavLink registry |
Count of ULcmNavLinkComponent currently registered |
NavArea registry |
Count of ALcmNavAreaModifier currently registered |
NavSystem bridge |
Green when the T37 proxy is registered with UNavigationSystemV1 |
Per-agent block (when an actor is selected)
== Agent: BP_FlyingPawn_C_0 ==
Pos: X=1234.5 Y=678.9 Z=500.0
Speed: 624 cm/s
Chunk: (0,0,0) full
SweepPenalty: 0
Perceived: 2 (closest: BP_Enemy_C_1)
| Field | Meaning |
|---|---|
Pos |
Pawn world location |
Speed |
Pawn->GetVelocity.Size in cm/s |
Chunk |
(IntVec3) resolution - full,
coarse (T12 stub), or none (streaming
gap) |
SweepPenalty |
§P9.3 risk-field byte at the agent's location (0.255) |
Perceived |
Count of currently-perceived actors + closest threat name |
How to toggle
- In PIE, press the standard Gameplay Debugger key (usually apostrophe
'- checkProject Settings → Engine → Gameplay Debuggerif you've rebound it). - The Gameplay Debugger HUD appears at the top of the viewport.
- Look for the
LCMNav3Dcategory - it should be enabled by default (state set toEnabledInGameAndSimulateat module init). - Click an actor in the level to select it as the debug target - per-agent block populates.
If the category isn't showing:
- Confirm you're in PIE (Gameplay Debugger only runs in PIE/Standalone, not the editor itself).
- Confirm the plugin is loaded (check Output Log for
[LcmNavBridge]messages on map load). - Confirm you're not in a Shipping/Test build (the category compiles
out when
WITH_GAMEPLAY_DEBUGGER=0).
What survives PIE → editor → PIE reloads
- CVars (debug toggles, chase tuning, OTel NDJSON, etc.) - persist across PIE sessions, reset on editor restart.
- Profile loader state
(
ULcmNavProfileSubsystem) - re-applied on each PIE init if the profile path is in your project's startup. - Telemetry buffer - flushed at module shutdown; survives PIE-stop but not editor-close.
- NavLink + NavArea registry - populated at each
actor's
BeginPlay; PIE-stop clears viaEndPlay. - NavSystem bridge proxy - spawned per-world; new PIE session = new proxy.
The Gameplay Debugger category itself is always-on after module load - it doesn't lose its registration across PIE sessions because the category lives in the GameplayDebugger module's category map, not in the world.
Adding new fields (v2 design hook)
To extend the category in your project subclass:
#if WITH_GAMEPLAY_DEBUGGER
class FProjectGameplayDebuggerCategory_Apex: public FGameplayDebuggerCategory_LcmNav3D
{
public:
virtual void CollectData(APlayerController* PC, AActor* DebugActor) override
{
Super::CollectData(PC, DebugActor);
// Gather project-specific state here
}
virtual void DrawData(APlayerController* PC, FGameplayDebuggerCanvasContext& Canvas) override
{
Super::DrawData(PC, Canvas);
Canvas.Printf(TEXT(" ProjectField: %s"), *MyProjectState);
}
};
#endif
Register your subclass instead of the stock one in your project's module startup.
Performance
CollectDatais called once per tick per active category. Cost ≈ 10 µs (oneGetActorOfClass+ a few accessors + a perception query when an actor is selected).DrawDataruns only when the HUD is visible. Cost ≈ negligible (text rendering).- Shipping builds: zero cost (entire category
compiles out via
WITH_GAMEPLAY_DEBUGGERgate).
Related LCM Nav3D debug surfaces
r.LcmNav.Debug.StateTreeOverlay- on-screen pawn state DrawDebugStringr.LcmNav.Debug.CoverViz- cover-spot DrawDebugSphere overlayr.LcmNav.Debug.FlowFieldViz- flow-field arrow gridLcmNavStress.SpawnAgents <N>- stress-spawn helper for scale testing