Navmesh::class:Component{// Проецирует точку на этот навмеш.// triangle_hint — подсказка для ускорения, которую можно повторно использовать для близких запросов.try_find_closest_point_on_navmesh::method(to_point:v2,result:refv2,triangle_hint:refs64)->bool;rebuild_immediately::method()->bool;mark_for_rebuild::method();}
Настройка в редакторе (построение навмеша)
Создайте сущность и добавьте Навмеш компонент.
Создайте дочерние сущности с Navmesh_Loop компонентами, чтобы определить проходимые полигоны.
Для каждого Navmesh_Loop:
Добавьте точки для определения формы контура
Переключите Flip Inside Outside чтобы сделать это дырой/преградой вместо проходимого пространства
Используйте параметры отладки навмеша в инспекторе, чтобы визуализировать треугольники.
По умолчанию, Navmesh_Loop определяет проходимую область. Переключите его, чтобы «пробить отверстия» (непроходимые островки) в существующем навмеше.
Коллайдеры и циклы навмеша
Коллайдеры также могут добавлять контуры через опции инспектора коллайдера (например, «Make Navmesh Loop» / «Flip Navmesh Loop»).
Важные оговорки:
A Навмеш делает не автоматически перестраивает просто потому, что коллайдер изменился во время выполнения.
Если вы изменяете геометрию коллайдера и полагаетесь на контуры, управляемые коллайдерами, вручную перестройте навмеш (см. ниже).
Если вы хотите навмеш, который полностью игнорирует коллайдеры, используйте опцию инспектора навмеша, чтобы игнорировать коллайдеры.
Спавн на навмеше (привязка к достижимой поверхности)
Используйте try_find_closest_point_on_navmesh чтобы спроецировать желаемую позицию на ближайшую допустимую точку на навмеше:
Повторно используйте triangle_hint для повторных запросов в той же области (спавнеры добычи, волновые спавны и т.д.). Это может значительно ускорить проекцию.
Перестройка навмешей (когда геометрия меняется)
Используйте один из:
mark_for_rebuild(): откладывает перестройку до начала следующего кадра (лучше для пакетной обработки)
rebuild_immediately(): перестраивает сразу (используйте только если нужно выполнить запрос к обновлённой сетке в том же кадре)
Если у вас есть родительский навмеш, который «сшивает» несколько дочерних навмешей вместе, изменение дочернего навмеша не перестраивает родительский автоматически. Вызовите mark_for_rebuild() / rebuild_immediately() на родительском после правок.
Коллизии (текущая поддержка в 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) чтобы определить «внутри», «подобрано», «попало» и т.д.
Хелперы для запросов сцены
Предпочитайте серверную проверку для игровых последствий (урон, подборы, очки). Используйте локальные проверки только для косметической отдачи.
Триггерный объём (вход / пребывание / выход)
Чтобы симулировать зону-триггер, храните список тех, кто был внутри в прошлом кадре, и сравнивайте его с результатами текущего кадра.
Это логика коллизий «по возможности». Если что-то телепортируется/удаляется между обновлениями, вы можете не получить корректный «выход», если не обработаете очистку.
Подборы (ближайшее в радиусе)
Быстрая проверка попаданий при движении (простая субшагировка)
Если вы движетесь быстро (рывок, снаряд), вы можете пропустить узкие цели, проверяя только конечную позицию. Простое решение — субшагировка: попробуйте несколько точек между прошлой и новой позицией и выполните те же запросы по диапазону.