ИИ для игр на Unity. Какой подход выбрать?

Я уже писал об искусственном интеллекте в играх. Теперь пришло время развить эту тему, и подробнее поговорить об ИИ для игр на Unity и алгоритмах обеспечения поведения игровых персонажей. Дальше, говоря о них, я буду использовать термин «АОП». Вообще, для этого есть термин behaviour-алгоритмы («behaviour» — «поведение» по-английски, MonoBehaviour, собственно, именно поэтому так и называется), но, как раз таки чтобы не путать их с MonoBehaviour, я называю их АОП.

Для начала, удивлю юных падаванов инди-геймдева, наворочанные системы ИИ, в которых нужны более-менее сложные конечные автоматы и нейросети, в играх не используются практически никогда. Это просто не нужно. Также, обычно не существует какого-то единого и универсального MonoBehaviour-скрипта «SuperDuperAI.cs», который бы «сразу» давал бы боту «разум», и не существует универсальной методики его разработки.

Постановка задачи.

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

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

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

Типы АОП.

Физика, частицы, шейдеры и анимации. Вы будете шокированы, но примерно в 25% задач для того чтобы обеспечить поведение того или иного игрового объекта, в Unity вам не нужно ничего писать. Используйте физику и анимации Unity, события кнопок, и так далее. Партиклы добавят зрелищности. Также, изучайте новый Shader Graph, он позволяет очень эффектно менять внешний вид объекта без лишних скриптов. (У меня вот руки пока не дошли, но на следующих выходных сяду с ним поиграться!) Недостаток этого подхода очевиден — многие вещи с помощью только встроенных средств Unity сделать невозможно.

Простые скрипты. Простой скрипт в скроллере или платформере, говорящий цветку плеваться шариками при приближении главного героя — тоже ИИ. В 50% случаев в типичных играх на Unity таких скриптов достаточно для решения задачи. Пользуйтесь наследованием и другими возможностями ООП, а так же возможностями Unity по анимации, чтобы уменьшать себе количество работы, и обеспечьте гейм-дизайнерам удобные настройки — и будет вам девелоперское счастье. (И это относится и к гораздо более сложным задачам чем управление простым мобом. Например, применяя ECS — рекомендую LeoECS — вы можете реально простым скриптом управлять целыми армиями мобов!)

Ролевая система. Тоже, возможно, вызову у вас удивление, но тем не менее, ролевая система с привязанным к ней ГСЧ — тоже ИИ, причём очень удобный для разработчика и геймдизов. Достаточно просто подвести монстра (по гексам) к персонажу игрока на радиус саггривания, включить боевой режим, и дальше начинает работать ролевая система — только успевай подключать анимации. Такие АОП имеют единственный недостаток — большинство распространённых ролевых систем пришли из настольных игр и приспособлены к работе в пошаговом режиме, поэтому для работы в real time их потребуется править.

Конечные автоматы. В англоязычной литературе они называются state machine. Этот тип АОП используется относительно редко. Основная область его применения — обеспечение поведения «разумных» ботов в высокобюджетных играх, где требуется обеспечить «реалистичное» поведение (именно поведение) персонажей, и это уже не для всех. Они довольно сложны благодаря своей комплексности — трудно отслеживать многочисленные возникающие связи. В Unity их можно реализовывать различными способами, например, через скрипт или состояния аниматора. Также существуют и сторонние реализации конечных автоматов для Unity, например Visual State Machine или Playmaker.

Алгоритмы ТАУ (теории автоматического управления). Этот тип АОП не используется практически никогда, и это уже совсем не для всех. ТАУ — это фильтры Калмана, PID-регуляторы, цепи Маркова и много злобного и неприветливого матана. Чаще всего, для геймдева это всё дорого и не нужно. Но если вам действительно нужны реально злые и меткие турели, устойчиво летающие самолёты в симуляторах, автопилоты, хорошие самонаводящиеся ракеты и тому подобные «технические» вещи, то это решается именно через ТАУ. Применения ТАУ в коммерческом геймдеве я не видел никогда, а в своих проектах применял всего два раза и для очень узкой задачи (обеспечения быстрой и точной стрельбы), просто чтобы доказать самому себе что я умею

Нейросети и алгоритмы машинного обучения. Эти типы АОП применяются в геймдеве исключительно редко и обычно для решения каких-то частных, нишевых задач (кроме тех случаев когда на их основе строятся features игры). Преимущество нейросетей — их можно заставить самообучаться и тем самым вывести из процесса разработки игры долгий период отладки АОП. Недостаток нейросетей — плохая настраиваемость и отсутствие гарантии повторяемости результата. Обычно их используют для автоматизации каких-то продолжительных процессов в реальном времени, которые излишне геморрно реализовывать через алгоритмы ТАУ, например, для управления самолётом в симуляторе. Можно попытаться использовать нейросети и для управления игровым поведением сложного бота, но я не видел успешных примеров того чтобы нейросеть годно обеспечивала высокоуровневое управление в игре. То есть бот-то будет хорошо делать то чему его научили, но вот настраивать его геймдизам будет ну очень неудобно! В Unity нейросети представлены штатным пакетом Unity Machine Learning Agents, который обеспечивает интеграцию в Unity TensorFlow. В своей практике я так же использовал нейросетевые библиотеки от AForge, правда, сейчас они менее удобны чем ML Agents.

Что выбрать?

Подходите к проектированию игрового ИИ комплексно. С одной стороны, вам нужно обеспечить геймдизам удобные и простые средства конфигурирования поведения вашего внутриигрового зверья. С другой стороны, вам нужно уложиться в сроки и, будем уж говорить прямо, не перетрудиться. Также не забывайте что геймдизы — не разработчики, у них своих сложностей выше головы. Поэтому везде где возможно, применяйте наиболее простые решения. Для простых игр будет оптимальным применение возможностей анимации Unity и набора простых скриптов. Для игр сложнее можно, в зависимости от жанра игры, для обеспечения сложных поведений, добавлять к этой комбинации либо ролевую систему, либо конечные автоматы. Браться за алгоритмы ТАУ или нейросетевой ИИ в играх обычно не имеет смысла.

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