04/07/2019

Создание ИИ сверхскоростных автомобилей с помощью Unreal Engine

Привет! Меня зовут Сэм Честер. Я — ведущий программист игры Dark Future: Blood Red States. Наш проект основан на классическом тайтле 1988 года от Games Workshop. Действие происходит на территории США в атмосфере антиутопии. Игрок управляет скоростными автомобилями наемников и уничтожает обезумевших бандитов на таких же мощных транспортных средствах.

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


В этой статье я расскажу, как Unreal Engine 4 помог нам разработать изящное решение для создания искусственного интеллекта правдоподобных противников. 

Принятие решений на скорости 200 км/ч

Искусственному интеллекту Dark Future предстояло решать следующие задачи:

  • Во-первых, благодаря ему транспортные средства должны были перемещаться по участку шоссе, часто заполненному мусором, автомобилями, крутыми поворотами, оврагами и т. д.
  • Затем это действие следовало выполнять в условиях высоких скоростей (подразумевается, например, скорость в 200 км/ч (124 миль/ч), когда все приходит в движение!)
  • Первые два пункта необходимо было осуществлять во время сражений с боевыми машинами игроков (т.е. параллельно ИИ должен был использовать установленные пулеметы, ракетные турели, мины и многое другое).
  • И, наконец, во время выполнения всего вышеперечисленного ИИ должен оставаться предсказуемым, чтобы позволить игроку выработать стратегию, не навевая при этом скуку или однообразие.

Несомненно, пугающий план!

Но прежде, чем приступить к решению этих задач, нужно было научить искусственный интеллект управлять автомобилем. Dark Future использует модифицированную версию кода Unreal Engine 4 для моделирования транспортных средств. Он реализуется с помощью программы PhysX. Поэтому автомобили имеют очень подробную модель управления. 

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

Таким образом, автомобилем можно управлять. Хорошо, “как” это работает? Все просто: дроссельная заслонка и руль имеют значение от -1 до +1. Отлично.

Уроки управления скоростным автомобилем, оснащенным лазерами

Размышляя над проблемами, мы осознали невозможность использования встроенной функциональности NavMesh искусственного интеллекта UE4. Эта технология идеальна для субъектов, совершающих разворот на месте. Однако подобная система не подходила нашим автомобилям. Нужен был способ, обеспечивающий правильное поведение рулевого управления.

Модель рулевого управления — отличный вариант для менее детализированных элементов. Тем не менее, когда более крупные объекты перемещаются по местности с его помощью, появляются проблемы. Код состоит из тысяч строк тесно связанных поведений. Они взаимодействуют друг с другом напрямую, чтобы выработать контекст для решений, достигающих поведения. По этой причине недочеты часто могут быть незаметны.

Абхишек Саги, будучи в то время нашим ведущим программистом, с помощью сборника Game AI Pro 2 смог найти выход из ситуации. Решение обнаружилось в главе под названием “Контекстное рулевое управление: регулируемое поведением рулевое управление в макромасштабе”. В своей статье Эндрю Фрай великолепно описывает решение, к которому пришла его команда при создании гоночной игры AAA уровня.

Не буду вдаваться в подробности о контекстном рулевом управлении (поскольку вы просто обязаны прочитать все в авторском блоге). Но коротко объясню. Контекстное управление в принципе аналогично реализации поведения управления. Благодаря ему ряд изолированных моделей поведения производит вычисления, которые впоследствии суммируются для получения результата.

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

Максимальное использование многопоточного режима

В связи с упомянутыми причинами мы приступили к прототипированию выбранного нами варианта, который назвали Системой Контекстного Поведения (Context Behavior System, CBS). Для этого мы запустили новый проект, используя шаблон Vehicle Advanced, набросали карту с некоторыми препятствиями и оборудовали машину комплектом дроссельной заслонки.

Затем написали быстрый и приблизительный CBS, используя только блюпринты. Этот прототип оказался невероятно огромным — слишком большим даже для скриншота. На рисунке ниже показан образец автомобиля. Он пытается сохранить движение по сплайну, на расстоянии преследуя цель и стараясь избежать столкновения с блоками. 

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

Отлично! Теперь, когда наши автомобили обладали рулевым управлением, мы взяли прототип из тестового проекта, импортировали его в Dark Future, подключили к машинам — и все стало прекрасно!

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

Однако мы нашли решение. Контекстное управление идеально подходит многопоточности. Оно обладает небольшими изолированными поведениями с заданными объемами данных, которые необходимы для обеспечения их контекста. Таким образом, используя многопоточный API UE4, мы разработали следующий способ. Набор данных каждого транспортного средства может быть сгенерирован в игровом потоке. Затем его можно выгрузить в рабочий поток, который будет пропускать данные через модель поведения, обрабатывать возвращенные контексты, вычислять конечный результат рулевого управления и передавать его обратно в транспортное средство. 

Теперь мы могли легко позволить себе 20 или 30 автомобилей на уровне. Они все выполняют прежний код. Однако стоимость метода значительно ниже в сравнении с затратами на CBS. Естественно, одновременное наличие на уровне 30 подробных, полностью смоделированных автомобилей требует других весьма затратных расходов. Не говоря уж о том, насколько сложно будет играть против 30 вьющихся вокруг вражеских автомобилей. Но иногда — “понты важнее денег”!

Использование CBS для навигации по системе определения поведения

После нескольких недель невероятно сложной работы наш искусственный интеллект способен… поворачивать налево и направо. И это прекрасно!

Теперь предстоит выяснить: куда он может пойти, кого он может преследовать, по какой дороге перемещаться, в кого стрелять, когда стрелять и т.д. Для этого мы обратились к системе UE4Behavior Tree (дерево поведения).

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

На тот момент, у нас было три модели поведения в CBS: 

  1. Избегание, которое отслеживает окружающее пространство, чтобы найти вещи, от которых нужно держаться подальше.
  2. Преследование, которое направляется к заданной точке.
  3. Движение по дороге, которое стремится… ну, вы поняли.

Написав ряд пользовательских Blueprint задач для выполнения искусственным интеллектом, я быстро смог применить CBS для ряда моментов.

Вне боевой ситуации мы деактивируем Преследование. При Движении по дороге предоставляем идеальный способ достижения нужной дороги (по которой передвигается цель). В процессе Избегания позволяем ИИ быть “осторожным” с препятствиями, увеличивая длину кривых. Во время боя мы просто активируем поведение Преследования и передаем ему местоположение необходимого автомобиля, а затем переходим к логике стрельбы из оружия в соответствующее время.

Кроме того, мы решили использовать Environment Query System (EQS). Это прямой способ запроса игровой среды и выполнения серии тестов по результатам. Чаще всего он используется вместе с навигационной системой. В этой ситуации можно запросить набор навигационных точек, проверить их расстояние и линию визирования. Мы написали пользовательский генератор запросов. Он ищет транспортные средства по заданной команде (игрок, враждебный ИИ, гражданский ИИ и т.д.), а также оценивает результаты на основе данных о расстоянии и направлении. 

Запросы EQS могут осуществляться для поиска одного результата или для возврата всех результатов. Таким образом, этот запрос может дублировать не только простое обнаружение противника, но также идеальный выбор цели. Более того, впечатляет разделение запросов EQS по времени. Они проводятся с помощью серии кадров. По этой причине можно запускать довольно сложные запросы без чрезмерного снижения производительности, если не нужны мгновенные результаты. 

Обучение искусственного интеллекта построению 

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

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

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

Этот способ также позволяет управлять формированием. Группа назначает конкретный автомобиль в роли ведущего, за которым следуют другие транспортные средства. Он указывает им цель по условному часовому циферблату (5 часов, 7 часов) и расстояние. Затем другие Водители запускают пользовательскую службу поддержки в своем Древе поведения. Она представляет собой функцию, которая работает на пользовательском тикрейте только при выполнении задачи в своей ветви Древа. Служба вычисляет идеальное местоположение и передает его поведению Преследование в CBS. 

Подобный метод позволил существенно разнообразить игровые ситуации. Построения идеально подходили для группирования автомобилей. Однако эти возможности были легко перенесены на Враждебные Формирования. Они просты в определении. Поэтому нам удалось создать большое количество заранее установленных формирований для использования в зависимости от типа транспортных средств в Группе и оружия.

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

На этом изображении продемонстрирована следующая ситуация: два автомобиля, управляемых ИИ (слева, внизу), пытаются окружить автомобиль игрока (в центре), а третье транспортное средство (за экраном), замыкает строй.

Завершение долгого пути

При создании Dark Future возникали действительно нестандартные задачи и проблемы. Но возможности UE4 помогли нам преодолеть самые трудные моменты. Мы закончили работу над игрой, которой действительно гордимся. Dark Future: Blood Red States вышла 16 мая. Более подробную информацию можно найти на нашей странице в Steam.

Оригинальный материал в блоге unrealengine.com

Recent Posts

ООО или ИП? Зачем, когда, как и почему?

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

Шейдер для эффекта возгорания

14/08/2019
Создаем комплексный эффект возгорания ядовитого газа от искры, который состоит из шейдера, системы партиклов и блюпринта.

Видеопродакшен в Unreal Engine 4

30/07/2019
Что скрывается за быстрым рендером, можно ли использовать игровые движки в видеопайплайне и к чему нужно готовиться при работе с движком.