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.
Checking the stable version of the documentation...
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 Navigationsregionen können ihre Navigationsnetze ohne Navigationslink verbinden, solange sie überlappende Kanten oder Kanten haben, die innerhalb der Navigationskarte edge_connection_margin liegen. Sobald die Distanz zu groß wird, wird das Erstellen gültiger Verbindungen zum 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.
Both start_position and end_position have debug markers in the Editor.
The arrows indicate which direction the link can be travelled across, and the visible radius of
a position shows the polygon search radius. All navigation mesh polygons inside are compared and
the closest is picked for the edge connection. If no valid polygon is found within the search
radius the navigation link gets disabled.
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.
Ein Navigationslink bietet keine spezielle Bewegung durch den Link. Wenn ein Agent die Position eines Links erreicht, muss der Spielcode stattdessen reagieren (z. B. durch Bereichs-Trigger) und dem Agenten die Möglichkeit geben, sich durch den Link zu bewegen, um an der anderen Position des Links zu landen (z. B. durch Teleport oder Animation). Andernfalls wird ein Agent versuchen, sich selbst entlang des Pfades des Links zu bewegen. So kann es passieren, dass ein Agent über eine bodenlose Grube läuft, anstatt auf eine sich bewegende Plattform zu warten, oder dass er durch einen Teleporter läuft und durch eine Wand weitergeht.
Skriptvorlagen für Navigationslinks
Das folgende Skript verwendet den NavigationServer, um einen neuen Navigationslink zu erstellen.
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)
using Godot;
public partial class MyNode2D : Node2D
{
private Rid _linkRid;
private Vector2 _linkStartPosition;
private Vector2 _linkEndPosition;
public override void _Ready()
{
_linkRid = NavigationServer2D.LinkCreate();
ulong linkOwnerId = GetInstanceId();
float linkEnterCost = 1.0f;
float linkTravelCost = 1.0f;
uint linkNavigationLayers = 1;
bool linkBidirectional = true;
NavigationServer2D.LinkSetOwnerId(_linkRid, linkOwnerId);
NavigationServer2D.LinkSetEnterCost(_linkRid, linkEnterCost);
NavigationServer2D.LinkSetTravelCost(_linkRid, linkTravelCost);
NavigationServer2D.LinkSetNavigationLayers(_linkRid, linkNavigationLayers);
NavigationServer2D.LinkSetBidirectional(_linkRid, linkBidirectional);
// Enable the link and set it to the default navigation map.
NavigationServer2D.LinkSetEnabled(_linkRid, true);
NavigationServer2D.LinkSetMap(_linkRid, GetWorld2D().NavigationMap);
// Move the 2 link positions to their intended global positions.
NavigationServer2D.LinkSetStartPosition(_linkRid, _linkStartPosition);
NavigationServer2D.LinkSetEndPosition(_linkRid, _linkEndPosition);
}
}
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)
using Godot;
public partial class MyNode3D : Node3D
{
private Rid _linkRid;
private Vector3 _linkStartPosition;
private Vector3 _linkEndPosition;
public override void _Ready()
{
_linkRid = NavigationServer3D.LinkCreate();
ulong linkOwnerId = GetInstanceId();
float linkEnterCost = 1.0f;
float linkTravelCost = 1.0f;
uint linkNavigationLayers = 1;
bool linkBidirectional = true;
NavigationServer3D.LinkSetOwnerId(_linkRid, linkOwnerId);
NavigationServer3D.LinkSetEnterCost(_linkRid, linkEnterCost);
NavigationServer3D.LinkSetTravelCost(_linkRid, linkTravelCost);
NavigationServer3D.LinkSetNavigationLayers(_linkRid, linkNavigationLayers);
NavigationServer3D.LinkSetBidirectional(_linkRid, linkBidirectional);
// Enable the link and set it to the default navigation map.
NavigationServer3D.LinkSetEnabled(_linkRid, true);
NavigationServer3D.LinkSetMap(_linkRid, GetWorld3D().NavigationMap);
// Move the 2 link positions to their intended global positions.
NavigationServer3D.LinkSetStartPosition(_linkRid, _linkStartPosition);
NavigationServer3D.LinkSetEndPosition(_linkRid, _linkEndPosition);
}
}