routeНавмеш и коллизии

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

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

  • Прикреплять заспавненные предметы к доступной земле

  • Ограничивать игроков/НПС проходимыми регионами

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

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

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

  • 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. Создайте сущность и добавьте Navmesh компонент.

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

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

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

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

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

circle-info

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

Коллайдеры и петли навсетки

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

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

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

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

  • Если вы хотите навсетку, полностью игнорирующую коллайдеры, используйте опцию инспектора навсетки, чтобы игнорировать коллайдеры.

Спавн на навсетке (ограничение до доступной земли)

Используйте 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

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

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

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

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