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...
Usando NavigationLinks
NavigationLinks são usados para conectar polígonos de malha de navegação de NavigationRegion2D e NavigationRegion3D ao longo de distâncias arbitrárias para a busca de caminhos.
NavigationLinks também são usados para considerar atalhos de movimento na busca de caminhos disponíveis através da interação com objetos de jogabilidade, por exemplo, escadas, plataformas de salto (jump pads) ou teletransportes.
As versões 2D e 3D dos nós NavigationLinks estão disponíveis como NavigationLink2D e NavigationLink3D, respectivamente.
Diferentes NavigationRegions podem conectar suas malhas de navegação sem a necessidade de um NavigationLink, desde que tenham arestas sobrepostas ou arestas que estejam dentro da edge_connection_margin do mapa de navegação. Assim que a distância se torna muito grande, construir conexões válidas se torna um problema — um problema que os NavigationLinks podem resolver.
Consulte Usando NavigationRegions para saber mais sobre o uso de regiões de navegação. Consulte Conectando malhas de navegação para saber mais sobre como conectar malhas de navegação.
Os NavigationLinks compartilham muitas propriedades com as NavigationRegions, como navigation_layers. Os NavigationLinks adicionam uma única conexão entre duas posições ao longo de uma distância arbitrária, em comparação com as NavigationRegions, que adicionam uma área atravessável mais local com um recurso de malha de navegação.
Os NavigationLinks possuem uma start_position e uma end_position e podem funcionar em ambas as direções quando bidirectional está ativado. Quando posicionado, um link de navegação conecta os polígonos da malha de navegação mais próximos de sua start_position e end_position dentro do raio de busca para a busca de caminhos.
O raio de busca de polígonos pode ser configurado globalmente nas Configurações do Projeto (ProjectSettings) em navigation/2d_or_3d/default_link_connection_radius ou definido para cada mapa de navegação individualmente usando a função NavigationServer.map_set_link_connection_radius().
Tanto a start_position quanto a end_position possuem marcadores de depuração (debug) no Editor. As setas indicam em qual direção o link pode ser percorrido, e o raio visível de uma posição mostra o raio de busca do polígonos. Todos os polígonos da malha de navegação internos são comparados e o mais próximo é escolhido para a conexão da aresta. Se nenhum polígono válido for encontrado dentro do raio de busca, o link de navegação será desativado.
Os visuais de depuração do link podem ser alterados nas ProjectSettings do Editor em debug/shapes/navigation. A visibilidade da depuração também pode ser controlada no menu de gizmos da Viewport 3D do Editor.
Um link de navegação não fornece nenhum movimento especializado através do link. Em vez disso, quando um agente atinge a posição de um link, o código do jogo precisa reagir (por exemplo, por meio de gatilhos de área - Areas) e fornecer meios para o agente se mover pelo link para terminar na outra posição do link (por exemplo, por meio de teletransporte ou animação). Sem isso, um agente tentará se mover por conta própria ao longo do caminho do link. Você poderia acabar com um agente caminhando sobre um abismo sem fim em vez de esperar por uma plataforma móvel, ou caminhando através de um teletransportador e atravessando uma parede.
Modelos de script de link de navegação
O seguinte script usa o NavigationServer para criar um novo link de navegação.
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);
}
}