Практический геймдизайн: создание ИИ для своей игры

Практический геймдизайн: создание ИИ для своей игры

О чем это

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

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

  • Придумать ИИ с интересным поведением
  • Очеловечить ИИ
  • Разработать алгоритм поведения
  • Детализировать алгоритм

Сегодня мы поговорим о первом из них.

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

Что вообще такое интеллект ?

Подумайте, кого вы обычно называете умными людьми. Мое мнение такое:

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

Умному ИИ не составит труда найти какого-то Джона Коннора. 
Умному ИИ не составит труда найти какого-то Джона Коннора. 

Но просто получить информацию недостаточно, нужно отреагировать. Принять правильное решение. Чем решение эффективнее, тем оно умнее.

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

Получается, что наделить бота интеллектом - значит дать ему способность действовать, адекватно ситуации, в которой он находится.

Тут перед нами возникает первая проблема и вопрос в создании ИИ.

Что такое адекватное поведение ?

Для большинства качество ИИ определяется его способностью противостоять лучшим из людей. Поэтому всех так взбудоражила победа AlphaGO над чемпионами по игре в Го. "Вот это интеллект!" - сказала общественность. Но в этой статье вы не найдете советов о том, как создать что-то подобное.

Кореец Ли Седоль в матче против AlphaGo
Кореец Ли Седоль в матче против AlphaGo

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

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

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

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

Как же сделать интересный ИИ?

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

Вы сейчас разрабатываете игру? Вы знаете, какие навыки требуются для нее? Если нет, то самое время подумать об этом.

Поскольку мы говорим о шутерах, предлагаю выделить следующие навыки:

  • Мелкая моторика
  • Внимательность
  • Управление
  • Реакция
  • Принятие решений
В мультиплеерных шутерах так же нужно уметь остроумно оскорблять чужих родителей.
В мультиплеерных шутерах так же нужно уметь остроумно оскорблять чужих родителей.

С первыми четырьмя все ясно. Мелкая моторика - способность проводить тонкие манипуляции с геймпадом и мышью. Управление - умение "чувствовать" своего персонажа и грамотно им оперировать: быстро и аккуратно двигаться, переключаться между оружием, делать "распрыжку". Что такое реакция, и внимательность, известно всем.

Про принятие решений давайте скажем чуть больше.

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

Практический геймдизайн: создание ИИ для своей игры

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

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

Слева вверху - FPS, то есть шутеры от первого лица. В них мы принимаем самые простые решения, но с чудовищной скоростью.

В Civilization с самого начала нужно решить, в каком направлении развиваться всю игру: наука, война, религия, или культура.
В Civilization с самого начала нужно решить, в каком направлении развиваться всю игру: наука, война, религия, или культура.

Вопросы, которые задает нам шутер, почти риторические. Что делать, если рядом упала граната? Мы знаем ответ! Нужно лишь обработать какие-то минимальные входные данные (нотификатор гранаты висит на экране справа, значит двигаться нужно влево) - и бежать со всех ног.

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

Тактические шутеры, вроде Division - шажок по графику от FPS к TBS. Темп - медленнее, решения - сложнее.
Тактические шутеры, вроде Division - шажок по графику от FPS к TBS. Темп - медленнее, решения - сложнее.

После того, как мы определились с навыками, пора внедрить в ИИ поведение, которое заставит игрока их использовать.

Давайте рассмотрим как это сделать на примитивном примере.

Смотрим на практике

По этой ссылке можно скачать прототип top-down шутера.

Вот такой
Вот такой

Правила просты

  • Синяя штука - игрок
  • Оранжевые штуки- враги
  • Бегать на WASD
  • Целиться и стрелять мышью
  • Перезапустить фазу - SPACE

Кнопки 1-8 включают разные настройки поведения, которые иллюстрируют определенный уровень проработанности ИИ.

Запускайте прототип, и

Поехали!
Поехали!

Фаза 1

Нажмите кнопку "1", чтобы включить первую фазу. Для следующих фаз - соответствующие кнопки. Для фазы 2 - кнопку "2", и так далее.

На этой фазе бот имеет самое простое поведение. У него нет различных "состояний". Он всегда в состоянии атаки, всегда знает, где игрок. Он обучен преследовать игрока, если тот убегает, наводиться на него, и непрерывно стрелять.

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

Фаза 2

Поторопитесь открыть огонь! Теперь вы можете наносить урон своими выстрелами, как и ИИ-оппонент. Но игры все еще нет.

Почему? Потому, что за несколько секунд обоюдной стрельбы, враг гарантированно погибает. Если хотите убить его еще раз, нажмите SPACE.

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

Этому миру лично вы - такой смелый, такой ловкий стрелок ! - не нужны. С этим врагом справится и ваша бабушка.

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

Фаза 3

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

Это - момент истины. В предыдущей фазе для победы нужно было лишь зажать одну кнопку, и пуская слюни смотреть, как полоска здоровья ИИ непрерывно убывает. А теперь вы поменялись местами.

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

Наш ответ: беги.
Наш ответ: беги.

Фаза 4

Обратите внимание на появившиеся красные полоски, отражающие сектор стрельбы противника.

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

Начинайте двигаться по кругу вокруг противника. Вы увидите, что его прицел немного не успевает за вами. К чему это приводит?

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

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

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

Фаза 5

Включаем пятую фазу - и противник теперь тоже двигается.

Управление усложняется. Теперь центр круга, по которому нужно двигаться, все время меняется.

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

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

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

Фаза 6

Давайте снова выключим нанесение урона, чтобы спокойно посмотреть на ситуацию.

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

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

А что если научить их работать в группе?

Фаза 7

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

Что это дает нам? Цели игрока больше не формируют единое облако. Они рассеиваются, и ему приходится фокусироваться на каждой отдельно. Если им удается окружить его - их расположение приходится держать в голове, ведь поле обзора ограничено.

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

Так добавляя одну механику за другой, мы создаем геймплей. Создаем среду, в которой игроку нужно бороться за победу, применяя свои способности. И это примитивный TDS - какого геймплейного разнообразия можно было бы добиться в полноценном шутере?

Кстати, напишите пожалуйста в комментариях, если кто-то знает игру с таким же хорошим ИИ, как в F.E.A.R.  Странно, что многие годы спустя до сих пор никто не показал ничего убедительнее местных спецназовцев.
Кстати, напишите пожалуйста в комментариях, если кто-то знает игру с таким же хорошим ИИ, как в F.E.A.R.  Странно, что многие годы спустя до сих пор никто не показал ничего убедительнее местных спецназовцев.

Фаза 8 - отладка

Ранее в фазе 4 мы допустили ошибку. Мы позволили игроку "ломать" наш ИИ.

Такое происходит, когда поведение бота недостаточно проработано, и может быть эксплуатированно игроком.

В фазе 3 алгоритм прицеливания работает так: есть направление в котором расположен игрок, и есть текущее направление прицела. Текущее направление сдвигается к игроку со скоростью 0.7 градусов в кадр.

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

В фазе 8 скорость прицеливания подвешена на "резинку". Теперь она тем больше, чем больше разница между текущим направлением прицела, и направлением на игрока.

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

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

Практический геймдизайн: создание ИИ для своей игры

Вывод

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

  • Определить навыки, требующиеся для вашей игры
  • Придумать, какое поведение ИИ вынудит игрока использовать эти навыки
  • Подумать, как можно будет сломать ваш ИИ, и как этого избежать

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

6868
22 комментария

Почему мы играем в ладушки? Мы конкурируем за право называть себя самым ловким.

Всю жизнь считал ладушки кооперативной игрой про синхронизацию.

зачем ИИ человекоподобность,

"Правдоподобный" ИИ работает на иммерсивность - NPC ведут себя как свои прототипы в реальном мире.
Но в виртуальном мире человекоподобность - это бежать к цели по кратчайшей траектории, подпрыгивая. Такие NPC нам не нужны.

16

Но в виртуальном мире человекоподобность - это бежать к цели по кратчайшей траекторииИменно они доставляли больше всего проблем )

4

Но в виртуальном мире человекоподобность - это бежать к цели по кратчайшей траектории, подпрыгивая. Такие NPC нам не нужныВот уж точно. Бот должен быть правдоподобен с точки зрения игрового мира, а не нашего.

1

Судя по описанию геймплея, имелись в виду не совсем ладушки.

Не по теме абсолютно, но вот интересовало: а что, если сделать игру, где объекты-конкуренты строят свое поведение на простой нейронной сети с двумя слоями (входной и сразу выходной, чтоб не мучаться) с целью максимизации результата? Допустим, простенький экономический симулятор. Весы связям ставят сами сети. Какие тут могут быть подводные камни - не с точки геймплея, что это будет долго доходить до конца, а с точки технической?

1

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

1

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