Игровой ИИ
May 14, 2024

Игровой ИИ

Современные Игры - это огромные и сложные механизмы, состоящие из множества подсистем и логик. Игровой ИИ один из таких систем. Я решил немного рассказать про то, как устроен игровой ИИ и какие инструменты можно использовать, чтобы создать интересных NPC. Тема достаточно большая, поэтому будет разбита на несколько частей, так что подписывайтесь на мой канал, чтобы не пропустить следующую часть. Чаще всего мы будем использовать Unreal 5 для примеров логики и модулей, но данный материал будет полезен для разработки на любом движке.

Для начала надо разобраться, из чего состоит игровой ИИ в современных играх.

Можно выделить две большие часть ИИ: модуль контроллера и модуль поведения.

Контроллер

Вкратце о контроллере. В контроллер входит все, что не выбирает поведение, а отвечает за выполнение поведения.

Для начала, стоит выделить то, чем управляет ИИ - это может быть персонаж, техника, или некоторая абстрактная система. Объект, управляемый ИИ, будем называть Пешкой. Пешка должна быть способна совершать поведение, заложенное ИИ. Простейший пример пешки - это Актор, способный перемещаться в игровом мире.

Пример из  Unreal:

Пешка - это APawn или ACharacter (унаследованный от  APawn), который способен передвигаться по карте и играть анимации.

Общепринятым подходом ИИ разделен с Пешкой. В Unreal это отдельный Actor, а, например, для Unity - отдельный GameObject. Такой подход имеет несколько преимуществ:

  1. Разные пешки могут использовать один и тот же контроллер, и наоборот - одинаковые пешки могут управляться разными контроллерами, повышая разнообразие геймплея
  2. Контроллеры инкапсулированы от пешек, а пешки - от контроллеров, что вынуждает писать абстрактные стабильные ИИ
  3. Появляется простой способ улучшения производительности и оптимизации: Пешки и ИИ не связаны, и частота их обновлений никак не связаны.

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

Пример из  Unreal:

Навигация в Unreal - это UPathFollowingComponent. Это Detour /Recast для построения и использования навмеша.Так же к навигации можно отнести всю систему EQS.

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

Пример из  Unreal:

Рецепторы - это UAIPerceptionComponent. Это достаточно прямолинейная система, основанная на sense. Эти модули отвечают за генерацию событий, которые уже обрабатывает сам контроллер.

Система Таргетирования. Если речь идет о боевом NPC или NPC, который взаимодействует с объектами в мире, то такому ИИ надо выбирать цель для взаимодействия или боя. Обычно такая логика вынесена в отдельный компонент, который сортирует цели с помощью некоторых правил и весов. Чаще всего модули поведения контролируют когда и из каких целей совершать выбор, и по каким правилам. Сама же логика выбора выполняется вне модуля поведения.

Поведение

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

Примером таких моделей может служить FSM ( конечный автомат) или Behaviour tree (дерево поведений). Поведения могут варьироваться от простого ”подойти к точке интереса”, до описания всего боя или цикла жизни персонажа.

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

  1. Модель должна быть абстрактная. Она не должна быть привязана к конкретным пешкам, контроллерам или другим модулям ИИ. Это должна быть система, сама в себе принимающая некоторые решения и выбирающая тип поведения. Как реализовать конкретное поведение - это, чаще всего, вопрос к пешке, т.к. система поведения не должна отвечать за это, но при этом система может различать некоторые характеристики конкретных действий или поведений (например мгновенное ли это  действие или оно  занимает некоторое время)
  2. Модель должна уметь анализировать состояние игры и агента, и уметь принимать сигналы или события из внешних систем.
  3. Модель должна быть единственной сущностью в ИИ, которая принимает решение и выбирает поведение. Только одна сущность должна быть ответственна за то, что сейчас делает агент ИИ. Если таких сущностей несколько - возникают ненужные сложности с выбором приоритета и блокировкой поведений.
  4. Модель должна уметь отправлять сигналы и команды другим частям ИИ или Пешке напрямую. Но стоит отметить, что это не должно нарушать правило абстракции модели. Сигналы и команды должны быть общими и не привязаны к конкретному типу Пешки или контроллеру.

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

  1. Модуль памяти. Память - это некоторое абстрактное хранилище или часть логики модели поведения, сохраняющая данные между итерациями выбора поведений и исполнения выбранного поведения  Это позволяет улучшить качество ИИ и упростить саму логику ИИ.
  2. Разбиение на логические тики. С учетом того, что любая модель поведения используется в реальной игре, оптимизация всегда будет играть важную роль. Чаще всего, любые системы поведения умеют дробить свою логику на некоторые конечные и короткие интервалы, которые можно выполнять в разные кадры, тем самым улучшив производительность ИИ
  3. Чаще всего такие системы тяготеют к тому, чтобы быть data driven. Т.е. код создает набор логических кубиков, из которых, с помощью данных и настроек, собирается готовый экземпляр ИИ, способный принимать конкретные решения и выполнять конкретные поведения.

В следующий раз я подробнее расскажу про конкретную реализацию модуля поведения: FSM или конечный автомат.