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...
Utilizzo dei NavigationLink
I NavigationLink servono per collegare i poligoni delle mesh di navigazione da NavigationRegion2D e NavigationRegion3D su distanze arbitrarie per la ricerca del percorso.
I NavigationLink servono anche per considerare le scorciatoie di movimento nella ricerca del percorso, rese disponibili dall'interazione con oggetti di gioco come scale, piattaforme di salto o teletrasporti.
Le versioni 2D e 3D dei nodi NavigationJumplink sono disponibili rispettivamente come NavigationLink2D e NavigationLink3D.
Diverse regioni di navigazione possono connettere le proprie mesh di navigazione senza bisogno di un NavigationLink, purché abbiano bordi sovrapposti o bordi che rientrano nel edge_connection_margin della mappa di navigazione. Non appena la distanza è troppo grande, la creazione di connessioni valide diventa un problema, un problema che i NavigationLink possono risolvere.
Consulta Utilizzo di NavigationRegion per saperne di più sull'utilizzo delle regioni di navigazione. Consulta Connettere i mesh di navigazione per saperne di più su come connettere le mesh di navigazione.
I NavigationLink condividono molte proprietà con i NavigationRegion, come ad esempio i navigation_layers. I NavigationLink aggiungono un singolo collegamento tra due posizioni su una distanza arbitraria, a differenza dei NavigationRegion che aggiungono un'area percorribile più locale con una risorsa mesh di navigazione.
I NavigationLink hanno una posizione iniziale (start_position) e una posizione finale (end_position) e possono andare in entrambe le direzioni quando è abilitata la modalità bidirezionale (bidirectional). Una volta posizionato, un navigationlink collega i poligoni della mesh di navigazione più vicini alla sua start_position e alla sua end_position entro il raggio di ricerca del percorso.
Il raggio di ricerca dei poligoni può essere configurato a livello globale nelle Impostazioni del progetto in navigation/2d_or_3d/default_link_connection_radius oppure impostato individualmente per ogni mappa di navigazione tramite la funzione NavigationServer.map_set_link_connection_radius().
Entrambe start_position e end_position mostrano marcatori di debug nell'Editor. Le frecce indicano la direzione in cui è possibile percorrere il collegamento, e il raggio visibile di una posizione mostra il raggio di ricerca dei poligoni. Tutti i poligoni della mesh di navigazione all'interno sono confrontati e quello più vicino è scelto per la connessione di bordo. Se nessun poligono viene trovato entro il raggio di ricerca, il collegamento di navigazione viene disabilitato.
Le visualizzazioni di debug del collegamento si possono modificare nelle Impostazioni del progetto in debug/shapes/navigation. La visibilità del debug si può controllare anche nel menu del gizmo della viewport 3D dell'Editor.
Un collegamento di navigazione non fornisce alcun movimento specializzato attraverso il collegamento stesso. Piuttosto, quando un agente raggiunge la posizione di un collegamento, il codice di gioco deve reagire (ad esempio tramite trigger ad area) e fornire i mezzi per consentire all'agente di muoversi attraverso il collegamento per raggiungere l'altra posizione (ad esempio tramite teletrasporto o animazione). Senza questo, l'agente tenterà di muoversi lungo il percorso del collegamento. Potrebbe succedere che un agente cammini sopra un burrone senza fondo invece di aspettare una piattaforma mobile, o che attraversi un teletrasporto e prosegua attraverso un muro.
Modelli di script per collegamenti di navigazione
Lo script seguente utilizza il NavigationServer per creare un nuovo collegamento di navigazione.
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);
}
}