← Stanislav Deffiro
SYS 02 AI navigation

Dynamic Navigation

Навигация ИИ по изменяемому ландшафту

Навигация для ИИ на ландшафте, который меняется во время игры. Система пересобирает NavMesh по коллизиям мешей и сшивает его островки переходами разных типов - прыжок, подъём на уступ, спуск, преодоление любого препятствия и каждый со своим весом. НПС продолжает искать маршрут, даже когда игрок только что построил или снёс объект у него под ногами.

Runtime NavMesh Off-mesh links Weighted traversal
SURFACE 01 SURFACE 02 SURFACE 03 CLIMB JUMP
Type Navigation framework
Input data Меши · коллизии
Rebuild В реальном времени
Status Прототип работает
Sec 01 Откуда взялась идея

Стандартный NavMesh знает только ровный пол и заранее известную геометрию. Стоит игроку что-то построить - и ИИ упирается в стену, которой ещё минуту назад не было.

Я делал сцену, где игрок свободно ставит и убирает объекты. Но как только захотел ввести в игру ботов - все посыпалось. НПС либо баговался, либо шёл по маршруту, который перестал существовать. Пересборка навигации целиком стоила слишком дорого, а вручную расставленные точки прыжков не выживали ни одного изменения.

01 Навигация статична, а мир — нет: любая постройка делает маршрут неверным.
02 Разрывы поверхностей ИИ не видит: даже если двумя покрытыми NavMesh зонами всего пара сантиметров НПС не сможет перейти из одной в другой без явного указания из кода.
03 Даже когда переход физически возможен, у ИИ нет способа сравнить «обойти» и «перепрыгнуть» — нет цены действия.
Sec 02 Идея системы

Решение: островки NavMesh и швы между ними как карта навигации

Ровные поверхности остаются обычным NavMesh — по ним ИИ ходит как всегда. Всё остальное система добавляет сверху: она ищет края островков и проверяет, можно ли попасть с одного на другой действием, а не шагом. Так появляются швы — прыжок, подъём, спуск, — и разорванный мир снова становится связным графом.

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

Мир меняется — граф тоже Пересобирается только затронутая область, а не вся сцена.
Переход = тип действия Шов несёт с собой анимацию и правила исполнения, а не только геометрию.
Веса вместо запретов Сложный путь не закрыт — он просто дороже, и ИИ пойдёт по нему, если другого нет.
GOAL
FIG. 01 Ландшафт меняется — маршрут перестраивается: обход, подъём, прыжок
Sec 03 Демонстрация логики
REC 01 Логика системы · со звуком
REC 02 Система в игровой ситуации · со звуком
loop
TECH Технические кадры · клик по скриншоту — увеличить
Sec 04 Как это устроено
STEP 01 Чтение геометрии

Система работает не с ассетами, а с коллизиями мешей: любой объект, у которого есть форма, автоматически участвует в навигации. Гейм-дизайнеру или левел-дизайнеру не нужно ничего размечать — достаточно поставить предмет в мир.

STEP 02 Островки поверхностей

На ровных площадках строится обычный NavMesh. Ключевое отличие в том, что он больше не обязан быть единым: система принимает мир как набор несвязанных островков и работает с их краями.

STEP 03 Сшивание переходами

Между краями островков проверяются возможные действия: подняться на уступ, спрыгнуть, перепрыгнуть разрыв. Прошедшая проверку пара краёв становится швом с указанным типом действия — ИИ знает не только «куда», но и «как».

STEP 04 Веса и стоимость маршрута

Каждому шву считается вес по высоте, дистанции и риску исполнения. Далее поиск пути через стандартный алгоритм Дейкстры складывает эти веса, поэтому один и тот же переход может быть выгодным на пустой карте и невыгодным, когда рядом появился удобный обход.

STEP 05 Пересборка на ходу

Изменение мира затрагивает только свою область: пересчитываются островки и швы вокруг объекта, остальная карта не трогается. НПС в этот момент не замирает — он получает новый маршрут прямо в движении.

Нажмите в любом месте, чтобы закрыть
Sec 05 Дальше

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