Отладка навигации
Найти причину пустого пути, неверного соединения и расхождения с физикой.
Сначала определите, что сломано: поверхность, связи регионов, результат запроса или физическое движение. Отладочная заливка показывает навигацию, но не доказывает, что коллайдер персонажа проходит по маршруту.
Порядок диагностики
- Проверьте, что регион содержит полигоны, назначен нужной карте и включён. Ненулевой
MapGetIterationIdозначает наличие опубликованной итерации, а не завершение всех последних изменений. - Сравните карту и маску слоёв запроса с регионом. Для перехода через ссылку должны подходить также её слои и направление.
- Получите путь и проверьте обе крайние точки относительно начала и цели. Непустой путь может быть частичным; окончание маршрута не означает достижение цели.
- Если путь правильный, проверяйте движение родителя: скорость, вызов
MoveAndSlide(), коллайдер и физические слои. Агент сам тело не перемещает. - При скачках времени разделите разбор геометрии, запекание, обновление карты, поиск пути и избегание. Измерение и оптимизация.
Отладочное отображение
В отладочной сборке NavigationServer2D.SetDebugEnabled(true) и NavigationServer3D.SetDebugEnabled(true) включают серверные флаги. GetDebugEnabled() читает их. Это не команда создания геометрии отладочного отображения.
Штатное отображение регионов строят соответствующие Entity. Если создавать только серверные RID, не рассчитывайте, что они автоматически появятся на экране. Для собственного серверного решения рисуйте контуры опубликованных данных и фактический результат запроса отдельно.
Параметры оформления находятся в настройках проекта под debug/shapes/navigation: линии рёбер, цвет поверхности и отображение соединений. Просмотр сквозь геометрию помогает увидеть наложение поверхностей, но не делает невидимое соединение проходимым. Отладочное отображение используйте для разработки, а не как часть игровой логики: реализация переключателя ограничена DEBUG_ENABLED.
Что означают счётчики
| Данные | Интерпретация |
|---|---|
GetProcessInfo(ProcessInfo.ActiveMaps) | Число активных карт данного 2D- или 3D-сервера. |
RegionCount, PolygonCount | Сводка по активным картам после обработки сервером. Это не число всех когда-либо созданных RID. |
Performance.Monitor.NavigationPolygonCount | Сумма 2D и 3D. Для одного измерения используйте Navigation2DPolygonCount или Navigation3DPolygonCount. |
EdgeMergeCount, EdgeConnectionCount, EdgeFreeCount | Данные о способах соединения и оставшихся рёбрах. Не складывайте их как три независимых вида проходимости. |
Performance.Monitor.TimeNavigationProcess | Время серверной обработки навигации в секундах; не длительность вашего отдельного вызова поиска пути. |
Отключённый регион остаётся назначенным карте и учитывается в RegionCount, хотя запрос через него не проходит. Не трактуйте счётчик регионов как число доступных игровых участков. После деактивации карты её вклад исчезает из сводки; это само по себе не освобождает её RID.
Симптом → следующая проверка
| Симптом | Что проверить |
|---|---|
| Путь пуст сразу после создания | Дождитесь публикации нужной геометрии; проверьте карту, полигоны и ненулевую маску. |
| Два видимых участка не соединяются | Связи рёбер: сетка карты, зазор, разрешение соединений. |
| Ссылка не даёт переход | Ссылки: направление, радиус привязки, слои и ограничение IncludedRegions в 1.0.0. |
| Агент закончил маршрут вдали от цели | Частичный путь; сравните конечную точку и исходную цель, затем IsTargetReached(). |
| Персонаж упирается в стену | Коллизия и навигация расходятся. Физический пример 3D. |
| Счётчик не уменьшился после отключения региона | Регион остался на активной карте; отключение не равно удалению. |
Счётчики, суммы 2D/3D и переключение флагов выполнены на установленной версии 1.0.0. Вид отладочного отображения, действия в редакторе и экспорт release этой проверкой не оценивались.