Блог xyz school

Как работает искусственный интеллект врагов при групповом бое

Привет, меня зовут Сергей Праздничов, я — геймдизайнер и преподаватель курса GAMEDESIGN в XYZ. Я работал над Rainbow Six Siege и другими известными AAA-проектами.

Сегодня я расскажу о том, как работает логика врагов в групповых битвах. Этим мне доводилось заниматься на двух проектах; плюс параллельно с этим я исследовал другие игры, — чтобы разобраться, как в них устроена эта система.

Для интересного сражения мало просто выпустить противников на игрока — разработчики часто регулируют искусственный интеллект мобов особым образом, чтобы бои получились более захватывающими и интересными. О тонкостях настройки интеллекта врагов и пойдёт речь в этом материале.

Автор: Сергей Праздничнов

Особенности групповых сражений

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

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

Групповой бой можно разделить на два основных элемента. Первый — как мобы организуются вокруг игрока, то есть их расстановка. Второй — способы организации их атак.

Позиционирование врагов

Во многих играх есть множество слабых противников и один сильный герой, который их с лёгкостью побеждает. В этих играх враги гармонично располагаются вокруг игрока, — и не просто так. Чаще всего вокруг игрока (иногда — вокруг моба) строится область определённой формы — например, это может быть круг. В эту форму входит заданное количество точек, — обычно не очень большое.

У каждой точки в этой форме есть свой вес или приоритет. Когда AI врага занимает точку, то ей выставляется самый низкий приоритет. Это отправляет другим мобам сигнал о том, что точка занята. Чем дальше точки вокруг AI, тем выше приоритет. Условно говоря, интеллект врага не видит других мобов, но распознаёт занятое место. Поэтому враг выбирает позицию, которая наиболее удалена от занятой точки. При таком раскладе мобы вокруг игрока располагаются равномерно и оптимально.
Важно учитывать угол обзора и тип камеры в игре, — от первого или от третьего она лица. Проанализировав некоторые игры, можно заметить, что мобы всегда стараются быть в поле зрения камеры. Это один из негласных принципов боевого дизайна, определяющий честность боя. Ведь вряд ли тебе захочется получить удар в затылок, когда ты этого не видишь, — ты не готов, а сигналов никаких нет.

Отсюда возникают сложности при организации группового боя в играх от первого лица. Взять, к примеру, Dying Light. Там довольно трудно было организовать бой с людьми так, чтобы они все размещались перед лицом игрока, — ведь угол обзора намного меньше, чем в играх от третьего лица. Ты не видишь, что находится сбоку или сзади.
Если противников в игре от третьего лица слишком много, то разработчики тоже строят массив точек, но размещают врагов уже по двум или более областям-орбитам. Тогда игрока атакуют лишь мобы с ближней орбиты.
Конечно, такой бой может получиться немного скучным: чтобы это предотвратить, враги меняются орбитами, переходя из ближней в дальнюю, или наоборот. Это увеличивает разнообразие противников в бою.
Особенно это актуально для врагов разных архетипов. Условно говоря, один противник может быть с мечом, а другой — с копьём. Если они перемещаются, то получится интересный геймплей. Но если стоят на месте, то один будет всё время ждать, когда убьют другого, — это не очень здорово. О подобном перемещении рассказывали, например, разработчики Devil May Cry.
Как AI выбирает момент для атаки?

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

Впрочем, иногда такой способ обусловлен типом игры или типом AI. Так, в Days Gone орда атакует тебя одновременно, чтобы показать, что игрок сейчас делает слишком рискованные шаги. Одновременная атака со стороны зомби работает как наказание для игрока, — это сделано специально.
В остальных случаях, если мы хотим получить грамотно поставленный бой, то приходится прибегать к некоторым ухищрениям. Тут важную роль играет постановка, — прямо как в кино. Поскольку каждый противник имеет свой шаблон поведения, прописанный сценарий боя и паттерны атак, то часть атак может быть завязана на таймерах.

Допустим, круговую атаку враг будет применять раз в несколько секунд. И поскольку у многих противников в бою эти кулдауны банально не совпадают, то высока вероятность, что противники не будут атаковать все и сразу. То есть, можно поставить вокруг игрока пять врагов с таймерами и разнести атаки по времени. Тогда сначала ударит первый и запустит кулдаун, затем второй — и так далее. Для подобного метода врагам не нужно знать о существовании друг друга, — это самый простой вариант.
Есть способ поинтереснее — таргетлок или блокировка цели. Мобы всё ещё не видят друг друга, но кто первый атаковал, тот ставит на игрока маркер, — особую логическую отметку. Другие мобы видят, что этот маркер появился. А в логике AI прописано, что если на игроке стоит отметка, то атаковать его не нужно.

Это работает как туалет в самолёте: загорается красный — значит «занято», и при этом ты не знаешь, кто внутри. AI тоже не важно, «кто внутри», — ведь главное, что цель занята.
Сам маркер можно сделать счётчиком, не ограничивая его единицей. Тогда, скажем, если на игроке будет стоять маркер «единица», то его может атаковать ещё один враг, а если «двойка», — то никто атаковать дополнительно не будет. Классический пример — The Last of Us. В ней битвы построены в форматах «один на один» или «один на два». Во второй части есть и более масштабные битвы, но они уже больше работают на напряжение и саспенс.
Мобы видят, что маркер есть, и не атакуют. Когда атака проходит, то AI как бы снимает свой маркер. Теперь маркер может наложить кто-то другой. Сделано это для того, чтобы один и тот же враг не атаковал постоянно. Сам игрок не успевает ничего заметить, ведь маркер перманентно сменяется. Для него получается просто интересная битва.

Следующий тип — слоты вокруг игрока. Вокруг игрока задаётся некоторое количество доступных для боя слотов. Каждый противник при этом «весит» определённое количество ячеек. Например, у игрока пять слотов, а в игре есть лёгкий мечник, тяжелый враг с щитом и командир отряда. Каждый из них может занимать определённое количество слотов. Мечник — один, враг со щитом — два, командир — четыре, а босс — пять. Когда противник вступает в бой с игроком, то занимает отведённые ему слоты. И если предел, который указан на игроке, достигнут, другие мобы просто не могут атаковать.

Это удобная и гибкая система. Она настраивается как со стороны игрока, так и со стороны врагов. Можно выставить противнику его «вес», то есть обозначить важность для этого боя. Но и игроку можно настроить число доступных слотов — так появляется дополнительный способ регулировки сложности.

К примеру, Hard будет отличаться от Easy разным количеством слотов на игроке. На Easy — пять слотов для врагов, на Hard — десять. Тут нужно быть аккуратным, чтобы не перегнуть. Баланс в любом случае придёт только вместе с плейтестами.
Последний тип, который я затрону, — это файт-директор (или глобальный AI, или планировщик). На разных проектах его называют по-разному. Например, в Horizon Zero Dawn был HTN — планировщик сети иерархических задач (hierarchical task network planner). А в F.E.A.R. она так и называлась — файт-директор.

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

Когда начинается битва, глобальный планировщик может отдавать приказы как отдельным мобам, так и группам. В той же Horizon Zero Dawn бывало, что если напасть на группу роботов, то часть из них убегала, часть вступала в битву, а оставшиеся вообще творили нечто необычное.
Такая система — самая глобальная и тяжёлая. Она показывает впечатляющий результат, но на её создание требуется очень много усилий. Ведь тут нужно учитывать логику не только каждого отдельного AI в игре, но и отслеживать более глобальные события на уровне, а уже исходя из этой информации распределять врагов.

Поэтому для игр в духе Spider-Man или серии Batman Arkham характерен «киношный» подход: когда вокруг тебя стоит и пританцовывает куча противников, а нападает максимум парочка из них. Так создаются красивые, но не слишком реалистичные боевые ситуации.
Система файт-директора для таких игр не очень актуальна, проще решить всё слотами, маркерами или таймерами. Глобальный планировщик хорош для игр с открытым миром, в которых бои — не камерные и не постановочные. Тогда планировщик позволяет создавать более реалистичные ситуации.

Итог

В итоге у нас есть четыре основных типа систем AI врагов: таймеры, маркеры над целью, слоты и планировщики.

Нужно ещё понимать, что геймдизайна в вакууме не существует. Например, возьмём игру про супергероя, — те же Batman и Spider-Man. Там враги зачастую заметно слабее игрока. Сама хореография и постановка боя созданы так, чтобы игрок мог красиво «раскидывать» мобов. А чтобы их красиво раскидывать, они должны нападать по очереди, а не всем скопом.
Такая система есть и в The Witcher 3, и в Assassin's Creed, — противники активно ходят вокруг тебя, меняя положение. Я не вижу в этом проблемы. Ключевой вопрос тут — насколько хорошо это сделано. Если противник стоит на месте, ничего не делая, и игрок это замечает, то это плохой подход; а если игрок убеждён, что сражается со всей толпой одновременно — хороший.

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

А в играх допускаются условности. В конечном счёте, задача игры — красиво поддаться игроку: для этого разработчики и создают все эти системы. Главное, — чтобы игрок не почувствовал себя обманутым, и чтобы ему не показалось, что его держат за дурачка.
***
Хочешь разобраться в тонкостях геймдизайна ААА-игр и научиться самостоятельно придумывать и воплощать в жизнь механики? Тогда записывайся на курс Сергея ПраздничноваGAMEDESIGN. Он начнётся 1 октября, а пока есть возможность приобрести его со скидкой.

Все подробности по ссылке: https://www.school-xyz.com/gamedesign
Понравилась статья?
Хочешь получать лучшие статьи
от XyZ раз в неделю?
Подпишись на рассылку XyZ
Нажимая на кнопку, вы соглашаетесь с условиями обработки данных