10. Navigation Mesh Generation
Genereer dynamisch een NavigationMesh van road tiles voor pathfinding
Overzicht
In dit hoofdstuk leer je:
RoadNavigation.cs (NavigationRegion3D) maken
Dynamic NavMesh generation van road tiles
GetRoadCells() helper implementeren
Manual geometry creation (vertices + polygons)
RegenerateNavigationMesh() aanroepen bij road changes
NavigationMesh.Clear() en AddPolygon()
Wat is een Navigation System?
Godot's navigation system gebruikt NavigationMesh voor pathfinding. Een NavigationMesh is een verzameling van polygonen die bepalen waar characters kunnen lopen/rijden.
In dit hoofdstuk:
Genereer een NavigationMesh dynamisch vanaf de GridMap roads
Elke road tile wordt een quad polygon (4 vertices)
Update de mesh automatisch wanneer wegen worden toegevoegd/verwijderd
Voertuigen gebruiken deze mesh om routes te berekenen (hoofdstuk 11)
Waarom dynamisch? Static navigation meshes werken niet voor city builders - spelers bouwen het wegennetwerk tijdens gameplay! De mesh moet real-time regenereren.
RoadNavigation script aanmaken
Maak een nieuwe script die de navigation geometry genereert.
Nieuwe Godot-specifieke elementen:
NavigationRegion3D- Node die een navigeerbaar gebied definieertNavigationMesh- Mesh data voor pathfindingMapToLocal()- Converteer GridMap cell coΓΆrdinaten naar wereld positie
Maak een nieuw script
scripts/RoadNavigation.csMaak de class aan die inherit van NavigationRegion3D:
Voeg een GridMap export toe:
Sla het script op
IsRoadTile helper method
Voeg dezelfde helper toe als in RoadPlacer om road tiles te identificeren.
Voeg de
IsRoadTile()method toe onderaan de class:
Sla het script op
GetRoadCells implementeren
Maak een method om alle road tiles in de GridMap te vinden.
Nieuwe Godot-specifieke elementen:
GetUsedCells()- Geeft alle non-empty cells in de GridMap
Voeg een lege
GetRoadCells()method toe:
Maak een lege lijst voor road cells:
Haal alle gebruikte cells op:
Loop door alle cells en check of ze roads zijn:
Return de lijst:
Sla het script op
UpdateNavMesh implementeren
Maak een method om de NavigationRegion3D te forceren de mesh te updaten.
Voeg een lege
UpdateNavMesh()method toe:
Sla de huidige NavigationMesh tijdelijk op:
Zet NavigationMesh op null:
Zet de mesh terug. Dit triggert een rebuild van de interne navigation data:
Waarom null/restore?
NavigationRegion3D update alleen bij property changes
Setting naar null en terug forceert een rebuild
Anders blijft de engine de oude mesh gebruiken
Sla het script op
RegenerateNavigationMesh method
Maak de hoofdmethod die de navigation mesh regenereert wanneer wegen veranderen.
Voeg een lege
RegenerateNavigationMesh()method toe:
Haal alle road cells op:
Genereer de navigation geometry:
Update de NavigationMesh:
Sla het script op
CreateNavigationGeometry implementeren
Maak een method die quad polygonen genereert voor elke road tile.
Nieuwe C#-specifieke elementen:
Clear()- Verwijdert alle vertices en polygonen uit de NavigationMeshAddPolygon()- Voegt een polygon toe met vertex indices
Voeg een lege
CreateNavigationGeometry()method toe:
Clear de bestaande mesh data:
Maak een lijst voor vertices:
Loop door alle road cells:
Bereken de wereld positie van de cell:
MapToLocal:
Converteer GridMap cell (0, 0, 0) β wereld positie (0.5, 0, 0.5)
GridMap cells zijn 1x1x1 units groot
Cell center offset = +0.5 in X en Z
Bereken de vier hoeken van de quad. Elke road tile wordt een vierkant van 1x1 units:
Quad layout:
Voeg de vertices toe aan de lijst:
Zet de vertices in de NavigationMesh. Dit moet VOOR het toevoegen van polygonen:
Waarom eerst vertices?
AddPolygon()gebruikt indices (0, 1, 2, 3...)Vertices moeten al bestaan voordat je naar ze refereert
ToArray()converteer List naar Vector3[]
Voeg polygonen toe. Elke quad heeft 4 vertices, dus elke polygon gebruikt indices i, i+1, i+2, i+3:
Polygon indices:
Cell 0: vertices 0-3 β polygon [0, 1, 2, 3]
Cell 1: vertices 4-7 β polygon [4, 5, 6, 7]
Cell 2: vertices 8-11 β polygon [8, 9, 10, 11]
i += 4springt naar de volgende quad
Sla het script op
_Ready implementeren
Genereer de initiΓ«le navigation mesh wanneer de scene start.
Voeg een lege
_Ready()method toe:
Roep
RegenerateNavigationMesh()aan:
Sla het script op
RoadNavigation node toevoegen
Voeg de RoadNavigation node toe aan de Main scene en configureer.
Open
scenes/Main.tscnVoeg een NavigationRegion3D node toe als child van Main
Hernoem naar
RoadNavigationSelecteer RoadNavigation in de Scene Tree
In de Inspector β Script: attach
scripts/RoadNavigation.csIn de Inspector β NavigationRegion3D sectie:
Klik New NavigationMesh naast NavigationMesh property
Dit maakt een lege mesh aan die RoadNavigation.cs zal vullen
In de Inspector β RoadNavigation script sectie:
Sleep GridMap node naar de GridMap export property
Sla de scene op (Ctrl+S)
RoadPlacer koppelen aan RoadNavigation
Update RoadPlacer om de navigation mesh te regenereren bij elke wijziging.
Open
scripts/RoadPlacer.csVoeg een RoadNavigation export toe bovenaan (na de RoadCost export):
Voeg
RegenerateNavigationMesh()calls toe inBuild(). Deze method bestaat al - voeg de regel toe aan het einde:
Null-conditional operator: ?. roept alleen de method aan als RoadNavigation niet null is
Voeg ook een call toe in
TryRemoveRoad():
Sla het script op
RoadNavigation export instellen
Koppel de RoadNavigation node in de Inspector.
Open
scenes/Main.tscn(als deze nog niet open is)Selecteer RoadPlacer in de Scene Tree
In de Inspector β RoadPlacer script sectie:
Sleep RoadNavigation node naar de Road Navigation export property
Sla de scene op (Ctrl+S)
Testen

Test of de navigation mesh correct wordt gegenereerd.
Start het spel (F5)
Selecteer road (arrow buttons) en plaats enkele wegen
Selecteer RoadNavigation in de Remote scene tree (niet de lokale Scene tree!)
In de Inspector β NavigationRegion3D sectie:
Klik op de NavigationMesh resource
Check of Vertices array gevuld is (4 vertices per road tile)
Check of Polygons array gevuld is (1 polygon per road tile)
Debug visualisatie (optioneel):
Menu β Debug β Visible Navigation
Je ziet blauwe quads op elke road tile
Dit visualiseert de navigeerbare gebieden
Verwijder een road met rechtermuisklik
Check of de vertices/polygons array kleiner wordt
Werkt alles? Sluit het spel (F8)
Volledig script
Laatst bijgewerkt