Quick answer: Increase edge_connection_margin on the NavigationMap. Regions whose edges are within margin distance auto-connect.

A multi-room dungeon has separate NavigationRegion3D per room. NPCs path within a room fine but can’t cross thresholds — edge connections didn’t form between regions.

Edge Connection Margin

var map = nav_region.get_navigation_map()
NavigationServer3D.map_set_edge_connection_margin(map, 0.5)

Default margin is small (~0.25). Increase if region edges aren’t precisely aligned. Margin specifies how close edges must be to bridge.

Region Overlap

Regions ideally overlap by ~margin amount at thresholds. A door region overlapping the room region by 0.5 units creates a strong join. Pure butt-joint relies on exact alignment.

Same NavigationMap

Regions on different maps don’t connect. Default GameMap is shared across regions in the same scene; verify via get_navigation_map() returning the same RID.

Rebake After Move

Moving a region in editor doesn’t re-evaluate connections. Manually rebake or trigger via:

NavigationServer3D.map_force_update(map)

Verifying

NPC paths from one room to another. Debug nav mesh visualizer shows green connector lines at region boundaries. No path failures across thresholds.

“Two regions connect when their edges meet within margin. Tune margin or overlap to ensure stitching.”

For procedural dungeons, generate regions slightly larger than tile bounds — guarantees overlap at connections regardless of layout.