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.

Огляд 3D навігації

Godot надає численні об’єкти, класи та сервери для спрощення навігації на основі сітки або сітки та пошуку шляху для 2D та 3D ігор. У наступному розділі наведено короткий огляд усіх доступних навігаційних об’єктів у Godot для 3D-сцен та їх основного використання.

Godot надає такі об’єкти та класи для тривимірної навігації:

  • Astar3D

    Об’єкти Astar3D надають можливість знайти найкоротший шлях у графіку зважених точок.

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

  • NavigationServer3D

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

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

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

    Доступні наступні типи RID NavigationServer.
    • NavMap RID

      Посилання на конкретну навігаційну карту, яка містить регіони та агентів. Карта намагатиметься приєднатися до навігаційних сіток регіонів за віддаленістю. Карта синхронізуватиме регіони та агентів у кожному кадрі фізики.

    • NavRegion RID

      Посилання на певну область навігації, яка може містити дані сітки навігації. Регіон можна ввімкнути/вимкнути або обмежити використання за допомогою бітової маски шару навігації.

    • NavLink RID

      Посилання на конкретне навігаційне посилання, яке з’єднує дві позиції навігаційної сітки на довільних відстанях.

    • NavAgent RID

      Посилання на конкретного агента уникнення. Уникнення визначається значенням радіуса.

    • NavObstacle RID

      Посилання на конкретну перешкоду для уникнення, що використовується для впливу та обмеження швидкості уникнення агентів.

Наступні вузли дерева сцен доступні як допоміжні для роботи з NavigationServer3D API.

  • NavigationRegion3D Node

    Вузол, який містить ресурс навігаційної сітки, який визначає навігаційну сітку для NavigationServer3D.

    • Регіон можна включити / вимкнути.

    • Використання для пошуку шляху може бути додатково обмежено за допомогою бітової маски navigation_layers.

    • NavigationServer3D об’єднає навігаційні сітки регіонів за близькістю для комбінованої навігаційної сітки.

  • NavigationLink3D Node

    Вузол, який з’єднує дві позиції на навігаційних сітках на довільних відстанях для пошуку шляху.

    • Посилання можна включити/вимкнути.

    • Посилання можна зробити одностороннім або двонаправленим.

    • Використання для пошуку шляху може бути додатково обмежено за допомогою бітової маски navigation_layers.

    Посилання повідомляють досліднику про те, що зв’язок існує та якою ціною. Фактична обробка та переміщення агента має відбуватися в спеціальних сценаріях.

  • NavigationAgent3D Node

    Допоміжний вузол, який використовується для полегшення звичайних викликів API NavigationServer3D для пошуку шляху та уникнення. Використовуйте цей вузол із успадкованим батьківським вузлом Node3D.

  • NavigationObstacle3D Node

    Вузол, який можна використовувати для впливу та обмеження швидкості уникнення агентів із увімкненим уникненням. Цей вузол НЕ впливає на пошук шляхів агентів. Для цього вам потрібно змінити навігаційні сітки.

Тривимірні навігаційні сітки визначаються за допомогою таких ресурсів:

  • NavigationMesh Resource

    Ресурс, який містить дані тривимірної навігаційної сітки. Він надає параметри запікання 3D-геометрії для визначення областей навігації в редакторі, а також під час виконання.

    • Вузол NavigationRegion3D використовує цей ресурс для визначення своєї області навігації.

    • NavigationServer3D використовує цей ресурс для оновлення сітки навігації окремих регіонів.

    • Редактор GridMap використовує цей ресурс, коли для кожної комірки сітки визначено конкретні сітки навігації.

Дивись також

Ви можете побачити, як 3D-навігація працює в дії, використовуючи демонстраційний проект 3D-навігації.

Налаштування для 3D сцени

У наступних кроках показано базове налаштування для мінімальної життєздатної навігації в 3D. Він використовує NavigationServer3D і NavigationAgent3D для руху по шляху.

  1. Додайте до сцени вузол NavigationRegion3D.

  2. Клацніть вузол регіону та додайте новий ресурс NavigationMesh до вузла регіону.

    ../../_images/nav_3d_min_setup_step1.png
  3. Додайте новий вузол MeshInstance3D як дочірній вузол регіону.

  4. Виберіть вузол MeshInstance3D і додайте новий PlaneMesh і збільште розмір xy до 10.

  5. Знову виберіть вузол регіону та натисніть кнопку «Bake Navmesh» на верхній панелі.

    ../../_images/nav_3d_min_setup_step2.png
  6. Тепер з’являється прозора навігаційна сітка, яка ширяє на деякій відстані над PlaneMesh.

    ../../_images/nav_3d_min_setup_step3.png
  7. Додайте вузол CharacterBody3D у сцену з основною формою зіткнення та деякою сіткою для візуальних ефектів.

  8. Додайте вузол NavigationAgent3D під вузлом символів.

    ../../_images/nav_3d_min_setup_step4.webp
  9. Додайте скрипт до вузла CharacterBody3D із таким вмістом. Ми обов’язково встановлюємо ціль переміщення після того, як сцена повністю завантажилась і NavigationServer мав час для синхронізації. Крім того, додайте Camera3D і трохи світла та середовища, щоб побачити щось.

extends CharacterBody3D

var movement_speed: float = 2.0
var movement_target_position: Vector3 = Vector3(-3.0,0.0,2.0)

@onready var navigation_agent: NavigationAgent3D = $NavigationAgent3D

func _ready():
    # These values need to be adjusted for the actor's speed
    # and the navigation layout.
    navigation_agent.path_desired_distance = 0.5
    navigation_agent.target_desired_distance = 0.5

    # Make sure to not await during _ready.
    actor_setup.call_deferred()

func actor_setup():
    # Wait for the first physics frame so the NavigationServer can sync.
    await get_tree().physics_frame

    # Now that the navigation map is no longer empty, set the movement target.
    set_movement_target(movement_target_position)

func set_movement_target(movement_target: Vector3):
    navigation_agent.set_target_position(movement_target)

func _physics_process(delta):
    if navigation_agent.is_navigation_finished():
        return

    var current_agent_position: Vector3 = global_position
    var next_path_position: Vector3 = navigation_agent.get_next_path_position()

    velocity = current_agent_position.direction_to(next_path_position) * movement_speed
    move_and_slide()

Примітка

У першому кадрі карта NavigationServer не синхронізувала дані регіону, і будь-який запит шляху буде порожнім. Зачекайте на синхронізацію NavigationServer, дочекавшись одного кадру в сценарії.