MAATRIX GAMES / Блог / Проблемы с bot navigation mesh

Проблемы с bot navigation mesh

MAATRIX GAMES

Поставили ботов на свежую карту из Workshop, а они вместо игры тупят на респе, врезаются в стены или синхронно сигают в текстуры неба — знакомая картина для любого, кто хоть раз пробовал deathmatch с ботами на кастомке. Причина почти всегда одна: у карты нет navigation mesh, файла с картой путей для ИИ. Разберём, что это за файл, почему он пропадает и как сгенерировать его самому за пару минут.

Что такое navigation mesh простыми словами

Nav-меш (navigation mesh, он же nav-файл) — это сетка проходимых зон на карте, которую движок строит поверх геометрии уровня специально для ботов. Игрок ориентируется глазами и головой, а бот — нет: у него нет визуального восприятия карты, только набор данных о том, где можно ходить, где обрыв, где дверь, а где неразрушаемая стена. Nav-меш и есть этот набор данных — по сути, упрощённый граф связанных между собой полигонов-«клеток», по которому ИИ строит маршрут от точки А до точки Б.

Без nav-меша бот в CS2 физически не понимает, что происходит на карте за пределами прямой видимости. Он ещё может более-менее двигаться в зоне спавна, если там что-то заранее просчитано движком, но полноценного планирования маршрута, обхода препятствий и адекватной реакции на события (звук выстрела, гранату, появление врага за углом) не будет — ИИ просто нечем оперировать.

Важный нюанс: nav-меш — это не то же самое, что коллизии или геометрия карты. Карта может быть идеально собрана и оптимизирована, полностью играбельной для живых игроков, и при этом не иметь ни одного байта данных для ботов — это два независимых слоя информации, и второй собирается отдельно.

Почему у карты нет nav-файла

Все официальные карты Valve (de_dust2, de_mirage, de_inferno и остальной классический пул) идут с готовым nav-файлом в комплекте — Valve собирает его сама при релизе карты, и вам ничего делать не нужно. Проблема начинается с кастомных карт из Steam Workshop: автор карты далеко не всегда прикладывает nav-меш к публикации. Кто-то генерирует и заливает его вместе с картой, кто-то — нет, особенно если карта делалась под мультиплеер без мысли о ботах вообще.

Как понять, что дело именно в этом:

  • В консоли сервера при загрузке карты есть строка вида Warning: Could not find nav mesh или couldn't find nav file.
  • Боты либо вообще не появляются на карте, либо появляются и стоят колом на месте спавна.
  • Команда bot_add отрабатывает без ошибки, но добавленный бот ничего не делает — не двигается, не стреляет, не реагирует на игрока рядом.

Проверить наличие файла можно и вручную — nav-меш лежит в той же папке, что и сама карта, game/csgo/maps/, с тем же именем и расширением .nav. Если рядом с de_customsurf.vpk (или распакованным .bsp) файла de_customsurf.nav нет — вот и вся причина.

Поднять сервер Counter-Strike 2 за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Генерация nav-меша через nav_generate

Решение — сгенерировать nav-меш прямо на сервере, консольной командой. Заходите на карту, где нужны боты (через changelevel или сразу при старте с +map), и в консоли сервера вводите:

nav_generate

Движок Source 2 запускает автоматический анализ геометрии уровня и строит сетку проходимости с нуля. Процесс полностью автоматический, руками ничего размечать не нужно — но и не мгновенный: на компактной deathmatch-арене генерация укладывается в десятки секунд, на большой и сложной по геометрии карте (с множеством этажей, лестниц, узких проходов) может занять несколько минут. Пока идёт генерация, сервер обычно не отвечает на другие команды — это нормально, дождитесь завершения.

По готовности сервер обычно сам перезагружает карту, чтобы применить свежесозданный nav-меш. Если этого не произошло — сделайте changelevel на ту же карту вручную, иначе боты не подхватят только что сгенерированные данные до следующей смены карты.

Учитывайте один нюанс: nav_generate — это общая, автоматическая генерация. Она отлично работает на большинстве карт, но не гарантирует идеального результата на геометрически сложных или нестандартных картах (multi-level surf-трассы, карты с телепортами, скриптовыми зонами, нестандартной физикой) — там движку сложнее однозначно определить, что считать «проходимой зоной», и результат стоит проверить на практике, прежде чем считать вопрос закрытым.

Сохранение и loading сгенерированного nav-файла

Сгенерированный на лету nav-меш не сохраняется на диск автоматически — он живёт только в текущей игровой сессии. Перезапустите сервер без сохранения, и при следующей загрузке карты придётся гонять nav_generate заново. Чтобы этого избежать, сохраните файл явно:

nav_save

Команда пишет nav-меш на диск в ту же папку game/csgo/maps/, с именем карты и расширением .nav — то есть именно туда, откуда сервер и подгружает его при следующей загрузке карты автоматически, без дополнительных команд в конфиге. Дальше файл просто существует рядом с картой и подхватывается штатно, как будто был в комплекте изначально.

Практический совет: если держите несколько серверов или переустанавливаете сервер с нуля (переезд на новый хостинг, чистая переустановка после сбоя), скопируйте .nav-файлы вместе с самими картами — не полагайтесь на то, что nav-меш восстановится сам, он завязан именно на файл на диске. Бэкапьте папку maps/ целиком, включая .nav, а не только .vpk/.bsp.

Если карта регулярно обновляется автором в Workshop (геометрия меняется — добавили комнату, поправили коллизии), старый .nav-файл может рассинхронизироваться с новой версией карты: боты начнут проваливаться в места, которых раньше не было, или упираться в невидимые преграды там, где геометрию убрали. В этом случае помогает только перегенерация — nav_generate и nav_save заново после каждого заметного обновления карты.

Типичные симптомы плохого или отсутствующего nav-меша

Если nav-меш есть, но сгенерирован неидеально (или карта слишком нестандартная для автоматического алгоритма), боты ведут себя предсказуемо плохо — вот основные паттерны, по которым это легко опознать:

СимптомЧто происходит
Боты стоят на местеNav-меша нет вообще, либо зона спавна не связана с остальной картой в графе
Боты падают с карты / в текстурыNav-меш «протекает» за пределы игровой зоны — движок считает проходимой зону, которой на самом деле нет
Боты застревают в углах и дверных проёмахСлишком грубая сетка на узких участках — типично для карт с нестандартной геометрией коридоров
Боты не реагируют на игрока за угломРазрывы в графе связности между соседними зонами карты
Боты массово скапливаются в одной точкеОшибочно помеченная как «привлекательная» зона (например, из-за неверно распознанного укрытия)

Часть таких проблем чинится точечно — командами вроде nav_delete для удаления конкретной проблемной области и последующей перегенерацией именно этого участка, но это уже продвинутый уровень работы с nav-мешем, требующий разбора конкретной геометрии карты, а не общей инструкции. Для большинства деathmatch- и обучающих серверов достаточно чистого nav_generate + nav_save и точечной проверки поведения ботов вживую.

Проверка результата вживую

После генерации и сохранения не полагайтесь на предположения — зайдите на сервер и добавьте пару ботов вручную:

bot_add
bot_add
bot_difficulty 2

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

Если после nav_generate и nav_save поведение всё ещё странное локально на одном-двух участках карты — скорее всего, дело не в отсутствии меша, а в сложной геометрии именно этого места (лестницы, наклонные поверхности, скриптовые объекты), и придётся разбираться точечно, а не перегенерировать всё заново — повторная полная генерация обычно даёт тот же результат на тех же проблемных зонах.

Поднять сервер Counter-Strike 2 за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Частые вопросы

Nav_generate нужен на официальных картах Valve?

Нет, de_dust2, de_mirage, de_inferno и остальной штатный пул идут с готовым nav-файлом, генерировать вручную не требуется.

Можно ли скачать готовый nav-файл вместо генерации?

Иногда авторы карт выкладывают .nav отдельным файлом в описании Workshop-страницы или на сторонних форумах — если такой файл есть и подходит под точную версию карты, это быстрее, чем генерировать самому. Но безопаснее всего сгенерировать nav-меш локально под свою версию карты, чтобы не словить рассинхрон с чужим файлом.

nav_generate ломает что-то ещё на сервере?

Нет, команда работает только с ИИ-навигацией и не трогает геометрию карты, коллизии игроков или конфиги. Это разовая, безопасная операция.

Нужно ли перегенерировать nav-меш после каждого обновления сервера CS2 (не карты)?

Обычно нет — обновления самого движка Source 2 не трогают уже сохранённые .nav-файлы. Перегенерация нужна именно при изменении геометрии конкретной карты.

Работает ли nav_generate на карте с ботами уже добавленными до генерации?

Технически да, но лучше сначала сгенерировать и сохранить nav-меш, а уже потом добавлять ботов — так они сразу подхватят актуальную сетку, а не будут ориентироваться на пустоту, которая была на момент их спавна.