Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Verwenden von Navigations-Meshes

../../_images/nav_meshes.webp

2D- und 3D-Versionen des Navigations-Mesh sind als NavigationPolygon bzw. NavigationMesh verfügbar.

Bemerkung

Ein Navigations-Mesh beschreibt nur einen durchquerbaren Bereich für die zentrale Position eines Agenten. Alle Radiuswerte, die ein Agent haben kann, werden ignoriert. Wenn Sie möchten, dass die Wegfindung die (Kollisions-) Größe eines Agenten berücksichtigt, müssen Sie das Navigations-Mesh entsprechend verkleinern.

Die Navigation funktioniert unabhängig von anderen Teilen der Engine wie Rendering oder Physik. Navigations-Meshes sind die einzigen Dinge, die bei der Wegfindung berücksichtigt werden, d.h. visuelle Elemente und Collision Shapes werden vom Navigationssystem komplett ignoriert. Wenn Sie andere Daten (wie z.B. das Bildmaterial) bei der Wegfindung berücksichtigen wollen, müssen Sie Ihre Navigations-Meshes entsprechend anpassen. Der Prozess der Berücksichtigung von Navigationsbeschränkungen in Navigations-Meshes wird gemeinhin als "Navigations-Mesh-Backen" bezeichnet.

Vergleich zwischen konvexen und konkaven Polygonen in Navigationsmeshes

Ein Navigations-Mesh beschreibt eine Fläche, auf der ein Agent sicher stehen kann, wobei sein Zentrum mit den Physik-Shapes verglichen wird, die äußere Kollisionsgrenzen beschreiben.

Wenn Sie beim Verfolgen von Navigationspfaden auf Clipping- oder Kollisionsprobleme stoßen, denken Sie immer daran, dass Sie dem Navigationssystem über ein geeignetes Mesh mitteilen müssen, was Sie vorhaben. Das Navigationssystem selbst wird nie wissen, ob es sich um einen Baum, einen Felsen, eine Wand oder ein visuelles Mesh handelt, denn es weiß nur: "mir wurde gesagt, dass ich diesen Weg sicher gehen kann, weil er auf einem Navigations-Mesh liegt".

Das Backen eines Navigations-Meshes kann entweder durch die Verwendung einer NavigationRegion2D oder NavigationRegion3D, oder durch die direkte Verwendung der NavigationServer2D- und NavigationServer3D-API erreicht werden.

Backen eines Navigations-Meshes mit einer NavigationRegion

Schritte zum Backen von Navigations-Meshes

Backen eines Navigations-Meshes mit Agentenradiusversatz zur Geometrie.

Das Backen des Navigations-Meshs wird durch den NavigationRegion-Node zugänglicher gemacht. Beim Backen mit einem NavigationRegion-Node werden die einzelnen Schritte des Parsens, Backens und der Regionsaktualisierung in einer Funktion zusammengefasst.

Die Nodes sind in 2D und 3D als NavigationRegion2D bzw. NavigationRegion3D verfügbar.

Wenn ein NavigationRegion2D-Node im Editor ausgewählt wird, erscheinen in der oberen Leiste des Editors die Backoptionen sowie die Polygonzeichenwerkzeuge.

../../_images/nav_region_baking_01.webp

Damit die Region funktioniert, muss eine NavigationPolygon-Ressource hinzugefügt werden.

Die Propertys zum Analysieren und Backen eines Navigations-Mesh sind dann Teil der verwendeten Ressource und können im Ressourceninspektor gefunden werden.

../../_images/nav_region_baking_02.webp

Das Ergebnis des Parsens der Quellgeometrie kann mit den folgenden Propertys beeinflusst werden.

  • Der parsed_geometry_type, der filtert, ob visuelle Objekte oder physikalische Objekte oder beide aus dem SceneTree geparst werden sollen. Für weitere Details darüber, welche Objekte geparst werden und wie, siehe den Abschnitt über das Parsen der Quellgeometrie weiter unten.

  • Die collision_mask filtert, welche physischen Kollisionsobjekte einbezogen werden, wenn der parsed_geometry_type statische Collider enthält.

  • Der source_geometry_mode, der festlegt, auf welchen Nodes das Parsen beginnen soll und wie der SceneTree durchlaufen werden soll.

  • Der source_geometry_group_name wird verwendet, wenn nur eine bestimmte Node-Gruppe geparst werden soll. Hängt vom gewählten source_geometry_mode ab.

Nachdem die Quellgeometrie hinzugefügt wurde, kann das Ergebnis des Backens mit den folgenden Propertys gesteuert werden.

  • Der Parameter cell_size legt die Größe des Rasters fest und sollte mit der Größe der Navigations-Map übereinstimmen.

  • Der agent_radius verkleinert das gebackene Mesh, um genügend Spielraum für die Größe des Agenten (Kollisionen) zu haben.

Das Backen der NavigationRegion2D kann auch zur Laufzeit mit Skripten verwendet werden.

var on_thread: bool = true
bake_navigation_polygon(on_thread)

Zum schnellen Testen des 2D-Backens mit Default-Einstellungen:

  • Fügen Sie ein NavigationRegion2D hinzu.

  • Fügen Sie eine NavigationPolygon-Ressource zur NavigationRegion2D hinzu.

  • Fügen Sie ein Polygon2D unterhalb der NavigationRegion2D ein.

  • Zeichnen Sie 1 NavigationPolygon-Kontur mit dem ausgewählten NavigationRegion2D-Zeichenwerkzeug.

  • Zeichnen Sie 1 Polygon2D-Umriss innerhalb des NavigationPolygon-Umrisses mit dem ausgewählten Polygon2D-Zeichenwerkzeug.

  • Klicken Sie auf den Editor Back-Button und ein Navigations-Mesh sollte erscheinen.

../../_images/nav_region_baking_01.webp ../../_images/nav_mesh_mini_2d.webp

Backen eines Navigations-Meshes mit dem NavigationServer

Die NavigationServer2D und NavigationServer3D haben API-Funktionen, um jeden Schritt des Navigations-Mesh-Backprozesses einzeln aufzurufen.

  • Die Funktion parse_source_geometry_data() kann verwendet werden, um Quellgeometrie in eine wiederverwendbare und serialisierbare Ressource zu zerlegen.

  • Mit bake_from_source_geometry_data() kann ein Navigations-Mesh aus bereits geparsten Daten gebacken werden, um z.B. Performance-Probleme mit (redundantem) Parsing zur Laufzeit zu vermeiden.

  • Die Funktion bake_from_source_geometry_data_async() ist die gleiche, aber sie backt das Navigations-Mesh zeitversetzt mit Threads und blockiert nicht den Hauptthread.

Im Vergleich zu einer NavigationRegion bietet der NavigationServer eine feinere Kontrolle über den Backprozess des Navigations-Meshs. Im Gegenzug ist er komplexer in der Anwendung, bietet aber auch mehr erweiterte Optionen.

Einige weitere Vorteile des NavigationServers gegenüber einer NavigationRegion sind:

  • Der Server kann die Quellgeometrie ohne Backen analysieren, z.B. um sie für eine spätere Verwendung zwischenzuspeichern.

  • Der Server ermöglicht es, den Root-Node auszuwählen, an dem das Parsen der Quellgeometrie manuell gestartet werden soll.

  • Der Server kann prozedural erzeugte Quellgeometriedaten akzeptieren und daraus backen.

  • Der Server kann mehrere Meshes nacheinander backen und dabei dieselben Geometriedaten (wieder)verwenden.

Um Navigationsmeshes mit dem NavigationServer zu backen, ist eine Quellgeometrie erforderlich. Quellgeometrie sind Geometriedaten, die beim Backen von Navigations-Meshes berücksichtigt werden sollten. Sowohl 2D- als auch 3D-Navigations-Meshes werden durch Backen aus der Quellgeometrie erstellt.

2D- und 3D-Versionen der Quellgeometrieressourcen sind als NavigationMeshSourceGeometryData2D bzw. NavigationMeshSourceGeometryData3D verfügbar.

Die Quellgeometrie kann aus visuellen Meshes, aus physikalischen Kollisionen oder aus prozedural erstellten Arrays von Daten wie Umrissen (2D) und Dreiecksflächen (3D) analysiert werden. Der Einfachheit halber wird die Quellgeometrie in der Regel direkt aus Node-Setups im SceneTree geparst. Für das (Neu-)Erstellen von Meshes zur Laufzeit ist zu beachten, dass das Parsen der Geometrie immer auf dem Haupt-Thread stattfindet.

Bemerkung

Der SceneTree ist nicht thread-sicher. Das Parsen der Quellgeometrie aus dem SceneTree kann nur im Haupt-Thread durchgeführt werden.

Warnung

Die Daten von visuellen Meshes und Polygonen müssen von der GPU empfangen werden, was den RenderingServer in diesem Prozess abwürgt. Für das (Neu-)Backen zur Laufzeit sollten bevorzugt Physik-Shapes als geparste Quellgeometrie verwendet werden.

Die Quellgeometrie wird in den Ressourcen gespeichert, so dass die erstellte Geometrie für mehrere Backvorgänge wiederverwendet werden kann. So können z.B. mehrere Navigations-Meshes für unterschiedliche Agentengrößen aus derselben Ausgangsgeometrie erstellt werden. Dies ermöglicht auch das Speichern der Quellgeometrie auf der Festplatte, so dass sie später geladen werden kann, z.B. um den Overhead des erneuten Parsens zur Laufzeit zu vermeiden.

Die Geometriedaten sollten im Allgemeinen sehr einfach gehalten werden. So viele Kanten wie nötig, aber so wenige wie möglich. Besonders in 2D sollte doppelte und verschachtelte Geometrie vermieden werden, da sie die Berechnung von Polygonlöchern erzwingt, was zu gespiegelten Polygonen führen kann. Ein Beispiel für verschachtelte Geometrie wäre ein kleineres StaticBody2D-Shape, das vollständig innerhalb der Grenzen eines anderen StaticBody2D-Shapes platziert wird.