Искусственный интеллект в файтинге Shadow Fight 3

в 14:01, , рубрики: Banzai Games, Nekki, Shadow Fight 3, Блог компании Banzai Games, искусственный интеллект, машинное обучение, разработка игр

Искусственный интеллект в файтинге Shadow Fight 3 - 1

Геймдизайнеры регулярно сталкиваются с задачей создать интересный ИИ. Этот процесс может быть как относительно простым, так и крайне сложным, в зависимости от нужд проекта и целей, которые вы преследуете. Старший геймдизайнер Banzai Games Михаил Драговаловский рассказал про опыт работы над ИИ для популярного мобильного файтинга Shadow Fight 3.

Отличие SF3 от большинства файтингов

Серия Shadow Fight сразу создавалась с рядом фичей, которые отличают ее от многих файтингов:

  • Наличие автоблоков. Если персонаж просто передвигается и не атакует, он автоматически блокирует любую обычную атаку противника;
  • Более медленный темп и анимации. Ставка на тактическую составляющую: игрок должен успеть понять, какой удар наносит противник и какую атаку выбрать, чтобы успешно контратаковать. Это позволило нам дать игроку возможность рассмотреть анимации, которые мы стараемся делать максимально красивыми и физичными;
  • Честные коллизии. Это создает очень крутые ситуации, в которых один персонаж красиво уклоняется от атаки второго и сам наносит удар в ответ, а благодаря плавным анимациям игрок успевает все рассмотреть;
  • Теневая форма. Когда заполняется специальная шкала, игрок может войти в теневую форму и провести несколько зрелищных приемов, которые пробивают блок противника

image

ИИ в предыдущих играх серии


Мы уже работали над ИИ в нашем предыдущем файтинге — Shadow Fight 2, но из-за перехода в 3D, появления коллизий между игроками и добавления теневой формы мы смогли перенести только часть логики ИИ, а остальное пришлось создавать заново.

С чего стоит начать работу над ИИ?


Если вы не делаете бота с помощью машинного обучения, я бы выделил два капитанских подхода:

  1. Сделать слабого бота, потом усилить до нужного уровня новыми фичами;
  2. Сделать непобедимого бота и потом ослаблять.

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

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

image

Как устроен наш ИИ?


Триггеры или правила поведения

  • В основе лежат правила, в рамках которых бот совершает рандомные действия. Эту систему правил мы называем триггерами. Например:
  • Бот смотрит на расстояние между собой и игроком и отбирает только те удары, которыми может попасть, а затем наносит рандомный из этих ударов;
  • Бот не спамит метательным оружием;
  • Бот получает в лоб метательным оружием врага, а затем начинает гарантированно уклоняться в течении какого-то времени;
  • И еще куча вещей, которые бот должен или не должен делать…

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

image

Принятие решений

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

  1. Враг ждет;
  2. Враг атакует.

Решения тоже два:

  1. Нужно бить, когда гарантированно попадешь;
  2. Нужно блокировать, когда по тебе бьют и ты не можешь контратаковать.

Получается, что для победы ИИ должен прерывать вражеские удары своими контратаками, либо блокировать, если не может их прервать.

image

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

Таблицы коллизий

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

Если более подробно: мы запускаем удар мечом и одновременно с этим удар катаной, а затем смотрим, кто по кому попадет. Делаем эту процедуру для всех ударов в игре, на всех дистанциях и с задержками в разное количество кадров (запустил удар мечом, а противник через N кадров — удар катаной). Все результаты записываем в таблицы. Делаем мы подобную процедуру перед каждым обновлением и кладем получившиеся файлы после непростого алгоритма сжатия в готовом виде в билд, чтобы не съедать ресурсы девайса в рантайме. У игрока в клиенте уже есть список всех исходов, а значит ИИ знает, какой удар может сконтрить любой удар игрока на конкретной дистанции, либо понять, что прямо сейчас оптимальный выход — блокировать атаку.

image

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

Выбор дистанции и правильного удара

Внимательный и интеллигентный читатель скажет: “Стопэ!!! Зачему вообще атаковать самому, если противник всегда в автоблоке? Надо ждать удара врага и наказывать его быстрым ударом, который прервет его атаку!”. Да, это так, но бот, который не двигается и не атакует без действий игрока, выглядит как минимум странно. ИИ должен уметь выбирать эффективные удары для начала атаки, даже если оптимальная стратегия — играть от контратак. Для этого мы разработали систему выбора выгодной дистанции и ударов.

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

  • Собираем статистику всех ударов игрока;
  • Смотрим, на какой дистанции у нас больше всего эффективных контратак против типичных его ударов;
  • Передаем эту дистанцию боту и заставляем его держаться на ней на протяжении всего боя.

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

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

Обида и прощение

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

Суть концепции заложена в названии: бот обижается на удары игрока, которые тот повторяет из раза в раз. Обида — это счётчик, который уменьшает шанс на принятие неоптимального решения и увеличивает шанс, что ИИ проведет идеальную контратаку.

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

image

Если мы хотим сделать сложного бота, мы уменьшаем скорость прощения, а также ставим высокий уровень стартовой обиды, если хотим сделать слабого бота, все наоборот.

Задержка

У каждого бота в SF3 есть задержка при принятии решения. Это параметр, который заставляет бота делать паузу в N кадров перед выбором варианта действия. Полезная штука — позволяет создать видимость, что оппонент думает. Чем более простого бота мы хотим сделать, тем больше задержку ему выставляем.

Проверка условий

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

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

image

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

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

Результат


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

image

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

На это решение нас наталкивает несколько вещей:

  1. Мы разрабатываем новый PvP файтинг — Shadow Fight: Arena. Его особенность — очень разные по тактике герои с разными способностями и механиками. Сделать реалистичного бота в этих условиях в разы сложнее, чем в случае с SF3;
  2. У нас уже есть положительный опыт использования нейросети для решения аниматорских задач в нашем продукте Cascadeur. Это программа для создания реалистичной анимации, которую мы используем для всех наших игр;
  3. Хотим собрать команду грамотных специалистов по ML, чтобы дальше наращивать экспертизу в этой области и использовать ее для улучшения Cascadeur и наших игр.

В команду Banzai Games требуется Deep learning researcher. Подробнее о вакансии можно прочитать здесь.

Автор: BanzaiGames

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js