Godot 4.5 NavigationRegion2D Bake Fails - TileMap and Collision Shape Fix
You add a NavigationRegion2D, point it at your level built with TileMap (or TileMapLayer nodes) and CollisionShape2D static bodies, click bake or run the game, and nothing usable appears. The navigation mesh stays empty, the outline never forms, or the editor shows warnings about no geometry or failed synchronization. Your agents cannot pathfind even though the level clearly has floors and walls.
This guide explains why NavigationRegion2D baking often fails with tile-based levels in Godot 4.2 through 4.5 and how to fix it with concrete checks.
The Problem
- NavigationRegion2D produces an empty navigation polygon after bake, or the mesh is missing whole rooms.
- You expected TileMap floors or StaticBody2D colliders to become walkable or blocking navigation automatically, but they do not.
- The Output panel mentions navigation parsing, empty sources, or layer mismatches.
- NavigationAgent2D characters slide or fail to find paths even when art looks correct.
Why This Happens
Navigation bakes from navigation geometry, not from every sprite or collider.
By default, walkable areas come from navigation polygons authored in the TileSet (per-tile navigation layers) or from NavigationPolygon resources and parsed geometry according to your region settings. Plain CollisionShape2D on a StaticBody2D is physics, not navigation, unless you explicitly include it via parsing settings or complementary setups (for example NavigationObstacle2D or geometry parsing that includes static colliders, depending on your Godot version and project settings).
TileMap without tile navigation data yields nothing.
If your tiles have no navigation polygon painted in the TileSet editor, the navigation parser has no walkable surface from those tiles, so the bake is empty or incomplete.
Navigation layers must match.
NavigationRegion2D, NavigationAgent2D, and NavigationLink2D use navigation layers (bitmask). If the region and the agent do not share at least one layer, paths will not resolve even when a mesh exists.
Wrong node hierarchy or parsing source.
The region must be able to see the geometry you intend to use. If TileMapLayers live in a different branch than the parser expects, or parsing is restricted to the wrong root, the bake skips your level.
Scale, transforms, and overlapping degenerate geometry can also produce tiny or invalid polygons that look like a failed bake.
Solution 1: Add Navigation Polygons to Your TileSet (Most Common Fix for TileMaps)
For tile-based floors, Godot expects navigation shapes on the tiles, not the collision layer alone.
Step 1: Open the TileSet
- Select your TileMap or TileMapLayer and open the linked TileSet in the bottom panel (or open the
.tresresource). - Select a tile that represents walkable ground.
Step 2: Paint Navigation Regions
- In the TileSet editor, switch to the Navigation tab (navigation layer tools for tiles).
- Choose the navigation layer you want (layer 1 is common for walkable floor).
- Paint a navigation polygon over the walkable part of the tile (usually the top face of a platform tile).
- Repeat for every tile variant that should be walkable.
Step 3: Align Region and Agent Layers
- Select NavigationRegion2D. In the Inspector, set Navigation Layers so they include the same layer index you painted (for example enable layer 1).
- Select NavigationAgent2D on your character. Under Navigation Layers, enable the same layer bits.
Step 4: Bake Again
- Select NavigationRegion2D.
- In the Navigation Polygon resource, use Bake NavigationPolygon (or the bake control in the viewport toolbar, depending on your exact 4.5 UI layout).
- Confirm a visible mesh outline appears over your tiles.
Verification: You should see a filled navigation mesh on walkable tiles in the editor. At runtime, NavigationAgent2D should produce a path across those tiles.
Official reference: Using navigation meshes and NavigationRegion2D in the Godot documentation.
Solution 2: Use Geometry Parsing for Static Colliders (When You Rely on Collision Shapes)
If your walkable surface is defined by StaticBody2D + CollisionShape2D instead of tile navigation data:
Step 1: Inspect NavigationRegion2D Parse Settings
- Select NavigationRegion2D.
- Find Navigation Polygon → Geometry (or equivalent parse / geometry section in your build).
- Enable parsing from Static colliders or Mesh instances as appropriate to your setup. In many projects you enable parsing of Static bodies and ensure those bodies are on layers the parser includes.
Step 2: Mark Static Bodies Correctly
- Ensure floor and wall static colliders use CollisionShape2D (or CollisionPolygon2D) that are not disabled.
- Avoid tiny or degenerate shapes; they can vanish during simplification.
Step 3: Re-bake
Bake the region again and check the outline.
Verification: Navigation mesh appears along floors that only existed as collision. If it is still empty, combine with Solution 1 for hybrid tile + collision levels.
Solution 3: Fix Navigation Layer and Map Synchronization Issues
Step 1: Match All Layer Masks
- NavigationRegion2D – note enabled navigation layers.
- NavigationAgent2D – enable the same layers.
- Any NavigationObstacle2D – confirm it subtracts or blocks on the layers you intend.
Step 2: One Region Per Logical Nav Mesh (Usually)
Multiple overlapping NavigationRegion2D nodes can fight if they cover the same space with different settings. Start with one region for your whole playable floor, then split only when you understand map IDs and synchronization.
Step 3: Restart Scene if Editor Looks Stuck
Sometimes the NavigationServer2D debug view desyncs after large edits. Save the scene, close and reopen it, then bake again.
Verification: Agents path on the same tiles you see highlighted in the navigation debug overlay (Debug → Visible Collision Shapes is physics only; use navigation debug options from the Debugger or editor Gizmos for navigation where available).
Solution 4: TileMapLayer Hierarchy in Godot 4.2+
Godot 4 splits TileMap into TileMapLayer nodes in newer workflows.
- Ensure NavigationRegion2D is positioned so parsed geometry or tile navigation is in the expected parent or subtree. If you moved layers under a different CanvasLayer, confirm transforms still align (navigation uses global space internally, but editor bake can confuse if scales are non-uniform).
- Avoid non-uniform scale on the region or tile root if bakes look skewed or empty.
Alternative Fixes and Edge Cases
- Composite levels: Use navigation on tiles for floors and NavigationObstacle2D or cut-out polygons for dynamic blockers.
- One-way platforms: Often need custom navigation links or separate regions; a single flat bake rarely expresses one-way drops.
- Rotated or flipped tiles: Re-check navigation polygons after rotation; some setups need per-alternative tile navigation.
- CSG or Polygon2D floors: May need manual NavigationPolygon outlines or parsing from visible geometry, depending on your pipeline.
Prevention Tips
- Author navigation when you author tiles so every new ground tile ships with a navigation outline.
- Document your navigation layer convention (layer 1 = walk, layer 2 = water, and so on) in your team readme.
- Bake in a clean test scene with one TileMap and one region before merging huge levels.
- Keep Godot export templates and editor on the same minor version to avoid rare navigation server mismatches.
Related Problems and Links
- Godot 2D movement and input basics: Godot Game Engine guide (chapter on scenes and nodes).
- Android export issues (unrelated to nav but common in same projects): Godot 4.4 Android export crashes on launch.
- Unity developers comparing workflows: Unity NavMesh not generating.
Bookmark this fix for the next time a TileMap level refuses to bake. Share it with teammates if it saved you a long night of empty navigation meshes.
If you are still stuck after these steps, reduce the scene to one TileMapLayer, one NavigationRegion2D, and one walkable tile with a painted navigation polygon. When that bakes successfully, add complexity back in small increments until the failing piece is obvious.