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...
Використання навігаційних сіток
2D і 3D версії навігаційної сітки доступні як NavigationPolygon і NavigationMesh відповідно.
Примітка
Навігаційна сітка описує лише зону проходження для центральної позиції агента. Будь-які значення радіусу, які може мати агент, ігноруються. Якщо ви хочете, щоб пошук шляху враховував розмір (колізії) агента, вам потрібно відповідно зменшити навігаційну сітку.
Навігація працює незалежно від інших частин двигуна, таких як рендеринг або фізика. Під час пошуку шляху враховуються лише навігаційні сітки, напр. Наприклад, візуальні елементи та форми зіткнень повністю ігноруються навігаційною системою. Якщо вам потрібно взяти до уваги інші дані (наприклад, візуальні елементи) під час пошуку шляху, вам потрібно відповідно адаптувати свої навігаційні сітки. Процес урахування навігаційних обмежень у навігаційних сітках зазвичай називають запіканням навігаційної сітки.
Навігаційна сітка описує поверхню, на якій агент може безпечно стояти своїм центром порівняно з фізичними формами, які описують зовнішні межі зіткнення.
Якщо під час навігаційних шляхів у вас виникли проблеми з відсіканням або зіткненнями, завжди пам’ятайте, що вам потрібно повідомити навігаційній системі про свої наміри через відповідну навігаційну сітку. Сама по собі навігаційна система ніколи не дізнається, що «це форма зіткнення дерево/скеля/стіна або візуальна сітка», оскільки вона знає лише те, що «тут мені сказали, що я можу безпечно рухатися, тому що це на навігаційній сітці».
Запікання навігаційної сітки можна виконати за допомогою NavigationRegion2D або NavigationRegion3D, або за допомогою NavigationServer2D і NavigationServer3D API безпосередньо.
Запікання навігаційної сітки з NavigationRegion
Запікання навігаційної сітки зі зміщенням радіуса агента від геометрії.
Запікання навігаційної сітки стало більш доступним за допомогою вузла NavigationRegion. Під час запікання з вузлом NavigationRegion окремі кроки аналізу, запікання та оновлення регіону об’єднуються в одну функцію.
Вузли доступні у 2D і 3D як NavigationRegion2D і NavigationRegion3D відповідно.
Порада
Навігаційну сітку source_geometry_mode можна перемкнути для аналізу конкретних імен груп вузлів, щоб вузли, які слід запікати, можна було розмістити будь-де на сцені.
Коли в редакторі вибрано вузол NavigationRegion2D, у верхній панелі редактора з’являються параметри запікання, а також інструменти малювання багатокутників.
Щоб регіон працював, необхідно додати ресурс NavigationPolygon.
Тоді властивості для аналізу та запікання навігаційної сітки є частиною використаного ресурсу, і їх можна знайти в інспекторі ресурсів.
На результат синтаксичного аналізу вихідної геометрії можна вплинути за допомогою наступних властивостей.
parsed_geometry_type, який фільтрує, чи візуальні об’єкти, або фізичні об’єкти, або обидва, мають бути розібрані з SceneTree. Додаткову інформацію про те, які об’єкти аналізуються та як, див. у розділі про аналіз вихідної геометрії нижче.collision_maskфільтрує, які фізичні об’єкти зіткнення включені, колиparsed_geometry_typeвключає статичні колайдери.source_geometry_mode, який визначає, з якого вузла(ів) починати синтаксичний аналіз і як пройти SceneTree.source_geometry_group_nameвикористовується, коли потрібно аналізувати лише певну групу вузлів. Залежить від вибраногоsource_geometry_mode.
З доданою вихідною геометрією результат випікання можна контролювати за допомогою наступних властивостей.
cell_sizeвстановлює розмір сітки растеризації та має відповідати розміру навігаційної карти.agent_radiusзменшує запечену навігаційну сітку, щоб мати достатній запас для розміру агента (колізії).
Запікання NavigationRegion2D також можна використовувати під час виконання зі сценаріями.
var on_thread: bool = true
bake_navigation_polygon(on_thread)
bool onThread = true;
BakeNavigationPolygon(onThread);
Щоб швидко перевірити 2D-випічку з налаштуваннями за замовчуванням:
Додайте NavigationRegion2D.
Додайте ресурс NavigationPolygon до NavigationRegion2D.
Додайте Polygon2D під NavigationRegion2D.
Намалюйте 1 контур NavigationPolygon за допомогою вибраного інструменту малювання NavigationRegion2D.
Намалюйте 1 контур Polygon2D всередині контуру NavigationPolygon за допомогою вибраного інструменту малювання Polygon2D.
Натисніть кнопку випікання редактора, і має з’явитися сітка навігації.
Коли в редакторі вибрано вузол NavigationRegion3D, у верхній панелі редактора з’являються параметри запікання.
Щоб регіон працював, необхідно додати ресурс NavigationMesh.
Тоді властивості для аналізу та запікання навігаційної сітки є частиною використаного ресурсу, і їх можна знайти в інспекторі ресурсів.
На результат синтаксичного аналізу вихідної геометрії можна вплинути за допомогою наступних властивостей.
parsed_geometry_type, який фільтрує, чи візуальні об’єкти, або фізичні об’єкти, або обидва, мають бути розібрані з SceneTree. Додаткову інформацію про те, які об’єкти аналізуються та як, див. у розділі про аналіз вихідної геометрії нижче.collision_maskфільтрує, які фізичні об’єкти зіткнення включені, колиparsed_geometry_typeвключає статичні колайдери.source_geometry_mode, який визначає, з якого вузла(ів) починати синтаксичний аналіз і як пройти SceneTree.source_geometry_group_nameвикористовується, коли потрібно аналізувати лише певну групу вузлів. Залежить від вибраногоsource_geometry_mode.
З доданою вихідною геометрією результат випікання можна контролювати за допомогою наступних властивостей.
cell_sizeіcell_heightвстановлює розмір воксельної сітки растеризації та має відповідати розміру навігаційної карти.agent_radiusзменшує запечену навігаційну сітку, щоб мати достатній запас для розміру агента (колізії).agent_heightвиключає з навігаційної сітки області, де агент зависокий, щоб поміститися.agent_max_climbіagent_max_slopeвидаляють області, де різниця у висоті між сусідніми вокселями є занадто великою, або де їх поверхня надто крута.
Попередження
Занадто малий cell_size або cell_height може створити стільки вокселів, що може призвести до зависання гри або навіть збою.
Запікання NavigationRegion3D також можна використовувати під час виконання зі сценаріями.
var on_thread: bool = true
bake_navigation_mesh(on_thread)
bool onThread = true;
BakeNavigationMesh(onThread);
Щоб швидко перевірити 3D-випічку з налаштуваннями за замовчуванням:
Додайте NavigationRegion3D.
Додайте ресурс NavigationMesh до NavigationRegion3D.
Додайте MeshInstance3D під NavigationRegion3D.
Додайте PlaneMesh до MeshInstance3D.
Натисніть кнопку випікання редактора, і має з’явитися сітка навігації.
Запікання навігаційної сітки за допомогою NavigationServer
NavigationServer2D і NavigationServer3D мають функції API для виклику кожного кроку процесу запікання навігаційної сітки окремо.
parse_source_geometry_data()можна використовувати для аналізу вихідної геометрії до повторно використовуваного та серіалізованого ресурсу.bake_from_source_geometry_data()можна використовувати для запікання навігаційної сітки з уже проаналізованих даних, наприклад. щоб уникнути проблем із продуктивністю під час виконання (надлишкового) аналізу.bake_from_source_geometry_data_async()те саме, але запікає навігаційну сітку, відкладену потоками, не блокуючи основний потік.
Порівняно з NavigationRegion, NavigationServer пропонує точніший контроль над процесом запікання навігаційної сітки. У свою чергу, він більш складний у використанні, але також надає більш розширені параметри.
Деякі інші переваги NavigationServer над NavigationRegion:
Сервер може аналізувати вихідну геометрію без запікання, наприклад. щоб зберегти його для подальшого використання.
Сервер дозволяє вибрати кореневий вузол, з якого вручну почати синтаксичний аналіз вихідної геометрії.
Сервер може приймати та запікатися з процедурно згенерованих вихідних геометричних даних.
Сервер може послідовно створювати кілька навігаційних сіток, (повторно) використовуючи ті самі вихідні геометричні дані.
Для створення навігаційних сіток за допомогою NavigationServer потрібна геометрія джерела. Вихідна геометрія — це геометричні дані, які слід враховувати в процесі запікання навігаційної сітки. Обидві навігаційні сітки для 2D і 3D створюються шляхом їх запікання з вихідної геометрії.
Двовимірна та тривимірна версії вихідних геометричних ресурсів доступні як NavigationMeshSourceGeometryData2D та NavigationMeshSourceGeometryData3D відповідно.
Вихідна геометрія може бути геометрією, проаналізованою з візуальних сіток, із фізичних колізій або процедурно створених масивів даних, як-от контури (2D) і трикутні грані (3D). Для зручності вихідна геометрія зазвичай аналізується безпосередньо з налаштувань вузлів у SceneTree. Для (повторного) запікання навігаційної сітки під час виконання майте на увазі, що аналіз геометрії завжди відбувається в основному потоці.
Примітка
SceneTree не є потокобезпечним. Розбір вихідної геометрії з SceneTree можна виконати лише в основному потоці.
Попередження
Дані з візуальних сіток і багатокутників потрібно отримати від графічного процесора, зупиняючи процес RenderingServer. Для виконання (повторного) випікання віддайте перевагу використанню фізичних форм як проаналізованої вихідної геометрії.
Вихідна геометрія зберігається всередині ресурсів, тому створену геометрію можна повторно використовувати для кількох запікань. наприклад запікання кількох навігаційних сіток для різних розмірів агента з однієї геометрії джерела. Це також дозволяє зберегти вихідну геометрію на диск, щоб її можна було завантажити пізніше, наприклад. щоб уникнути накладних витрат на його повторний аналіз під час виконання.
Геометричні дані, як правило, повинні бути дуже простими. Скільки потрібно країв, але якомога менше. Особливо у 2D слід уникати дублювання та вкладеної геометрії, оскільки це змушує обчислювати отвір полігону, що може призвести до перевернутих багатокутників. Прикладом вкладеної геометрії може бути менша фігура StaticBody2D, розміщена повністю в межах іншої фігури StaticBody2D.
Випікання фрагментів навігаційної сітки для великих світів
Створення та оновлення окремих фрагментів сітки навігації під час виконання.
Дивись також
Ви можете побачити процес запікання навігаційної сітки в дії в Navigation Mesh Chunks 2D та Navigation Mesh Chunks 3D демонстраційні проекти.
Щоб уникнути невирівняних країв між різними фрагментами області, навігаційні сітки мають дві важливі властивості для процесу запікання навігаційної сітки. Облямівка випічки та розмір бордюру. Разом їх можна використовувати для забезпечення ідеально вирівняних країв між фрагментами області.
Фрагмент навігаційної сітки, запечений із запеченим обв’язуванням або запечений із додатковим розміром рамки.
Межа запікання, яка є вирівняною за віссю Rect2 для 2D і AABB для 3D, обмежує використану вихідну геометрію, відкидаючи всю геометрію, яка знаходиться поза межами.
Властивості NavigationPolygon baking_rect і baking_rect_offset можна використовувати для створення та розміщення двовимірної межі запікання.
Властивості NavigationMesh filter_baking_aabb і filter_baking_aabb_offset можна використовувати для створення та розміщення межі 3D-запікання.
Є лише одна проблема, пов’язана з випічкою. На результуючу навігаційну сітку неминуче впливатимуть необхідні зсуви, такі як agent_radius, через що краї не вирівнюються належним чином.
Фрагменти навігаційної сітки з помітними проміжками через зміщення радіуса запеченого агента.
Саме тут з’являється властивість border_size для навігаційної сітки. Розмір рамки — це внутрішнє поле від межі запікання. Важливою характеристикою розміру рамки є те, що на нього не впливає більшість зсувів і постобробка, як-от agent_radius.
Замість того, щоб відкидати вихідну геометрію, розмір межі відкидає частини кінцевої поверхні запеченої навігаційної сітки. Якщо межа випікання достатньо велика, розмір межі може видалити проблемні частини поверхні, щоб залишився лише запланований розмір шматка.
Фрагменти сітки навігації з вирівняними краями та без розривів.
Примітка
Межі запікання мають бути достатньо великими, щоб включати розумну кількість вихідної геометрії з усіх сусідніх фрагментів.
Попередження
У 3D функціональність розміру рамки обмежена віссю xz.
Загальні проблеми з запіканням навігаційної сітки
Є деякі поширені проблеми користувачів і важливі застереження, які слід враховувати під час створення або запікання навігаційних сіток.
- Запікання сітки навігації створює проблеми з частотою кадрів під час виконання
Запікання навігаційної сітки за замовчуванням виконується у фоновому потоці, тому, поки платформа підтримує потоки, фактичне запікання рідко є джерелом будь-яких проблем із продуктивністю (припускаючи, що для повторного запікання під час виконання мається достатнього розміру та складна геометрія).
Загальним джерелом проблем із продуктивністю під час виконання є крок аналізу вихідної геометрії, який включає вузли та SceneTree. SceneTree не є потоково-безпечним, тому всі вузли потрібно аналізувати в основному потоці. Деякі вузли з великою кількістю даних можуть бути дуже важкими та повільними для аналізу під час виконання, напр. TileMap має один або більше полігонів для кожної окремої використаної клітинки та TileMapLayer для аналізу. Вузли, які зберігають сітки, повинні запитувати дані від RenderingServer, щоб зупинити візуалізацію в процесі.
Щоб покращити продуктивність, використовуйте більш оптимізовані форми, напр. зіткнення форм над детальними візуальними сітками, а також об’єднання та спрощення максимально можливої геометрії наперед. Якщо нічого не допомагає, не аналізуйте SceneTree і не додавайте вихідну процедуру геометрії зі сценаріями. Якщо як вихідну геометрію використовуються лише чисті масиви даних, весь процес запікання можна виконати у фоновому потоці.
- Навігаційна сітка створює ненавмисні отвори в 2D.
Запікання навігаційної сітки у 2D виконується шляхом виконання операцій відсікання багатокутників на основі контурних шляхів. Багатокутники з «дірами» є необхідним злом для створення складніших двовимірних багатокутників, але можуть стати непередбачуваними для користувачів із багатьма складними формами.
Щоб уникнути будь-яких несподіваних проблем із обчисленням отворів у багатокутнику, уникайте вкладення будь-яких контурів у інші контури того самого типу (прохідні/перешкоди). Це включає проаналізовані форми з вузлів. наприклад розміщення меншої фігури StaticBody2D всередині більшої фігури StaticBody2D може призвести до перевертання отриманого багатокутника.
- Навігаційна сітка з’являється всередині геометрії в 3D.
Навігаційна сітка, що запікається в 3D, не має поняття «всередині». Комірки вокселів, які використовуються для растеризації геометрії, або зайняті, або ні. Видаліть геометрію, яка знаходиться на землі всередині іншої геометрії. Якщо це неможливо, додайте всередину меншу «фіктивну» геометрію з якомога меншою кількістю трикутників, щоб клітинки були чимось зайняті.
Фігуру NavigationObstacle3D, налаштовану на запікання з навігаційною сіткою, також можна використовувати, щоб відкинути геометрію.
Фігуру NavigationObstacle3D можна використовувати для видалення небажаних частин навігаційної сітки.
Шаблони скриптів навігаційної сітки
Наступний скрипт використовує NavigationServer для аналізу вихідної геометрії з дерева сцени, запікає навігаційну сітку та оновлює область навігації за допомогою оновленої навігаційної сітки.
extends Node2D
var navigation_mesh: NavigationPolygon
var source_geometry : NavigationMeshSourceGeometryData2D
var callback_parsing : Callable
var callback_baking : Callable
var region_rid: RID
func _ready() -> void:
navigation_mesh = NavigationPolygon.new()
navigation_mesh.agent_radius = 10.0
source_geometry = NavigationMeshSourceGeometryData2D.new()
callback_parsing = on_parsing_done
callback_baking = on_baking_done
region_rid = NavigationServer2D.region_create()
# Enable the region and set it to the default navigation map.
NavigationServer2D.region_set_enabled(region_rid, true)
NavigationServer2D.region_set_map(region_rid, get_world_2d().get_navigation_map())
# Some mega-nodes like TileMap are often not ready on the first frame.
# Also the parsing needs to happen on the main-thread.
# So do a deferred call to avoid common parsing issues.
parse_source_geometry.call_deferred()
func parse_source_geometry() -> void:
source_geometry.clear()
var root_node: Node2D = self
# Parse the obstruction outlines from all child nodes of the root node by default.
NavigationServer2D.parse_source_geometry_data(
navigation_mesh,
source_geometry,
root_node,
callback_parsing
)
func on_parsing_done() -> void:
# If we did not parse a TileMap with navigation mesh cells we may now only
# have obstruction outlines so add at least one traversable outline
# so the obstructions outlines have something to "cut" into.
source_geometry.add_traversable_outline(PackedVector2Array([
Vector2(0.0, 0.0),
Vector2(500.0, 0.0),
Vector2(500.0, 500.0),
Vector2(0.0, 500.0)
]))
# Bake the navigation mesh on a thread with the source geometry data.
NavigationServer2D.bake_from_source_geometry_data_async(
navigation_mesh,
source_geometry,
callback_baking
)
func on_baking_done() -> void:
# Update the region with the updated navigation mesh.
NavigationServer2D.region_set_navigation_polygon(region_rid, navigation_mesh)
using Godot;
public partial class MyNode2D : Node2D
{
private NavigationPolygon _navigationMesh;
private NavigationMeshSourceGeometryData2D _sourceGeometry;
private Callable _callbackParsing;
private Callable _callbackBaking;
private Rid _regionRid;
public override void _Ready()
{
_navigationMesh = new NavigationPolygon();
_navigationMesh.AgentRadius = 10.0f;
_sourceGeometry = new NavigationMeshSourceGeometryData2D();
_callbackParsing = Callable.From(OnParsingDone);
_callbackBaking = Callable.From(OnBakingDone);
_regionRid = NavigationServer2D.RegionCreate();
// Enable the region and set it to the default navigation map.
NavigationServer2D.RegionSetEnabled(_regionRid, true);
NavigationServer2D.RegionSetMap(_regionRid, GetWorld2D().NavigationMap);
// Some mega-nodes like TileMap are often not ready on the first frame.
// Also the parsing needs to happen on the main-thread.
// So do a deferred call to avoid common parsing issues.
CallDeferred(MethodName.ParseSourceGeometry);
}
private void ParseSourceGeometry()
{
_sourceGeometry.Clear();
Node2D rootNode = this;
// Parse the obstruction outlines from all child nodes of the root node by default.
NavigationServer2D.ParseSourceGeometryData(
_navigationMesh,
_sourceGeometry,
rootNode,
_callbackParsing
);
}
private void OnParsingDone()
{
// If we did not parse a TileMap with navigation mesh cells we may now only
// have obstruction outlines so add at least one traversable outline
// so the obstructions outlines have something to "cut" into.
_sourceGeometry.AddTraversableOutline(
[
new Vector2(0.0f, 0.0f),
new Vector2(500.0f, 0.0f),
new Vector2(500.0f, 500.0f),
new Vector2(0.0f, 500.0f),
]);
// Bake the navigation mesh on a thread with the source geometry data.
NavigationServer2D.BakeFromSourceGeometryDataAsync(_navigationMesh, _sourceGeometry, _callbackBaking);
}
private void OnBakingDone()
{
// Update the region with the updated navigation mesh.
NavigationServer2D.RegionSetNavigationPolygon(_regionRid, _navigationMesh);
}
}
extends Node3D
var navigation_mesh: NavigationMesh
var source_geometry : NavigationMeshSourceGeometryData3D
var callback_parsing : Callable
var callback_baking : Callable
var region_rid: RID
func _ready() -> void:
navigation_mesh = NavigationMesh.new()
navigation_mesh.agent_radius = 0.5
source_geometry = NavigationMeshSourceGeometryData3D.new()
callback_parsing = on_parsing_done
callback_baking = on_baking_done
region_rid = NavigationServer3D.region_create()
# Enable the region and set it to the default navigation map.
NavigationServer3D.region_set_enabled(region_rid, true)
NavigationServer3D.region_set_map(region_rid, get_world_3d().get_navigation_map())
# Some mega-nodes like GridMap are often not ready on the first frame.
# Also the parsing needs to happen on the main-thread.
# So do a deferred call to avoid common parsing issues.
parse_source_geometry.call_deferred()
func parse_source_geometry() -> void:
source_geometry.clear()
var root_node: Node3D = self
# Parse the geometry from all mesh child nodes of the root node by default.
NavigationServer3D.parse_source_geometry_data(
navigation_mesh,
source_geometry,
root_node,
callback_parsing
)
func on_parsing_done() -> void:
# Bake the navigation mesh on a thread with the source geometry data.
NavigationServer3D.bake_from_source_geometry_data_async(
navigation_mesh,
source_geometry,
callback_baking
)
func on_baking_done() -> void:
# Update the region with the updated navigation mesh.
NavigationServer3D.region_set_navigation_mesh(region_rid, navigation_mesh)
using Godot;
public partial class MyNode3D : Node3D
{
private NavigationMesh _navigationMesh;
private NavigationMeshSourceGeometryData3D _sourceGeometry;
private Callable _callbackParsing;
private Callable _callbackBaking;
private Rid _regionRid;
public override void _Ready()
{
_navigationMesh = new NavigationMesh();
_navigationMesh.AgentRadius = 0.5f;
_sourceGeometry = new NavigationMeshSourceGeometryData3D();
_callbackParsing = Callable.From(OnParsingDone);
_callbackBaking = Callable.From(OnBakingDone);
_regionRid = NavigationServer3D.RegionCreate();
// Enable the region and set it to the default navigation map.
NavigationServer3D.RegionSetEnabled(_regionRid, true);
NavigationServer3D.RegionSetMap(_regionRid, GetWorld3D().NavigationMap);
// Some mega-nodes like GridMap are often not ready on the first frame.
// Also the parsing needs to happen on the main-thread.
// So do a deferred call to avoid common parsing issues.
CallDeferred(MethodName.ParseSourceGeometry);
}
private void ParseSourceGeometry ()
{
_sourceGeometry.Clear();
Node3D rootNode = this;
// Parse the geometry from all mesh child nodes of the root node by default.
NavigationServer3D.ParseSourceGeometryData(
_navigationMesh,
_sourceGeometry,
rootNode,
_callbackParsing
);
}
private void OnParsingDone()
{
// Bake the navigation mesh on a thread with the source geometry data.
NavigationServer3D.BakeFromSourceGeometryDataAsync(_navigationMesh, _sourceGeometry, _callbackBaking);
}
private void OnBakingDone()
{
// Update the region with the updated navigation mesh.
NavigationServer3D.RegionSetNavigationMesh(_regionRid, _navigationMesh);
}
}
Наступний скрипт використовує NavigationServer для оновлення області навігації за допомогою процедурно згенерованих даних навігаційної сітки.
extends Node2D
var navigation_mesh: NavigationPolygon
var region_rid: RID
func _ready() -> void:
navigation_mesh = NavigationPolygon.new()
region_rid = NavigationServer2D.region_create()
# Enable the region and set it to the default navigation map.
NavigationServer2D.region_set_enabled(region_rid, true)
NavigationServer2D.region_set_map(region_rid, get_world_2d().get_navigation_map())
# Add vertices for a convex polygon.
navigation_mesh.vertices = PackedVector2Array([
Vector2(0.0, 0.0),
Vector2(100.0, 0.0),
Vector2(100.0, 100.0),
Vector2(0.0, 100.0),
])
# Add indices for the polygon.
navigation_mesh.add_polygon(
PackedInt32Array([0, 1, 2, 3])
)
NavigationServer2D.region_set_navigation_polygon(region_rid, navigation_mesh)
using Godot;
public partial class MyNode2D : Node2D
{
private NavigationPolygon _navigationMesh;
private Rid _regionRid;
public override void _Ready()
{
_navigationMesh = new NavigationPolygon();
_regionRid = NavigationServer2D.RegionCreate();
// Enable the region and set it to the default navigation map.
NavigationServer2D.RegionSetEnabled(_regionRid, true);
NavigationServer2D.RegionSetMap(_regionRid, GetWorld2D().NavigationMap);
// Add vertices for a convex polygon.
_navigationMesh.Vertices =
[
new Vector2(0, 0),
new Vector2(100.0f, 0),
new Vector2(100.0f, 100.0f),
new Vector2(0, 100.0f),
];
// Add indices for the polygon.
_navigationMesh.AddPolygon([0, 1, 2, 3]);
NavigationServer2D.RegionSetNavigationPolygon(_regionRid, _navigationMesh);
}
}
extends Node3D
var navigation_mesh: NavigationMesh
var region_rid: RID
func _ready() -> void:
navigation_mesh = NavigationMesh.new()
region_rid = NavigationServer3D.region_create()
# Enable the region and set it to the default navigation map.
NavigationServer3D.region_set_enabled(region_rid, true)
NavigationServer3D.region_set_map(region_rid, get_world_3d().get_navigation_map())
# Add vertices for a convex polygon.
navigation_mesh.vertices = PackedVector3Array([
Vector3(-1.0, 0.0, 1.0),
Vector3(1.0, 0.0, 1.0),
Vector3(1.0, 0.0, -1.0),
Vector3(-1.0, 0.0, -1.0),
])
# Add indices for the polygon.
navigation_mesh.add_polygon(
PackedInt32Array([0, 1, 2, 3])
)
NavigationServer3D.region_set_navigation_mesh(region_rid, navigation_mesh)
using Godot;
public partial class MyNode3D : Node3D
{
private NavigationMesh _navigationMesh;
private Rid _regionRid;
public override void _Ready()
{
_navigationMesh = new NavigationMesh();
_regionRid = NavigationServer3D.RegionCreate();
// Enable the region and set it to the default navigation map.
NavigationServer3D.RegionSetEnabled(_regionRid, true);
NavigationServer3D.RegionSetMap(_regionRid, GetWorld3D().NavigationMap);
// Add vertices for a convex polygon.
_navigationMesh.Vertices =
[
new Vector3(-1.0f, 0.0f, 1.0f),
new Vector3(1.0f, 0.0f, 1.0f),
new Vector3(1.0f, 0.0f, -1.0f),
new Vector3(-1.0f, 0.0f, -1.0f),
];
// Add indices for the polygon.
_navigationMesh.AddPolygon([0, 1, 2, 3]);
NavigationServer3D.RegionSetNavigationMesh(_regionRid, _navigationMesh);
}
}