Как мы искусственный интеллект пилили

2
Всем доброго времени суток!

При разработке игры GumGuy, над которой работаем мы с командой, возникла необходимость в написании искусственного интеллекта для четырех боссов, которых в рамках разработки игр называют неигровыми персонажами (Non-player character). Это такие персонажи, которые управляются программой.


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



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



Для босса обезьяны в GumGuy нужна была система, выполняющая действия одно за другим по заданному сценарию, и которую можно было создать достаточно быстро. Решением стало создание собственной системы. Язык программирования, на котором создана система и скрипты для уровня — C#, а движок для самой игры – Unity3D.
Схема действия системы команд следующая:
1) Каждая новая команда для выполнения наследуется от класса GameCommand и переопределяет методы Start и Update, отвечающие за инициализацию команды и за ее обновление;



2) Затем команды группируются с помощью объекта класса CommandsPacket, который регулирует последовательность их выполнения;



3) Созданные пакеты команд передаются объекту класса CommandsQueue. Этот класс отвечает за обновление пакетов команд и связывает созданную систему с движком Unity3D.



Вот некоторые из команд, которые используются на уровне с боссом этой игры:
— MonkeyGoTo — идти к заданной точке на этаже, чтобы потом выполнить какое-то другое действие;


MonkeyThrowBox — бросить ящик в направлении игрока, чтобы он мог уклониться от него;


MonkeyThrowBanana — бросить бананы в сторону, чтобы они пролетели сквозь боковые трубы к игроку, и он подпрыгнул, избежав столкновения;



MonkeyJump — подпрыгнуть на месте, чтобы сбросить ящики или балки вниз;


MonkeyFallBox — сбросить ящики при приземлении после прыжка;



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



Скриншоты были сделаны специально для этой статьи с целью демонстрации действий босса и не содержат финальную версию текстур и полную красоту уровней.

Рассмотрим преимущества и недостатки созданной системы
Преимущества:
— Не обязательно создавать состояния для контролируемого объекта
— Система быстро интегрируется в проект
— Созданные команды можно использовать повторно
— Есть возможность приостанавливать выполнение пакета команд
— Можно создавать новые пакеты команд в процессе игры и добавлять их на выполнение
Недостатки:
— Недостаточная гибкость при изменении условий с необходимостью выполнения другого набора команд (текущий пакет просто приостанавливается, даже если он уже не нужен)
— Рост количества объектов для одной команды при использовании различных входных данных
— Часто метод Start команды остается пустым
Созданная система позволяет с легкостью конструировать насыщенные и динамичные сцены, использовать повторно созданные команды и применять их не только к неигровым персонажам, но и к другим объектам на сцене. Благодаря этому построен целый игровой уровень в реальном проекте.

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

Если кому интересно — вот наши, пока-что небольшие, сообщества: VK,FaceBook, Twitter, Instagram!
  • +7

Комментарии (4)

0
подобная система была: и у хитри в блоге, и тут очень давно, и у карлова в блоге, и у карлова в движке( Anthill), это если кто то будет искать её реализацию на as3. не мучайтесь все написано и придумано за вас. Автор спасибо за статью. Подход основан на шаблоне «состояние» и по этому «Часто метод Start команды остается пустым», обычное дело.
+3
Можно я чуть-чуть занудства вкину? :)

То, что описано — это не искусственный интеллект, это автоматика. Отличительная черта — формализуемость.
При решении же задачи именно ИИ, даже простого, обычно требуется решать следующие под-задачи, которые трудно формализуемы при попытке решить «в лоб»:
1. Задача анализа игровой ситуации (которая, порой, сама по себе может быть сложной, особенно если вдруг связана с распознаванием «образов»);
2. Задача принятия решений.
Принятие решений происходит не в развилках дерева и не по кругу, а в результате взвешивания массы факторов, полученых в блоке анализа ситуации. Вплоть до того, что сердцевиной «принимателя решений» становится нейросеть. И еще одна нейросеть в анализаторе :)

С другой стороны, для реализации боссов в играх все это, обычно, не нужно. Босс как раз должен предсказуемые паттерны поведения реализовывать, чтобы игрок мог победить босса путем того, что запомнил паттерны. Не забываем, что задача врагов в играх — не наказать игрока, а наоборот — дать себя победить. ;)
  • ADF
  • ADF
0
Ууу, помню (а точнее нифига не помню) в универе проходили графы, нейросети… специальность «Искусственный интеллект» (защита инф-ии) того требовала. В итоге, диплом так и не получил :)
0
Учебу бросили? Или забили?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.