NEVER Do in Navigation & Pathfinding
- NEVER set
target_position before awaiting physics frame — NavigationServer not ready in _ready()? Path fails silently. MUST call_deferred() then await get_tree().physics_frame.
- NEVER use
NavigationRegion2D.bake_navigation_polygon() at runtime — Synchronous baking freezes game for 100+ ms. Use NavigationServer.bake_from_source_geometry_data_async() for stutter-free updates.
- NEVER forget to check
is_navigation_finished() — Calling get_next_path_position() after reaching target = stale path, AI walks to old position.
- NEVER use
avoidance_enabled without setting radius — Default radius = 0, agent passes through others. Set nav_agent.radius = collision_shape.radius for proper avoidance.
- NEVER poll
target_position every frame for chase AI — Setting target 60x/sec = path recalculation spam. Use timer (0.2s intervals) or distance threshold for updates.
- NEVER assume path exists — Target unreachable (blocked by walls)?
get_next_path_position() returns invalid. Check is_target_reachable() or validate path length.
- NEVER use heavy node-based navigation for thousands of simple entities — Use
NavigationServer3D/2D RIDs directly to bypass node overhead.
- NEVER call
get_path() every frame — Use query_path() with reused NavigationPathQueryResult objects to prevent massive heap allocation and GC pressure.
- NEVER leave 'enter_cost' at 0 for high-penalty areas — Use costs to make AI prefer logical paths (roads over water) instead of just shortest geometric distance.
- NEVER ignore
agent_set_avoidance_callback — Always use the callback for safe velocity computation to avoid synchronization issues and "jittery" movement.
Decision Tree → Scripts
MANDATORY for the chosen path. Do NOT Load editor-intro / Official Docs bootstrap recipes from this skill body (use Reference links when you need first-time region setup).
| Need |
Script |
| Runtime / procedural bake without hitch |
MANDATORY async_dynamic_baking.gd |
| Agent stuck / jitter recovery |
MANDATORY agent_stuck_detection.gd |
| High-count RVO without nodes |
MANDATORY low_level_avoidance.gd |
| Moving platforms / dynamic regions |
dynamic_nav_manager.gd |
| RID-only maps/regions |
server_navigation_setup.gd |
| Reused path query objects |
memory_optimized_queries.gd |
| Terrain enter/travel costs |
terrain_cost_manager.gd |
| Projectiles as RVO obstacles |
moving_obstacle_server.gd |
| Links (jump/teleport/elevator) |
nav_link_traversal.gd |
| Walk / fly / swim layers |
layer_mask_navigation.gd |
| Crowd formation offsets |
group_avoidance_formations.gd |
| Server RVO crowd agent (node-less) |
crowd_agent_3d.gd |
| Dynamic navmesh carve (impact holes) |
nav_mesh_carver_3d.gd |
| Bake-time benchmark |
navmesh_profiler.gd |
| Smart agent wrapper |
smart_navigation_agent.gd |
Chase / Retarget Rule (never contradict NEVER)
Do not assign target_position every physics frame. Retarget on a timer (~0.2s) or when the chased body moves beyond a distance threshold:
# Threshold retarget — not per-frame path spam
const RETARGET_DIST := 1.5
var _last_target: Vector3
func _physics_process(_delta: float) -> void:
var desired := prey.global_position
if desired.distance_to(_last_target) >= RETARGET_DIST:
nav_agent.target_position = desired
_last_target = desired
if nav_agent.is_navigation_finished():
return
var next := nav_agent.get_next_path_position()
velocity = (next - global_position).normalized() * speed
move_and_slide()
Available Scripts
async_dynamic_baking.gd
bake_from_source_geometry_data_async — parse on main, bake off-thread.
agent_stuck_detection.gd
Distance-over-time stall detection and recovery.
low_level_avoidance.gd
Server-side RVO agents + avoidance callbacks.
dynamic_nav_manager.gd
Runtime navmesh updates for moving platforms.
server_navigation_setup.gd
Node-less maps/regions via NavigationServer RIDs.
memory_optimized_queries.gd
Reuse path query parameter/result objects.
terrain_cost_manager.gd
enter_cost / travel_cost for preferred routes.
moving_obstacle_server.gd
Dynamic RVO obstacles without full rebake.
nav_link_traversal.gd
NavigationLink jump/teleport/elevator handling.
layer_mask_navigation.gd
Multi-domain navigation layers (walk/fly/swim).
group_avoidance_formations.gd
Leader-relative offsets to reduce clumping.
smart_navigation_agent.gd
Production NavigationAgent wrapper patterns.
Expert Pointers
- Prefer Official Docs intros for first NavigationRegion bake UI; this skill owns async bake, server RVO, costs, and stuck recovery.
- Thousands of simple agents → RID server path (server_navigation_setup.gd + low_level_avoidance.gd), not one NavigationAgent node each.
- Crowd RVO / carve / bake benchmark samples → crowd_agent_3d.gd, nav_mesh_carver_3d.gd, navmesh_profiler.gd
Deep dives (on demand)
- 2D/3D chase, patrol, avoidance signals → agent-movement-patterns.md
- Server RVO crowds, projected carving, bake benchmarks → expert-nav-architectures.md
Reference
Progressive disclosure: open Official Documentation links only when researching a specific API;
load Related Skills when routing work to a peer domain — do not preload the whole lattice.
Official Documentation
- Navigation introduction (2D) — Minimal NavigationRegion2D + NavigationAgent2D setup, baking walkable polygons, and first-frame readiness.
- Navigation introduction (3D) — Parallel 3D bootstrap with NavigationRegion3D / NavigationAgent3D and mesh baking expectations.
- Using NavigationAgents — target_position, get_next_path_position, avoidance radius, and velocity_computed safe-velocity flow.
- Using NavigationServers — RID maps/regions/agents for node-less crowds and custom server setups.
- Using navigation meshes — Parse/bake source geometry, async baking, and projected obstructions for dynamic carving.
- Using NavigationRegions — Region ownership, enter/travel costs, and chunked/runtime region updates.
- Using NavigationObstacles — RVO push obstacles vs bake-time carving without full remesh every frame.
- Using NavigationLinks — Jump/teleport/elevator edges and manual link traversal on agents.
- Using navigation layers — 32-bit layer bitmasks for walk/fly/swim (or faction) path filters.
- Using navigation path query objects — Reuse NavigationPathQueryParameters/Result to avoid per-frame GC in crowds.
- Optimizing navigation performance — Bake cost, agent/obstacle counts, and server query budgets for large AI populations.
Related Skills
Prerequisites
- godot-characterbody-2d — Path corners become CharacterBody velocity via move_and_slide; agent scripts assume a body parent.
- godot-2d-physics — Collision layers/shapes still block bodies; navmesh is not a physics substitute for walls and triggers.
- godot-physics-3d — 3D agents share the same split: NavigationServer paths vs RigidBody/CharacterBody collision and slopes.
Complements
Downstream / consumers
- godot-genre-rts — Unit move commands and RVO crowds consume NavigationAgent/Server patterns directly.
- godot-genre-tower-defense — Lane/path enemies and dynamic blockers depend on regions, costs, and obstacle updates.
- godot-genre-stealth — Guard patrols and investigate points are NavigationAgent routes gated by detection state.
- godot-combat-system — Engage/kite/flank movement issues new targets and stuck recovery on top of paths.
- godot-monte-carlo-balancer — Simulate chase reachability, travel-time bands, and crowd pressure when tuning AI difficulty.
Master
- godot-master — Library router and mirrored module entry for this Domain Skill.
1---2name: godot-navigation-pathfinding3description: Expert blueprint for AI pathfinding (tower defense, RTS, stealth) using NavigationAgent2D/3D, NavigationServer, avoidance, and dynamic navigation mesh generation. Use when implementing enemy AI, NPC movement, or obstacle avoidance. Keywords NavigationAgent2D, NavigationRegion2D, pathfinding, NavigationServer, avoidance, baking, NavigationObstacle.4---5## NEVER Do in Navigation & Pathfinding
6
7- **NEVER set `target_position` before awaiting physics frame** — NavigationServer not ready in `_ready()`? Path fails silently. MUST `call_deferred()` then `await get_tree().physics_frame`.
8- **NEVER use `NavigationRegion2D.bake_navigation_polygon()` at runtime** — Synchronous baking freezes game for 100+ ms. Use `NavigationServer.bake_from_source_geometry_data_async()` for stutter-free updates.
9- **NEVER forget to check `is_navigation_finished()`** — Calling `get_next_path_position()` after reaching target = stale path, AI walks to old position.
10- **NEVER use `avoidance_enabled` without setting radius** — Default radius = 0, agent passes through others. Set `nav_agent.radius = collision_shape.radius` for proper avoidance.
11- **NEVER poll `target_position` every frame for chase AI** — Setting target 60x/sec = path recalculation spam. Use timer (0.2s intervals) or distance threshold for updates.
12- **NEVER assume path exists** — Target unreachable (blocked by walls)? `get_next_path_position()` returns invalid. Check `is_target_reachable()` or validate path length.
13- **NEVER use heavy node-based navigation for thousands of simple entities** — Use `NavigationServer3D/2D` RIDs directly to bypass node overhead.
14- **NEVER call `get_path()` every frame** — Use `query_path()` with reused `NavigationPathQueryResult` objects to prevent massive heap allocation and GC pressure.
15- **NEVER leave 'enter_cost' at 0 for high-penalty areas** — Use costs to make AI prefer logical paths (roads over water) instead of just shortest geometric distance.
16- **NEVER ignore `agent_set_avoidance_callback`** — Always use the callback for safe velocity computation to avoid synchronization issues and "jittery" movement.
17
18## Decision Tree → Scripts
19
20> **MANDATORY** for the chosen path. **Do NOT Load** editor-intro / Official Docs bootstrap recipes from this skill body (use Reference links when you need first-time region setup).
21
22| Need | Script |
23|------|--------|
24| Runtime / procedural bake without hitch | **MANDATORY** [async_dynamic_baking.gd](scripts/async_dynamic_baking.gd) |
25| Agent stuck / jitter recovery | **MANDATORY** [agent_stuck_detection.gd](scripts/agent_stuck_detection.gd) |
26| High-count RVO without nodes | **MANDATORY** [low_level_avoidance.gd](scripts/low_level_avoidance.gd) |
27| Moving platforms / dynamic regions | [dynamic_nav_manager.gd](scripts/dynamic_nav_manager.gd) |
28| RID-only maps/regions | [server_navigation_setup.gd](scripts/server_navigation_setup.gd) |
29| Reused path query objects | [memory_optimized_queries.gd](scripts/memory_optimized_queries.gd) |
30| Terrain enter/travel costs | [terrain_cost_manager.gd](scripts/terrain_cost_manager.gd) |
31| Projectiles as RVO obstacles | [moving_obstacle_server.gd](scripts/moving_obstacle_server.gd) |
32| Links (jump/teleport/elevator) | [nav_link_traversal.gd](scripts/nav_link_traversal.gd) |
33| Walk / fly / swim layers | [layer_mask_navigation.gd](scripts/layer_mask_navigation.gd) |
34| Crowd formation offsets | [group_avoidance_formations.gd](scripts/group_avoidance_formations.gd) |
35| Server RVO crowd agent (node-less) | [crowd_agent_3d.gd](scripts/crowd_agent_3d.gd) |
36| Dynamic navmesh carve (impact holes) | [nav_mesh_carver_3d.gd](scripts/nav_mesh_carver_3d.gd) |
37| Bake-time benchmark | [navmesh_profiler.gd](scripts/navmesh_profiler.gd) |
38| Smart agent wrapper | [smart_navigation_agent.gd](scripts/smart_navigation_agent.gd) |
39
40## Chase / Retarget Rule (never contradict NEVER)
41
42Do **not** assign `target_position` every physics frame. Retarget on a timer (~0.2s) or when the chased body moves beyond a distance threshold:
43
44```gdscript
45# Threshold retarget — not per-frame path spam
46const RETARGET_DIST := 1.5
47var _last_target: Vector3
48
49func _physics_process(_delta: float) -> void:
50 var desired := prey.global_position
51 if desired.distance_to(_last_target) >= RETARGET_DIST:
52 nav_agent.target_position = desired
53 _last_target = desired
54 if nav_agent.is_navigation_finished():
55 return
56 var next := nav_agent.get_next_path_position()
57 velocity = (next - global_position).normalized() * speed
58 move_and_slide()
59```
60
61## Available Scripts
62
63### [async_dynamic_baking.gd](scripts/async_dynamic_baking.gd)
64`bake_from_source_geometry_data_async` — parse on main, bake off-thread.
65
66### [agent_stuck_detection.gd](scripts/agent_stuck_detection.gd)
67Distance-over-time stall detection and recovery.
68
69### [low_level_avoidance.gd](scripts/low_level_avoidance.gd)
70Server-side RVO agents + avoidance callbacks.
71
72### [dynamic_nav_manager.gd](scripts/dynamic_nav_manager.gd)
73Runtime navmesh updates for moving platforms.
74
75### [server_navigation_setup.gd](scripts/server_navigation_setup.gd)
76Node-less maps/regions via NavigationServer RIDs.
77
78### [memory_optimized_queries.gd](scripts/memory_optimized_queries.gd)
79Reuse path query parameter/result objects.
80
81### [terrain_cost_manager.gd](scripts/terrain_cost_manager.gd)
82`enter_cost` / `travel_cost` for preferred routes.
83
84### [moving_obstacle_server.gd](scripts/moving_obstacle_server.gd)
85Dynamic RVO obstacles without full rebake.
86
87### [nav_link_traversal.gd](scripts/nav_link_traversal.gd)
88NavigationLink jump/teleport/elevator handling.
89
90### [layer_mask_navigation.gd](scripts/layer_mask_navigation.gd)
91Multi-domain navigation layers (walk/fly/swim).
92
93### [group_avoidance_formations.gd](scripts/group_avoidance_formations.gd)
94Leader-relative offsets to reduce clumping.
95
96### [smart_navigation_agent.gd](scripts/smart_navigation_agent.gd)
97Production NavigationAgent wrapper patterns.
98
99## Expert Pointers
100
101- Prefer Official Docs intros for first NavigationRegion bake UI; this skill owns async bake, server RVO, costs, and stuck recovery.
102- Thousands of simple agents → RID server path ([server_navigation_setup.gd](scripts/server_navigation_setup.gd) + [low_level_avoidance.gd](scripts/low_level_avoidance.gd)), not one NavigationAgent node each.
103- Crowd RVO / carve / bake benchmark samples → [crowd_agent_3d.gd](scripts/crowd_agent_3d.gd), [nav_mesh_carver_3d.gd](scripts/nav_mesh_carver_3d.gd), [navmesh_profiler.gd](scripts/navmesh_profiler.gd)
104
105## Deep dives (on demand)
106
107- 2D/3D chase, patrol, avoidance signals → [agent-movement-patterns.md](references/agent-movement-patterns.md)
108- Server RVO crowds, projected carving, bake benchmarks → [expert-nav-architectures.md](references/expert-nav-architectures.md)
109
110## Reference
111
112> Progressive disclosure: open Official Documentation links only when researching a specific API;
113> load Related Skills when routing work to a peer domain — do not preload the whole lattice.
114
115### Official Documentation
116- [Navigation introduction (2D)](https://docs.godotengine.org/en/stable/tutorials/navigation/navigation_introduction_2d.html) — Minimal NavigationRegion2D + NavigationAgent2D setup, baking walkable polygons, and first-frame readiness.
117- [Navigation introduction (3D)](https://docs.godotengine.org/en/stable/tutorials/navigation/navigation_introduction_3d.html) — Parallel 3D bootstrap with NavigationRegion3D / NavigationAgent3D and mesh baking expectations.
118- [Using NavigationAgents](https://docs.godotengine.org/en/stable/tutorials/navigation/navigation_using_navigationagents.html) — target_position, get_next_path_position, avoidance radius, and velocity_computed safe-velocity flow.
119- [Using NavigationServers](https://docs.godotengine.org/en/stable/tutorials/navigation/navigation_using_navigationservers.html) — RID maps/regions/agents for node-less crowds and custom server setups.
120- [Using navigation meshes](https://docs.godotengine.org/en/stable/tutorials/navigation/navigation_using_navigationmeshes.html) — Parse/bake source geometry, async baking, and projected obstructions for dynamic carving.
121- [Using NavigationRegions](https://docs.godotengine.org/en/stable/tutorials/navigation/navigation_using_navigationregions.html) — Region ownership, enter/travel costs, and chunked/runtime region updates.
122- [Using NavigationObstacles](https://docs.godotengine.org/en/stable/tutorials/navigation/navigation_using_navigationobstacles.html) — RVO push obstacles vs bake-time carving without full remesh every frame.
123- [Using NavigationLinks](https://docs.godotengine.org/en/stable/tutorials/navigation/navigation_using_navigationlinks.html) — Jump/teleport/elevator edges and manual link traversal on agents.
124- [Using navigation layers](https://docs.godotengine.org/en/stable/tutorials/navigation/navigation_using_navigationlayers.html) — 32-bit layer bitmasks for walk/fly/swim (or faction) path filters.
125- [Using navigation path query objects](https://docs.godotengine.org/en/stable/tutorials/navigation/navigation_using_navigationpathqueryobjects.html) — Reuse NavigationPathQueryParameters/Result to avoid per-frame GC in crowds.
126- [Optimizing navigation performance](https://docs.godotengine.org/en/stable/tutorials/navigation/navigation_optimizing_performance.html) — Bake cost, agent/obstacle counts, and server query budgets for large AI populations.
127
128### Related Skills
129
130#### Prerequisites
131- [godot-characterbody-2d](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-characterbody-2d/SKILL.md) — Path corners become CharacterBody velocity via move_and_slide; agent scripts assume a body parent.
132- [godot-2d-physics](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-2d-physics/SKILL.md) — Collision layers/shapes still block bodies; navmesh is not a physics substitute for walls and triggers.
133- [godot-physics-3d](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-physics-3d/SKILL.md) — 3D agents share the same split: NavigationServer paths vs RigidBody/CharacterBody collision and slopes.
134
135#### Complements
136- [godot-raycasting-queries](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-raycasting-queries/SKILL.md) — Line-of-sight, aim cones, and hit prediction sit beside pathfinding for chase/stealth AI.
137- [godot-state-machine-advanced](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-state-machine-advanced/SKILL.md) — Patrol/chase/search states own when to retarget NavigationAgent and when to stop.
138- [godot-tilemap-mastery](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-tilemap-mastery/SKILL.md) — TileMap/TileSet geometry often feeds NavigationPolygon baking in 2D levels.
139- [godot-3d-world-building](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-3d-world-building/SKILL.md) — Static meshes and GridMaps are the usual NavigationMesh source geometry for baked regions.
140- [godot-procedural-generation](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-procedural-generation/SKILL.md) — Runtime layouts require parse + bake_from_source_geometry_data_async after generation.
141- [godot-performance-optimization](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-performance-optimization/SKILL.md) — Crowds push toward server RIDs, query reuse, and avoidance tuning called out in this skill.
142
143#### Downstream / consumers
144- [godot-genre-rts](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-genre-rts/SKILL.md) — Unit move commands and RVO crowds consume NavigationAgent/Server patterns directly.
145- [godot-genre-tower-defense](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-genre-tower-defense/SKILL.md) — Lane/path enemies and dynamic blockers depend on regions, costs, and obstacle updates.
146- [godot-genre-stealth](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-genre-stealth/SKILL.md) — Guard patrols and investigate points are NavigationAgent routes gated by detection state.
147- [godot-combat-system](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-combat-system/SKILL.md) — Engage/kite/flank movement issues new targets and stuck recovery on top of paths.
148- [godot-monte-carlo-balancer](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-monte-carlo-balancer/SKILL.md) — Simulate chase reachability, travel-time bands, and crowd pressure when tuning AI difficulty.
149
150#### Master
151- [godot-master](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-master/SKILL.md) — Library router and mirrored module entry for this Domain Skill.