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.

Використання навігаційних сіток

../../_images/nav_meshes.webp

2D і 3D версії навігаційної сітки доступні як NavigationPolygon і NavigationMesh відповідно.

Примітка

Навігаційна сітка описує лише зону проходження для центральної позиції агента. Будь-які значення радіусу, які може мати агент, ігноруються. Якщо ви хочете, щоб пошук шляху враховував розмір (колізії) агента, вам потрібно відповідно зменшити навігаційну сітку.

Навігація працює незалежно від інших частин двигуна, таких як рендеринг або фізика. Під час пошуку шляху враховуються лише навігаційні сітки, напр. Наприклад, візуальні елементи та форми зіткнень повністю ігноруються навігаційною системою. Якщо вам потрібно взяти до уваги інші дані (наприклад, візуальні елементи) під час пошуку шляху, вам потрібно відповідно адаптувати свої навігаційні сітки. Процес урахування навігаційних обмежень у навігаційних сітках зазвичай називають запіканням навігаційної сітки.

Порівняння опуклого та увігнутого багатокутника навігаційної сітки

Навігаційна сітка описує поверхню, на якій агент може безпечно стояти своїм центром порівняно з фізичними формами, які описують зовнішні межі зіткнення.

Якщо під час навігаційних шляхів у вас виникли проблеми з відсіканням або зіткненнями, завжди пам’ятайте, що вам потрібно повідомити навігаційній системі про свої наміри через відповідну навігаційну сітку. Сама по собі навігаційна система ніколи не дізнається, що «це форма зіткнення дерево/скеля/стіна або візуальна сітка», оскільки вона знає лише те, що «тут мені сказали, що я можу безпечно рухатися, тому що це на навігаційній сітці».

Запікання навігаційної сітки можна виконати за допомогою NavigationRegion2D або NavigationRegion3D, або за допомогою NavigationServer2D і NavigationServer3D API безпосередньо.

Запікання навігаційної сітки з NavigationRegion

Етапи запікання навігаційної сітки

Запікання навігаційної сітки зі зміщенням радіуса агента від геометрії.

Запікання навігаційної сітки стало більш доступним за допомогою вузла NavigationRegion. Під час запікання з вузлом NavigationRegion окремі кроки аналізу, запікання та оновлення регіону об’єднуються в одну функцію.

Вузли доступні у 2D і 3D як NavigationRegion2D і NavigationRegion3D відповідно.

Порада

Навігаційну сітку source_geometry_mode можна перемкнути для аналізу конкретних імен груп вузлів, щоб вузли, які слід запікати, можна було розмістити будь-де на сцені.

Коли в редакторі вибрано вузол NavigationRegion2D, у верхній панелі редактора з’являються параметри запікання, а також інструменти малювання багатокутників.

../../_images/nav_region_baking_01.webp

Щоб регіон працював, необхідно додати ресурс NavigationPolygon.

Тоді властивості для аналізу та запікання навігаційної сітки є частиною використаного ресурсу, і їх можна знайти в інспекторі ресурсів.

../../_images/nav_region_baking_02.webp

На результат синтаксичного аналізу вихідної геометрії можна вплинути за допомогою наступних властивостей.

  • 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)

Щоб швидко перевірити 2D-випічку з налаштуваннями за замовчуванням:

  • Додайте NavigationRegion2D.

  • Додайте ресурс NavigationPolygon до NavigationRegion2D.

  • Додайте Polygon2D під NavigationRegion2D.

  • Намалюйте 1 контур NavigationPolygon за допомогою вибраного інструменту малювання NavigationRegion2D.

  • Намалюйте 1 контур Polygon2D всередині контуру NavigationPolygon за допомогою вибраного інструменту малювання Polygon2D.

  • Натисніть кнопку випікання редактора, і має з’явитися сітка навігації.

../../_images/nav_region_baking_01.webp ../../_images/nav_mesh_mini_2d.webp

Запікання навігаційної сітки за допомогою 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.