Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Verwenden von NavigationObstacles

2D- und 3D-Versionen von NavigationObstacle-Nodes sind als NavigationObstacle2D bzw. NavigationObstacle3D verfügbar.

Navigationshindernisse erfüllen einen doppelten Zweck, da sie sowohl das Backen des Navigations-Meshes als auch das Ausweichen von Agenten beeinflussen können.

  • Wenn affect_navigation_mesh aktiviert ist, wird das Hindernis das Navigationsmesh beeinflussen, wenn es gebacken wird.

  • Wenn avoidance_enabled aktiviert ist, wird das Hindernis Ausweichagenten beeinflussen.

Tipp

Die Ausweichfunktion ist standardmäßig aktiviert. Wenn das Hindernis nicht zum Ausweichen verwendet wird, deaktivieren Sie enabled_avoidance, um Performance zu sparen.

Hindernisse und Navigations-Meshes

Navigationshindernisse, die das Backen des Navigationsmeshes beeinträchtigen

Navigationshindernisse, die das Backen des Navigationsmeshes beeinträchtigen.

For navigation mesh baking, obstacles can be used to discard parts of all other source geometry inside the obstacle shape.

Damit kann verhindert werden, dass Navigationsmeshes an unerwünschten Stellen gebacken werden, z. B. innerhalb von "solider" Geometrie wie dicken Wänden oder auf anderen Geometrien, die für das Gameplay nicht berücksichtigt werden sollten, wie Dächer.

Navigationshindernisse Verwerfen von unerwünschten Navigationsmeshes

Navigationshindernisse Beseitigung von unerwünschten Navigationsmeshes.

Ein Hindernis fügt beim Backen keine Geometrie hinzu, sondern entfernt nur Geometrie. Dies geschieht, indem alle (Voxel-)Zellen mit gerasterter Ausgangsgeometrie, die sich innerhalb der Hindernis-Shape befinden, annulliert werden. Die Wirkung und die Detailgenauigkeit der Shape sind daher auf die vom Backprozess verwendete Zellauflösung beschränkt.

Für weitere Einzelheiten zum Backen von Navigations-Meshes siehe Verwenden von Navigations-Meshes.

../../_images/nav_mesh_obstacles_properties.webp

Die Property affect_navigation_mesh bewirkt, dass das Hindernis zum Backen des Navigationsmeshes beiträgt. Es wird wie alle anderen Node-Objekte in einem Navigationsmesh-Back-Prozess geparst oder nicht geparst.

Die Property carve_navigation_mesh macht die Shape unbeeinflusst von Offsets des Backens, z.B. dem Offset, der durch den agent_radius des Navigations-Meshes hinzugefügt wird. Es fungiert im Grunde als Schablone und schneidet in die bereits verschobene Oberfläche des Navigationsmeshes. Es wird dennoch von weiteren Nachbearbeitungen des Back-Prozesses, wie z.B. der Kantenvereinfachung, betroffen sein.

Die Form und Platzierung des Hindernisses wird mit den Propertys height und vertices sowie der global_position des Hindernisses definiert. Der Wert der y-Achse eines für die Vertices verwendeten Vector3 wird ignoriert, da das Hindernis auf eine flache horizontale Ebene projiziert wird.

Beim Backen von Navigationsmeshes in Skripten können Hindernisse prozedural als projiziertes Hindernis hinzugefügt werden. Hindernisse sind nicht an der Analyse der Quellgeometrie beteiligt, so dass es ausreicht, sie kurz vor dem Backen hinzuzufügen.

var obstacle_outline = PackedVector2Array([
    Vector2(-50, -50),
    Vector2(50, -50),
    Vector2(50, 50),
    Vector2(-50, 50)
])

var navigation_mesh = NavigationPolygon.new()
var source_geometry = NavigationMeshSourceGeometryData2D.new()

NavigationServer2D.parse_source_geometry_data(navigation_mesh, source_geometry, $MyTestRootNode)

var obstacle_carve: bool = true

source_geometry.add_projected_obstruction(obstacle_outline, obstacle_carve)

NavigationServer2D.bake_from_source_geometry_data(navigation_mesh, source_geometry)

Hindernisse und Agenten-Ausweichverhalten

Für die Ausweichnavigation können Hindernisse entweder als statische oder dynamische Hindernisse verwendet werden, um ausweichgesteuerte Agenten zu beeinflussen.

  • Bei statischer Verwendung von NavigationObstacles werden ausweichgesteuerte Agenten außerhalb oder innerhalb eines durch ein Polygon definierten Bereichs eingeschränkt.

  • Wenn sie dynamisch eingesetzt werden, stoßen Navigationshindernisse die ausweichgesteuerten Agenten in einem Radius um sie herum weg.

Statische Ausweich-Hindernisse

Ein Ausweichhindernis wird als statisch angesehen, wenn seine Property vertices mit einem Array von Positionen gefüllt ist, um ein Polygon zu bilden.

Statisches Hindernis, das im Editor gezeichnet wird, um Navigationsagenten zu blockieren oder einzuschließen

Statisches Hindernis, das im Editor gezeichnet wird, um Navigationsagenten zu blockieren oder einzuschließen.

  • Statische Hindernisse fungieren als harte nicht zu überquerende Grenzen für das Ausweichen durch Agenten, z.B. ähnlich wie physikalische Kollisionen, aber für das Ausweichen.

  • Statische Hindernisse definieren ihre Grenzen mit einem Array von Vertices (Positionen), und im Falle von 3D mit einer zusätzlichen Höhe-Property.

  • Statische Hindernisse funktionieren nur bei Agenten, die den 2D-Ausweichmodus verwenden.

  • Statische Hindernisse definieren sich durch die Wicklungsrichtung der Vertices, wenn Agenten herausgeschoben oder hineingesaugt werden.

  • Statische Hindernisse können ihre Position nicht verändern. Sie können nur an eine neue Position gesetzt und von Grund auf neu aufgebaut werden. Statische Hindernisse sind daher für Anwendungen, bei denen die Position in jedem Frame geändert wird, schlecht geeignet, da der ständige Neuaufbau mit hohen Performance-Kosten verbunden ist.

  • Statische Hindernisse, die an eine andere Position gesetzt werden, können von den Agenten nicht vorhergesagt werden. Dadurch besteht die Gefahr, dass die Agenten stecken bleiben, wenn ein statisches Hindernis über den Agenten gesetzt wird.

Wenn das 2D-Ausweichen in 3D verwendet wird, wird die y-Achse der Vector3-Vertices ignoriert. Stattdessen wird die globale y-Achsen-Position des Hindernisses als Höhenebene verwendet. Agenten ignorieren statische Hindernisse in 3D, die sich unter oder über ihnen befinden. Dies wird automatisch durch die globale y-Achsenposition des Hindernisses und des Agenten als Höhenebene sowie durch ihre jeweiligen Höheneigenschaften bestimmt.

Dynamische Ausweich-Hindernisse

Ein Ausweichhindernis wird als dynamisch angesehen, wenn seine Property Radius größer als Null ist.

  • Dynamische Hindernisse fungieren als weiches "Bitte-weg-von-mir"-Objekt, dem Agenten ausweichen, z.B. ähnlich wie sie anderen Agenten ausweichen.

  • Dynamische Hindernisse definieren ihre Grenzen mit einem einzigen Radius für einen 2D-Kreis, oder im Falle der 3D-Umgehung einer Kugel.

  • Dynamische Hindernisse können ihre Position bei jedem Bild ohne zusätzliche Performance-Kosten ändern.

  • Dynamische Hindernisse mit einer bestimmten Geschwindigkeit können in ihrer Bewegung von Agenten vorhergesagt werden.

  • Dynamische Hindernisse sind kein zuverlässiges Mittel, um Agenten in überfüllten oder engen Räumen einzuschränken.

Obwohl sowohl statische als auch dynamische Propertys gleichzeitig für ein und dasselbe Hindernis aktiv sein können, ist dies aus Performance-Gründen nicht empfehlenswert. Wenn sich ein Hindernis bewegt, werden idealerweise die statischen Vertices entfernt und stattdessen der Radius aktiviert. Wenn das Hindernis die neue Endposition erreicht, sollte es seinen Radius allmählich vergrößern, um alle anderen Agenten wegzuschieben. Wenn genug Platz um das Hindernis herum geschaffen wurde, sollte es die statischen Vertices wieder hinzufügen und den Radius entfernen. Dies hilft zu vermeiden, dass Agenten in dem plötzlich auftauchenden statischen Hindernis stecken bleiben, wenn der Wiederaufbau der statischen Begrenzung abgeschlossen ist.

Ähnlich wie die Agenten können die Hindernisse die Bitmaske avoidance_layers verwenden. Alle Agenten mit einem passenden Bit auf ihrer eigenen Ausweichmaske werden das Hindernis meiden.

Prozedurale Hindernisse

Neue Hindernisse können in einem Skript ohne einen Node erstellt werden, indem der NavigationServer direkt verwendet wird.

Hindernisse, die mit Skripten erstellt werden, benötigen mindestens eine Map und eine Position. Für die dynamische Verwendung wird ein Radius benötigt. Für die statische Verwendung wird ein Array von Vertices benötigt.

# create a new "obstacle" and place it on the default navigation map.
var new_obstacle_rid: RID = NavigationServer2D.obstacle_create()
var default_map_rid: RID = get_world_2d().get_navigation_map()

NavigationServer2D.obstacle_set_map(new_obstacle_rid, default_map_rid)
NavigationServer2D.obstacle_set_position(new_obstacle_rid, global_position)

# Use obstacle dynamic by increasing radius above zero.
NavigationServer2D.obstacle_set_radius(new_obstacle_rid, 5.0)

# Use obstacle static by adding a square that pushes agents out.
var outline = PackedVector2Array([Vector2(-100, -100), Vector2(100, -100), Vector2(100, 100), Vector2(-100, 100)])
NavigationServer2D.obstacle_set_vertices(new_obstacle_rid, outline)

# Enable the obstacle.
NavigationServer2D.obstacle_set_avoidance_enabled(new_obstacle_rid, true)