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...
Використання навігаційних посилань
NavigationLinks використовуються для з’єднання полігонів навігаційної сітки з NavigationRegion2D та NavigationRegion3D на довільних відстанях для пошуку шляху.
NavigationLinks також використовуються для розгляду ярликів руху під час пошуку шляху, доступних через взаємодію з ігровими об’єктами, наприклад. драбини, майданчики для стрибків або телепорти.
2D і 3D версії вузлів NavigationJumplinks доступні як NavigationLink2D і NavigationLink3D відповідно.
Різні навігаційні регіони можуть з’єднувати свої навігаційні сіті без необхідності навігаційного посилання, якщо вони мають краї, що перекриваються, або ребра, які знаходяться в межах edge_connection_margin карти навігації. Як тільки відстань стає надто великою, створення дійсних з’єднань стає проблемою – проблемою, яку NavigationLinks може вирішити.
Перегляньте Використання NavigationRegions, щоб дізнатися більше про використання областей навігації. Перегляньте Підключення навігаційних сіток, щоб дізнатися більше про те, як підключити навігаційні сітки.
NavigationLinks має багато спільних властивостей з NavigationRegions, наприклад navigation_layers. NavigationLinks додають єдине з’єднання між двома позиціями на довільній відстані порівняно з NavigationRegions, які додають більш локальну область проходження з ресурсом навігаційної сітки.
Навігаційні посилання мають start_position і end_position і можуть йти в обох напрямках, якщо bidirectional увімкнено. Розміщене навігаційне посилання з’єднує полігони навігаційної сітки, найближчі до його start_position і end_position в радіусі пошуку для пошуку шляху.
Радіус пошуку багатокутника можна налаштувати глобально в ProjectSettings у розділі navigation/2d_or_3d/default_link_connection_radius або встановити для кожної навігаційної карти окремо за допомогою функції NavigationServer.map_set_link_connection_radius().
І start_position, і end_position мають маркери налагодження в редакторі. Стрілки вказують, у якому напрямку можна пересуватися за посиланням, а видимий радіус позиції показує радіус пошуку багатокутника. Усі полігони навігаційної сітки всередині порівнюються, і для з’єднання країв вибирається найближчий. Якщо в радіусі пошуку не знайдено жодного дійсного багатокутника, навігаційне посилання буде вимкнено.
Візуальні елементи налагодження посилань можна змінити в редакторі ProjectSettings у розділі debug/shapes/navigation. Видимістю налагодження також можна керувати в меню gizmo Editor 3D Viewport.
Навігаційне посилання не забезпечує жодного спеціалізованого переміщення за посиланням. Натомість, коли агент досягає позиції посилання, ігровий код має відреагувати (наприклад, за допомогою тригерів області) і надати засоби для переміщення агента через посилання, щоб опинитися в іншій позиції посилання (наприклад, через телепорт або анімацію). Без цього агент намагатиметься рухатися по шляху посилання. У кінцевому підсумку ви можете отримати агента, що йде над бездонною ямою замість того, щоб чекати рухомої платформи, або проходить крізь телепорт і йде крізь стіну.
Шаблони скриптів посилань навігації
Наступний скрипт використовує NavigationServer для створення нового навігаційного посилання.
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);
}
}