Беги, да не спотыкайся: как устроен ИИ в Death Stranding
Пересечённая местность оказалась головной болью не только для игроков, но и для самих разработчиков.
ИИ-программист Kojima Productions Эрик Джонсон выступил с докладом на GDC 2021, в ходе которого рассказал, как устроен искусственный интеллект в Death Stranding. Большего всего внимания Джонсон уделил вопросам построения навигационной сетки и поиска пути в отрытом мире. Мы выбрали из лекции главное.
Окружение Death Stranding наполнено множеством препятствий и труднопроходимых зон, которые представляют из себя проблему не только для игрока, но и для NPC. Для разработчиков было важно, чтобы ИИ адекватно воспринимал все неровности вокруг себя и корректно перемещался по миру, но при этом продолжал представлять опасность для игрока.
В Death Stranding есть несколько типов противников, каждый из которых имеет свои особенности поведения. Есть МУЛы — их цель заключается в том, чтобы отобрать посылки у главного героя, поэтому они не используют огнестрельное оружие. Вторая группировка — террористы, которые пытаются убить Сэма. Они активно пользуются укрытиями и огнестрелом. Третий тип — мини-боссы, во время схваток с которыми ландшафт окружения кардинально преображается. Ещё есть BT, но они малоподвижны, поэтому их можно не рассматривать в контексте перемещения по миру.
Разработка ИИ шла постепенно: сначала авторы добавили врагам базовые функции, чтобы можно было опробовать геймплей, а лишь затем начали думать над тем, как поместить NPC в открытый мир.
Как противники используют навигационную сетку
Для передвижения по миру Death Stranding ИИ использует навигационную сетку (navmesh), состоящую из полигонов. Navmesh покрывает все поверхности, по которым могут передвигаться NPC. Если какой-то участок пространства не покрыт навигационной сеткой, то NPC не сможет зайти на него.
Одна из главных черт геймплея Death Stranding заключается в том, что игрок должен аккуратно выбирать свой маршрут: он должен избегать камней, о которые можно споткнуться, не залезать на скалы, с которых можно упасть, не идти через глубокую реку, течение которой может легко сбить персонажа с ног.
Разработчики стремились сделать так, чтобы NPC учитывали все эти особенности, а также умели преодолевать препятствия и избегать опасные участки.
Чтобы NPC понимали, где передвигаться безопасно, а где — нет, разработчики поделили все navmesh-полигоны на несколько групп: по голубым передвигаться просто, по жёлтым — сложнее, по красным — ещё сложнее. Соответственно, ИИ умеет распознавать труднопроходимые зоны, поэтому стремится их избегать.
С появлением системы Placement Painting поведение NPC стало более правдоподобным. Но вместе с этим появились и проблемы — поиск пути на столь детализированной навигационной сетке тратит много вычислительных ресурсов.
Как NPC ищут подходящий путь
Для процесса pathfinding разработчики использовали алгоритм A*, который занимается поиском оптимального и наименее трудозатратного маршрута, сравнивая «стоимость» разных путей. Так как в Death Stranding зона для поиска пути может быть очень большой, команда ограничила процесс 500 итерациями.
В итоге разработчики получили систему, в которой pathfinding оказался слишком ресурсоёмким, а сам поиск пути не всегда приводил к цели. Тогда команда поняла, что ИИ должен самостоятельно запускать генерацию маршрута, если ему это необходимо. Оставалось лишь понять, какие события будут триггерить поиск пути.
Есть два распространённых способа реализовать это решение — рейкаст и таймер, — но они оба не подходят. Рейкаст не подходит, потому что он реагирует на проблему слишком поздно, поэтому NPC постоянно опаздывал бы с запуском поиска пути. А таймер не подходит, потому что сложно задать универсальный интервал, который был бы эффективным во всех ситуациях. К тому же этот подход слишком ресурсоёмкий, а маршрут получается нестабильным.
Команда использовала таймер на ранних этапах разработки — система перезапускала процесс два раза в секунду и просто направляла NPC к цели, которая была на предыдущем прогоне.
Один из серьёзных багов этого подхода заключался в том, что во время движения NPC система могла находить новые пути. Из-за такой нестабильности был высокий риск того, что NPC не смогут адекватно передвигаться по пространству.
Команда поняла, что ей нужна система, которая:
- сможет итеративно находить путь, чтобы достичь цели (учитывая ограничение в 500 итераций);
- будет незамедлительно находить проблемы;
- сможет автоматически пересоздавать путь, но при этом делать это как можно реже.
Разработчики придумали систему для распознавания пяти ситуаций, в которых может потребоваться пересоздать путь.
В результате разработчики создали Event-Based Repathing систему, которая отвечала всем требованиям: она могла реагировать на самые распространённые проблемы, при которых нужно заново искать путь, но при этом делала это не слишком часто, чтобы не забирать вычислительные мощности.
Проблемы системы перезапуска поиска пути
Несмотря на свою эффективность, у новой системы поиска пути были свои проблемы. Но с большинством разработчикам удалось справиться. Интересно, что некоторые решения удалось найти в постах 2010 года в блоге Digesting Duck.
По словам Джонсона, основное ограничение всей этой системы возникло в ситуациях с резким перепадом высот. В такие моменты NPC приходится искать обходной путь, который может находиться намного дальше его возможностей по поиску пути.
Чтобы справиться с этим, разработчики использовали технологию движка Decima под названием AI Road Network. Её можно описать как сеть дорог, дополняющих систему поиска пути в Death Stranding: NPC могут переключаться на AI Road Network, если не могут найти маршрут при помощи базовой системы поиска пути.
Создание навигационной сетки для динамических объектов
В Death Stranding есть ситуации, когда навигационная сетка должна сгенерироваться для динамических объектов. Например, это происходит в моменты столкновения с мини-боссами: из земли появляются здания, на которые может забраться не только игрок, но и противник.
Динамические объекты встречаются и вне столкновений с мини-боссами. Большинство таких объектов помечаются на навигационной сетке как пропсы.
Использование лестниц и укрытий
Игрок использует лестницы, чтобы добраться до труднодоступных мест. Так как противники должны уметь забираться туда же, куда и Сэм, разработчики должны были придумать, как научить NPC залезать на лестницы. Команда начала с того, что посчитала все варианты использования лестниц.
В перестрелках противники используют систему укрытий, чтобы защититься от выстрелов игрока. Система автоматически подбирает подходящие места, измеряя длину потенциальных укрытий.
Джонсон отметил, что некоторые вещи так и не удалось реализовать в Death Stranding. Например, систему bidirectional pathfinding или процедурную расстановку точек для прыжков.