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 NavigationLinks¶
NavigationLinks werden verwendet, um Navigations-Mesh-Polygone aus NavigationRegion2D und NavigationRegion3D über beliebige Entfernungen für die Wegfindung zu verbinden.
NavigationLinks werden auch verwendet, um Bewegungsabkürzungen bei der Wegfindung zu berücksichtigen, die durch die Interaktion mit Spielobjekten verfügbar sind, z. B. Leitern, Jump-Pads oder Teleporter.
2D- und 3D-Versionen von NavigationJumplinks-Nodes sind als NavigationLink2D bzw. NavigationLink3D verfügbar.
Verschiedene NavigationRegions können ihre Navigations-Meshes miteinander verbinden, ohne dass ein NavigationLink erforderlich ist, solange sie innerhalb der edge_connection_margin
der Navigations-Map liegen und kompatible navigation_layers
haben. Sobald die Distanz zu groß wird, wird der Aufbau gültiger Verbindungen zu einem Problem - ein Problem, das NavigationLinks lösen können.
Siehe Verwendung von NavigationRegions um mehr über die Verwendung von Navigationsregionen zu erfahren. Siehe Verbinden von Navigations-Meshes, um mehr darüber zu erfahren, wie man Navigations-Meshes verbindet.
NavigationLinks haben viele Propertys mit NavigationRegions gemeinsam, wie zum Beispiel navigation_layers
. NavigationLinks fügen eine einzelne Verbindung zwischen zwei Positionen über eine beliebige Distanz hinzu, im Gegensatz zu NavigationRegions, die einen eher lokal durchquerbaren Bereich mit einer Navigationsnetzressource hinzufügen.
Navigationslinks haben eine start_position
und eine end_position
und können in beide Richtungen gehen, wenn bidirectional
aktiviert ist. Wenn ein Navigationslink platziert wird, verbindet er die Polygone des Navigations-Meshes, die seiner start_position
und end_position
am nächsten liegen, innerhalb des Suchradius für die Wegfindung.
Der Polygonsuchradius kann global in den Projekteinstellungen unter navigation/2d_or_3d/default_link_connection_radius
konfiguriert werden oder für jede Navigation-Map einzeln mit der Funktion NavigationServer.map_set_link_connection_radius()
gesetzt werden.
Sowohl start_position
als auch end_position
haben Debug-Marker im Editor. Der sichtbare Radius einer Position zeigt den Polygonsuchradius an. Alle darin befindlichen Polygone des Navigations-Meshs werden verglichen und das nächstgelegene wird für die Kantenverbindung ausgewählt. Wenn kein gültiges Polygon innerhalb des Suchradius gefunden wird, wird der Navigations-Link deaktiviert.
Die Debug-Visualisierung der Links kann im Editor ProjectSettings unter debug/shapes/navigation
geändert werden. Die Sichtbarkeit des Debugs kann auch im Editor 3D-Viewport-Gizmo-Menü gesteuert werden.
Bemerkung
Navigationslinks bewegen Agenten nicht von sich aus zwischen den beiden Verbindungspositionen.
Ein Navigations-Link bietet keine automatische Bewegung durch den Link. Wenn ein Agent die Position eines Links erreicht, muss der Spielcode reagieren (z. B. durch Bereichs-Trigger) und Mittel bereitstellen, mit denen sich der Agent durch den Link bewegen kann, um an der anderen Position des Links zu landen (z. B. durch Teleport oder Animation), und den Weg fortzusetzen.
Navigation link script templates¶
The following script uses the NavigationServer to create a new navigation link.
extends Node2D
var link_rid: RID
var link_start_position: Vector2
var link_end_position: Vector2
func _ready() -> void:
link_rid = NavigationServer2D.link_create()
var link_owner_id: int = get_instance_id()
var link_enter_cost: float = 1.0
var link_travel_cost: float = 1.0
var link_navigation_layers: int = 1
var link_bidirectional: bool = true
NavigationServer2D.link_set_owner_id(link_rid, link_owner_id)
NavigationServer2D.link_set_enter_cost(link_rid, link_enter_cost)
NavigationServer2D.link_set_travel_cost(link_rid, link_travel_cost)
NavigationServer2D.link_set_navigation_layers(link_rid, link_navigation_layers)
NavigationServer2D.link_set_bidirectional(link_rid, link_bidirectional)
# Enable the link and set it to the default navigation map.
NavigationServer2D.link_set_enabled(link_rid, true)
NavigationServer2D.link_set_map(link_rid, get_world_2d().get_navigation_map())
# Move the 2 link positions to their intended global positions.
NavigationServer2D.link_set_start_position(link_rid, link_start_position)
NavigationServer2D.link_set_end_position(link_rid, link_end_position)
extends Node3D
var link_rid: RID
var link_start_position: Vector3
var link_end_position: Vector3
func _ready() -> void:
link_rid = NavigationServer3D.link_create()
var link_owner_id: int = get_instance_id()
var link_enter_cost: float = 1.0
var link_travel_cost: float = 1.0
var link_navigation_layers: int = 1
var link_bidirectional: bool = true
NavigationServer3D.link_set_owner_id(link_rid, link_owner_id)
NavigationServer3D.link_set_enter_cost(link_rid, link_enter_cost)
NavigationServer3D.link_set_travel_cost(link_rid, link_travel_cost)
NavigationServer3D.link_set_navigation_layers(link_rid, link_navigation_layers)
NavigationServer3D.link_set_bidirectional(link_rid, link_bidirectional)
# Enable the link and set it to the default navigation map.
NavigationServer3D.link_set_enabled(link_rid, true)
NavigationServer3D.link_set_map(link_rid, get_world_3d().get_navigation_map())
# Move the 2 link positions to their intended global positions.
NavigationServer3D.link_set_start_position(link_rid, link_start_position)
NavigationServer3D.link_set_end_position(link_rid, link_end_position)