Как мы искусственный интеллект пилили / Разработка / Блоги независимых разработчиков игр

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту
Архив новостей

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


При разработке игры 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!


Источник: gamedevblogs.ru

Комментарии: