routeNavmesh и столкновения

Navmesh определяет пространство, по которому можно ходить, для поиска пути и ограничений движения.

Навмэш-сетки определяют проходимые области в вашем мире. Используйте их для:

  • Привязки появляющихся объектов к достижимой земле

  • Ограничения игроков/NPC проходимыми областями

Коллайдеры также можно использовать для вырезания навмэш-сеток в редакторе.

Компоненты (краткий обзор)

  • Навмэш: запечённая навигационная сетка, которую вы запрашиваете и перестраиваете

  • Navmesh_Loop: циклы полигонов, определяющие проходимые границы (и отверстия)

  • Коллайдеры: Box_Collider, Circle_Collider, Edge_Collider, Polygon_Collider

circle-info

Для движения/поиска пути (Movement_Agent) см. Агенты движения/NPC.

Справочник API Navmesh

Navmesh :: class : Component {
    // Спроецировать точку на этот навмэш.
    // triangle_hint — это подсказка для ускорения, которую можно повторно использовать для запросов поблизости.
    try_find_closest_point_on_navmesh :: method(
        to_point: v2,
        result: ref v2,
        triangle_hint: ref s64
    ) -> bool;

    rebuild_immediately :: method() -> bool;
    mark_for_rebuild    :: method();
}

Настройка в редакторе (создание навмэша)

  1. Создайте сущность и добавьте Навмэш компонент.

  2. Создайте дочерние сущности с Navmesh_Loop компонентами, чтобы определить проходимые полигоны.

  3. Для каждого Navmesh_Loop:

    • Добавьте точки, чтобы определить форму цикла

    • Переключите Flip Inside Outside чтобы сделать дыру/препятствие вместо проходимого пространства

  4. Используйте отладочные параметры навмэша в инспекторе, чтобы визуализировать треугольники.

circle-info

По умолчанию Navmesh_Loop определяет проходимую область. Переверните его, чтобы «пробивать дыры» (непроходимые островки) в существующей навмэш-сетке.

Коллайдеры и циклы навмэша

Коллайдеры также могут вносить циклы через параметры инспектора коллайдера (например, «Make Navmesh Loop» / «Flip Navmesh Loop»).

Важные оговорки:

  • A Навмэш не не автоматически перестраивается только потому, что коллайдер изменился во время выполнения.

  • Если вы изменяете геометрию коллайдера и полагаетесь на циклы, зависящие от коллайдера, вручную перестройте навмэш (см. ниже).

  • Если вы хотите навмэш, который полностью игнорирует коллайдеры, используйте параметр инспектора навмэша для игнорирования коллайдеров.

Появление на навмэше (привязка к достижимой земле)

Используйте try_find_closest_point_on_navmesh чтобы спроецировать желаемую позицию на ближайшую допустимую точку навмэша:

circle-info

Переиспользуйте triangle_hint для повторяющихся запросов в одной и той же области (спавнеры лута, волновые спавны и т. п.). Это может значительно ускорить проекцию.

Перестройка навмэшей (при изменении геометрии)

Используйте одно из:

  • mark_for_rebuild(): откладывает перестройку до начала следующего кадра (лучше всего для пакетной обработки)

  • rebuild_immediately(): перестраивает сейчас (используйте только если вам нужно запросить обновлённую сетку в том же кадре)

circle-exclamation

Столкновения (текущая поддержка CSL)

Коллайдеры существуют как компоненты (Box_Collider, Circle_Collider, Edge_Collider, Polygon_Collider), но скриптовые колбэки входа/выхода столкновений ещё не реализованы в CSL.

Псевдологика столкновений (триггеры, подбираемые предметы, «попадания»)

Пока колбэки столкновений не доступны в CSL, стандартный подход такой:

  • Запрашивайте ближайшие компоненты с помощью Scene.get_all_components_in_range / Scene.get_closest_component_in_range

  • Выполняйте простые проверки расстояния (in_range) чтобы определить «внутри», «подобрано», «попадание» и т. п.

Вспомогательные функции запросов сцены

circle-info

Для игровых последствий (урон, подбор предметов, счёт) предпочитайте серверную сторону. Для косметической обратной связи используйте локальные проверки.

Зона триггера (вход / нахождение / выход)

Чтобы имитировать зону триггера, ведите список тех, кто был внутри на прошлом кадре, и сравнивайте его с результатами текущего кадра.

circle-exclamation

Подбираемые предметы (ближайший в радиусе)

Быстрые «попадания» при движении (простая субдискретизация)

Если вы движетесь быстро (рывок, снаряд), при проверке только конечной позиции можно пропустить узкие цели. Простое решение — субдискретизация: взять несколько точек между старой и новой позицией и выполнить те же запросы по радиусу.

Последнее обновление