routeНавмеш и столкновения

Навмеши определяют проходимое пространство для поиска пути и ограничений движения.

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

  • Привязывания появившихся предметов к достижимой поверхности

  • Ограничения игроков/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

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

Быстрая проверка попаданий при движении (простая субшагировка)

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

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