Чем занимаются разработчики игр с искусственным интеллектом и как им стать
7 июня 2022 г.Меня зовут Александр Пиндык, я ведущий инженер отдела искусственного интеллекта в студии Wargaming в Киеве. Более пяти лет наша команда занимается разработкой ИИ (искусственного интеллекта) для одной из самых популярных онлайн-игр — World of Tanks. Хочу подробнее рассказать о профессии ИИ-разработчика в разработке игр, специфике его работы и о том, как им стать.
Во-первых, давайте определим, что такое игровой ИИ. Если отойти от сухих определений из Википедии, игровой ИИ — это система, имитирующая поведение персонажа или игрока. В зависимости от жанра и цели игры в разработке ИИ используются разные технологии и подходы. Давайте рассмотрим основные типы игр и цели ИИ.
Игры, в которых цель ИИ — победить игрока-человека
Давайте посмотрим на игры, которые мы все знаем. Хорошим примером здесь могут быть шахматы и го. Этот тип игры может использовать искусственный интеллект на основе нейронных сетей. Поскольку основная цель ИИ — победить игрока любой ценой, ему не нужно имитировать поведение человека. Действия такого ИИ часто выглядят непонятными, а иногда даже пугающе неестественными. Даже сейчас человек не может победить ИИ (AlphaZero) в одних и тех же шахматах и го.
Помимо этих двух классических игр, эксперименты с подобным подходом продолжаются в карточных играх, таких как покер, и в соревновательных играх, таких как StarCraft и DOTA 2. Над созданием этого работают многие ученые и программисты из Google и OpenAI. Однако это, скорее всего, будет облачное решение, поскольку для обучения искусственного интеллекта требуется много ресурсов.
Этот подход не оправдан при разработке игр из-за его сложности и противоречивых целей, для которых используется ИИ.
Цель внутриигровой разработки обычно состоит не в том, чтобы победить игрока любой ценой. И не забывайте о серверных мощностях. Еще один минус такого подхода — необходимость заново обучать ИИ после внедрения новой механики.
Игры PVP
Это игры, основным циклом которых является противостояние игроков или команд друг с другом (игрок против игрока). Можно задаться вопросом, какова роль искусственного интеллекта в этом сценарии? Но есть несколько областей, где ИИ используется в таких играх:
* Боты для начинающих
Они используются как на начальной тренировке, так и в качестве противников на ранних стадиях игры. Если по навыкам игрока нет матчмейкера или когда невозможно сбалансировать команды, боты позволяют плавно повышать уровень сложности для игроков. И исключите частые проигрыши против игроков с гораздо лучшими навыками. Хорошими примерами являются режимы тренировки ботов в World of Tanks и Hearthstone.
* Запуск проекта или открытие новых игровых регионов
PUBG Mobile использовала такой трюк при запуске. Когда невозможно было собрать команды по 100 человек, боты бросились в бой. В режиме Battlefield 2042 на 128 игроков используются боты с 64 противниками. Когда сервер покрывает большую территорию с разными часовыми поясами, боты могут сгладить просадку онлайна для удаленных регионов. Например, когда один сервер покрывает Европу и Азию.
* Режим обучения
Она часто нужна в играх, которые вышли давно и в которых много профессиональных игроков, против которых сложно играть без хорошей подготовки. Кроме того, такие игры не всегда разделяют новичков и профи в матчмейкере, а игра с ботами становится чуть ли не единственным способом получить навык. Хорошим примером здесь может быть Escape from Tarkov. Играя с ботами, вы не сможете выполнять миссии, но в то же время не потеряете свое снаряжение, узнаете уровень, отработаете комбинации снаряжения и навыки стрельбы.
С точки зрения разработки такие игры должны иметь возможность точно настраивать сложность ИИ и отлаживать логику принятия решений ботами. Сам ИИ работает на игровом сервере. Команда разработчиков реализует поведение ботов максимально похожее на поведение человека, умеющего хорошо играть. По крайней мере, боты стараются быть похожими на таких игроков :grin:
Игры PVE
В основном цикле этих игр игрок взаимодействует с окружающей средой и ИИ (игрок против окружающей среды). Это могут быть как чисто однопользовательские офлайн-игры (Ведьмак 3), так и онлайн-ПВЕ (Genshin Impact), а также специальные события и режимы в ПВП-играх (Мирный-13 на Хеллоуин в World of Tanks). В таких играх у ИИ нет цели победить игрока любой ценой. Даже наоборот. Один отличный геймдизайнер сказал: «Главная цель ИИ — красиво сдаться». Чтобы игрок-человек мог получить положительные эмоции от победы, в данном случае ИИ является одним из элементов настройки сложности игры.
Балансируя между количеством врагов, их «толщиной» и умением играть, можно создать нужный уровень сложности и интереса для человека. Также, в зависимости от игры, будет увеличиваться или уменьшаться важность визуально логичного поведения ИИ-бота. В таких играх, как Genshin Impact, боты — просто пушечное мясо, и игрок не всегда обращает внимание на то, насколько логично они себя ведут.
Другой вариант при использовании ботов — для простых союзников и способностей игрока. Например, мобы в DOTA 2 довольно примитивны и имеют только одну цель — идти вперед и атаковать врага. Когда игра однопользовательская и оффлайн, ИИ чаще всего работает локально для игрока в клиенте. В случае с такими играми, как World of Tanks, на сервере работают режимы AI и PVE. Это необходимо, потому что игра онлайн, и все действия контролируются сервером. Он ограничивает ресурсы ЦП и ОЗУ, которые может использовать ИИ.
Одной из важнейших задач при разработке такого искусственного интеллекта является возможность создания привлекательных поведенческих сценариев для ботов. Например, игроки должны добраться до позиции, некоторое время оборонять ее, а получив подкрепление, перейти в атаку и победить всех врагов. Сценарий игрового ИИ может состоять из нескольких частей. В первой части боты слабые, что позволяет игрокам быстро добраться до нужной позиции. Затем боты, атакующие игроков, становятся сильнее и начинают использовать тактику, не позволяющую игрокам перейти в наступление раньше времени. После момента X боты допускают некоторые ошибки, что позволяет им визуально, без снижения сложности, дать игрокам преимущество. Осознав это, они перейдут в наступление и смогут победить.
Инструмент, помогающий в разработке игр
Помимо игрового процесса, искусственный интеллект помогает в разработке игр в нескольких областях:
* Дизайн уровней и тестирование — Например, боты могут пройти или проехать через весь уровень и тем самым выявить непроходимые участки, пробки и другие нюансы в дизайне геометрии уровня.
* Тестирование баланса уровней - Если вы сражаетесь с ботами друг против друга, то, собрав статистику, вы сможете понять, насколько хороши новые изменения баланса уровней. Важным условием такого теста является мастерство ботов. Чтобы получить максимально актуальную статистику, боты должны играть на уровне среднего игрока. Отсутствие необходимости в большой команде тестировщиков уровней значительно ускоряет процесс полировки баланса.
* Тестирование новых предметов и навыков - Разработчик может использовать ботов в качестве тестовых противников при создании нового снаряжения, предметов и т. д. в игре. Например, вы можете добавлять ботов на карту при введении новой винтовки и проверять, насколько хорошо она выполняет свою задачу.
* Функциональное и нагрузочное тестирование - ИИ помогает тестировать различные компоненты игры и даже сам себя :grinning:. Например, можно создать сценарий, в котором бот из каждого вида оружия будет стрелять по всем типам поверхностей и собирать статистику, по какой поверхности, как пробивается и наносится ли урон противнику за поверхностью. Вы можете загрузить тестовый клиент. Отправьте ботов пройтись по карте и посмотреть, есть ли падения FPS или вообще всей игры. А для сервера можно провести нагрузочное тестирование и тем самым проверить, как поведет себя сервер во время «неожиданной» пиковой нагрузки.
Как работает искусственный интеллект в играх
Мы рассмотрели, как игровой ИИ помогает в разработке игр, а теперь рассмотрим, как он работает и какие подходы используются при его разработке.
ИИ работает в цикле: Sense >> Подумайте >> Действуйте для достижения своих целей. Всякий раз, когда появляется новая информация об окружающей среде, становится невозможным принятие решения или выполнение действия завершается/прерывается, ИИ входит в новый виток Смысла >> Подумайте >> Действие цикла.
Давайте рассмотрим каждый из основных этапов цикла действий ИИ.
Сбор информации (Sense)
Первый шаг. ИИ (агент или бот) собирает информацию об окружающей среде для принятия какого-либо решения. Например, это может быть информация о противниках и союзниках. Их позиции, состояние, оснащение и т.д.
Принятие решений (думать)
Следующий шаг — самая сложная и ресурсоемкая часть ИИ. Так как вся информация, собранная ИИ-агентом, обрабатывается и анализируется именно на этом этапе. В зависимости от выборного принципа принятия решений будет возрастать сложность расчетов и точность результата. Рассмотрим основные подходы к принятию решений:
*
Дерево решений. В шутку можно назвать это развитием, управляемым "если". Самый простой способ создать ИИ — это создать множество проверок «если-то». Его также можно назвать методом, моментально реагирующим на внешние события. Из таких проверок создается дерево через узлы, которые проходит ИИ-агент, пока не найдет узел, в котором будет происходить действие. Обычно этапы сбора и анализа информации объединены в один блок и обычно представляют собой условие проверки «если». При таком подходе, если результат проверки "False", то возможен как переход к следующей проверке, так и выполнение действия.
*
Конечный автомат - Случай, когда ИИ-агент находится в одном из возможных состояний и имеет информацию о том, в какое из состояний он может перейти. Например, бот находился в состоянии патрулирования. Он может перейти в состояние вражеской атаки или отступить из этого состояния. Выбор, в какое состояние перейти, может зависеть от количества очков жизни у бота и соотношения союзников/врагов в радиусе X метров. Количество состояний и условий перехода не ограничено. В каждом цикле обновления нового состояния, обычно каждый кадр (иногда для оптимизации потребления ресурсов условия перехода пересчитываются реже) проверяются условия перехода для каждого состояния. И если условия соблюдены, переход активируется. Преимущество этого подхода в том, что у нас есть четкая логика перехода между состояниями.
*
Система полезности Система основана на оценке полезности конкретного действия или перехода. Логика в том, что у ИИ-агента есть набор действий. Он выбирает, какое из них выполнять в зависимости от текущей ситуации на поле боя, от заложенных коэффициентов приоритета выполнения действия или перехода из одного состояния в другое. Например, бот встретил врага во время патрулирования местности. Этому боту будет важнее не атаковать врага, а спрятаться, поднять тревогу и позвать на помощь других ботов. В этом случае его коэффициент уклонения от прямого столкновения будет выше, чем желание атаковать противника. А если у бота нет критического преимущества над противником, он не будет выбирать ветку поведения, связанную с атакой.
*
Деревья поведения - Это удобное дополнение для конечных автоматов. Это позволяет вам взять на себя управление состоянием самих конечных автоматов. Таким образом, мы можем создать дерево условий, по которым мы будем переключать конечные автоматы для ИИ-агента.
* Целенаправленное поведение - Это концепция, которая позволяет ботам играть, ориентируясь на наиболее подходящую роль и цель для агента ИИ и, в зависимости от этого, выбор дерева поведения для работы. Это дерево поведения определяет условия перехода бота в разные состояния и выполнения действий.
В этом случае бот использует нечеткую логику, основанную на расчете коэффициента важности и полезности той или иной роли. Например, роль для бота с оружием или щитом. Коэффициент на становление "танком" будет выше, чем на роль разведчика. Далее, после выбора роли, идет расчет того, какая цель сейчас самая полезная. Если рядом с нами находится маг, который готовит заклинание, то лучшей целью будет защитить его любой ценой. Затем, исходя из текущей цели, выбирается набор дерева поведения, который позволяет боту реализовать поведение для достижения цели.
Такой подход позволяет создавать ботов, которые не подчиняются командам, а выбирают то или иное действие исходя из своих возможностей, текущей боевой обстановки и приоритетов разработчиков. Мы используем этот подход в World of Tanks при разработке ИИ.
Действие (Act) — последний шаг. Это реализация задачи. Обычно это поиск пути и перемещение по нему, осуществление стрельбы, укрытие и т. д.
Итак, чем занимается разработчик ИИ? Основная задача — реализовать Sense >> Подумайте >> Актовый цикл. Разработчик ИИ тесно сотрудничает с другими членами команды, поскольку реализация и оптимизация алгоритмов поведения ИИ — это совместная работа программиста, геймдизайнера и QA. Давайте еще раз пройдемся по циклу ИИ, но уже с точки зрения разработчика.
Сбор информации (Sense) - В этой части цикла программист ИИ отвечает за сбор и хранение информации о ситуации на поле боя. Вместе с геймдизайнером разработчик определяет, какая информация собирается, как часто она обновляется и как она распределяется между ИИ-агентами одной команды в случае командной игры.
В командных играх некоторые из этих данных являются общими для всех агентов ИИ, и боты могут обмениваться этой информацией, что обеспечивает большую реалистичность для ботов ИИ. Зачастую сбор информации не потребляет много ресурсов, за исключением случаев частых raycasts, которые разработчик должен оптимизировать.
Кроме того, часть информации может быть статической. Например, в World of Tanks мы создали несколько слоев данных на карте. Один слой отвечает за съемку от точки к точке по всей карте. Он позволяет понять, насколько позиция защищена или какие участки карты можно контролировать с этого места.
Другой слой говорит вам, насколько хорошо область скрыта от обнаружения, что позволяет вам понять, хороши ли эти кусты для разведывательного танка или нет. Другой слой — это NavMesh, который позволяет ботам перемещаться по карте. Это только часть данных, созданных заранее, и в дополнение к этому мы также можем сделать предварительные расчеты. Например, мы можем хранить не только карту укрытий, но и направления, от которых они защищают.
Для больших карт мы можем предварительно рассчитать длинные пути от одной точки интереса на карте к другой. При этом можно рассчитать, насколько хорош путь с точки зрения протяженности, сложности рельефа и т. д. Уже во время боя можно накладывать динамическую информацию о потенциальных противниках по маршруту. Таким образом, вы можете значительно сэкономить ресурсы процессора и оперативной памяти при выборе пути. Это довольно важная и захватывающая часть разработки ИИ. Помимо очевидной выгоды от оптимизации и добавления новых возможностей ботам, разработчик получает отличное поле для развития, так как такие слои нужно изобретать, а алгоритмы нужно улучшать и адаптировать под свой проект.
Принятие решений (Думать) - Разработчик обычно не реализует логику поведения бота самостоятельно. Он делает это вместе с геймдизайнером.
Кроме того, разработчик реализует систему, отвечающую за выполнение Behavior Tree (условно можно назвать AI-движок). Вместе с геймдизайнером они проектируют API для работы с Behavior Tree, а затем разработчик реализует логику для этого API. Например, методы, позволяющие рассчитать вероятность поражения противника, привлекательность укрытия или оценить угрозу в секторе. Это самая ресурсоемкая часть работы ИИ.
Одним из вариантов решения проблемы производительности и ресурсов является разработка эффективных алгоритмов и рациональное использование статически рассчитанных данных. На их основе ИИ решает оптимальность конкретных действий. При этом система принятия решений должна быть достаточно гибкой и стабильной, ведь не всегда можно гарантировать наличие у бота всех доступных подсистем. Или насколько хорошо они адаптируются к той роли, которую играет ИИ. А иногда хорошо построенная основа искусственного интеллекта помогает ей пережить частичное повреждение.
У нас в World of Tanks был забавный случай, когда мы решили попробовать использовать логику обычного танка для артиллерии, с поправкой на возможность стрелять как артиллерия. Мы сыграли обычный бой, в котором наш QA решил доказать, что он играет лучше ботов (на самом деле играет, но не все так просто).
Он мог обойти ботов, прибыть на вражескую базу и решить уничтожить всю вражескую артиллерию, три бота. Он проигнорировал, что его обнаружили вражеские машины недалеко от базы. Когда он попал в поле зрения артиллерии, сразу отправился наблюдать за боем в режиме свободной камеры. Выяснилось, что боты, увидев приближение опасного врага, решили выстрелить в него, заранее рассчитав место, где он, скорее всего, появится. И как только наш герой появился в поле зрения, боты открыли по нему огонь. И все бы ничего, но это сделали все три артиллерии одновременно. И мы обнаружили неожиданно слаженную игру ботов на артиллерии, хоть она еще и не реализована!
Действие (Act) - В этой части разработчик реализует механизмы, позволяющие агенту ИИ выполнять инструкции после принятия решения. Внедрение модулей, отвечающих за навигацию (например, адаптация А* под особенности игры), стрельбу и т. д. Например, можно взять алгоритм А* и использовать его в своем продукте. Но чаще всего у вас будут дополнительные условия, например скалы. Если не оптимизировать, то путь для тяжелого юнита можно построить слишком близко к обрыву, что приведет к его падению. В этом случае необходимо ввести дополнительные коэффициенты на подъезд к обрыву или другому неудобному типу местности и реализовать плавное сглаживание трассы. В противном случае боты будут ходить по «лесенке». Эта область очень близка к игровому процессу, так как использует свою механику для выполнения заданий.
Инструменты Разработчик ИИ, помимо реализации цикла (Sense >> Think >> Act), создает инструменты для себя, геймдизайнера и QA. Иногда для реализации той или иной механики проще создать инструмент, с помощью которого можно настроить и использовать функционал и только потом приступать непосредственно к реализации самой задачи. Геймдизайнер должен уметь анализировать логику и последовательность решений ИИ. Для этих целей мы в World of Tanks создали инструменты, позволяющие записывать все действия ботов в бою и затем создавать повторы, визуализирующие шаги ботов, последовательность принимаемых решений и данные, на основании которых эти решения принимались. сделано.
Разработчики также создают системы, которые позволяют ИИ помогать в разработке игры. Вы можете создать набор инструментов для дизайнеров уровней, который позволит вам быстро упорядочивать ботов по уровням и устанавливать для них цели сценария.
Например, пройти всю карту и проверить, все ли в порядке с проходимостью. Для QA часто необходимо создавать инструменты, позволяющие проверять отдельные подсистемы игры с помощью ботов.
В World of Tanks мы используем ИИ для настройки того, как ИИ играет на карте. Для этого мы создали инструмент сбора статистики. Далее мы меняем карту, например, как выглядят стратегические зоны для ботов и где находятся точки перехода между этими зонами. Далее на сервере запускается 1000-3000 боёв. После этого смотрим картину боя с помощью статистики и тепловых карт. Геймдизайнер корректирует настройки карты и повторяет их по кругу на основе этих данных. При этом, используя достаточную мощность сервера, можно получить такую статистику за ночь ботов, а утром проанализировать и внести изменения.
Как это работает на практике
Давайте на реальном примере из World of Tanks рассмотрим полный цикл создания нового функционала с помощью ИИ. Мы также сможем наблюдать, как программист, геймдизайнер и QA взаимодействуют друг с другом.
Начнем с этой задачи: нам нужны боты, которые будут таранить игрока и взрываться, нанося ему и небольшому радиусу вокруг него урон. Назовем их «Ежик». Эти "Ежики" поедут быстрее игрока при дополнительных условиях. Они не будут стрелять, будут похожи по форме на шар, могут быть взорваны одним выстрелом, должны таранить только игроков и ехать группой из X юнитов. Казалось бы, что может быть проще?
Получив эти данные от геймдизайнера, разработчик вспомнил математику и то, как рассчитать опережение по движению игрока, и вместе с геймдизайнером создал набор логики Behavior Tree, который направлял бота на противника и заставлял его таранить. Определенный набор методов был реализован ответственно за подрыв и повреждение области со стороны программиста. Для проверки создали специальный скрипт, куда поместили одного бота-ерша и одного обычного бота.
Первый успешно таранил второго, и все было хорошо. Мы решили отдать его на внутриигровой тест внутри команды и собрать статистику. И это показало, что боты на реальной карте не доходят до игроков. Выяснилось, что боты получили урон из-за высокой скорости подпрыгивания на кочках и при падении. После нескольких таких падений они взрывались и наносили повреждения соседним ершам. В свою очередь, это вызвало цепную реакцию. Поправил количество живых ботов и добавил логическую рассыпку диска. Я также изменил тестовый сценарий на основе реальной карты с холмами.
После прохождения второго этапа тестирования мы поняли, что боты очень «вежливые». Все дело в том, что таранили игроков только по пути движения, т. е. в лоб. Но если они подходили сзади, то начинали обходить игрока по большой дуге. Обсудив варианты с геймдизайнером, программист изменил формулы выбора траектории тарана. Проведя новую серию тестов, QA дали отзыв о том, что боты слишком быстрые и точные, а шансов у игроков нет. Поэтому я вернулся к формуле и подправил ее так, что она иногда выдавала ошибку и модифицировала поведение подхода к новому кругу после того, как бот промахивался по игроку.
Траектория бота для разворота и тарана увеличилась, позволяя игрокам перезаряжаться и стрелять в них. Это создавало захватывающие геймплейные моменты, когда боты то улетали за пределы карты, то промахивались и успевали их поразить на последних секундах. Иногда они успешно ловили игрока и атаковали с разных сторон. QA оценил игровой процесс встречи с ершами, и эта функция была включена в версию плеера.
На этом примере видно, что на протяжении разработки функционала программист, геймдизайнер и QA постоянно общались, что позволяло эффективнее находить любые проблемные места фичи и исправлять их до того, как они попадут к игрокам. Также программист и геймдизайнер совместно разработали алгоритм тарана игрока, а тестировщик дал отзыв о том, насколько весело было играть против таких ботов. Это реальный пример из PVE-режима Мирный-13 от нашей команды и создателей серии Silent Hill.
Что нужно, чтобы стать разработчиком ИИ
Во-первых, любите игры! Серьезно, если вы не любите игры, зачем вообще этим заниматься?
Во-вторых, очень важно много играть в свой продукт, потому что, только поставив себя на место игрока, вы поймете, как он играет и как должны играть боты.
В противном случае вы будете «кодировать» задачи геймдизайнера и так не сможете стать ИИ-разработчиком. Последнее — это желание понять, почему что-то работает так или иначе. ИИ для сложных игр не использует четкую логику, и результат Sense >> Подумайте >> Цикл действия не всегда будет на 100 % предсказуем и понятен. Нередко разработчик вместе с геймдизайнером и QA должен анализировать данные о решениях, принятых ботами, чтобы понять, правильно действовал ИИ или нет. И нет необходимости в Hard Skills и Soft Skills.
Hard Skills (это набор технических знаний). И первым в списке стоит знание скриптовых языков программирования, обычно написанных игровой логики геймплея. Например, в World of Tanks это Python, а в Unity это будет C#. Вторым важным элементом будет C++. Без него будет непросто, потому что на нем делается большинство оптимизаций.
Теперь следующий шаг.
Хорошее понимание структур данных и алгоритмов. Разработка ИИ требует большого количества вычислений, и выбор оптимальной стратегии хранения и обработки данных может сэкономить много времени, а также ресурсы ЦП и памяти. Знания математики на уровне университета 2-го курса также будут необходимы. Конечно, полезно знать основные подходы в разработке ИИ (цикл ИИ и подходы к принятию решений).
Soft Skills (навыки, позволяющие работать в команде и участвовать в конструктивном диалоге). Есть немало ценных Soft Skills, но в разработке ИИ я хотел бы выделить один:
Командная работа!
Геймдизайнеры, программисты и QA очень тесно сотрудничают, и часто невозможно выполнить задачу или решить проблему, не объединив их опыт и знания. Вот почему такие навыки, как умение слушать других людей, обсуждать, а не спорить, и задавать вопросы, являются фундаментальными. Иногда лучше спросить геймдизайнера или тестировщика о том или ином нюансе в игре или механике, чем придумывать и делать самому, а потом мучительно долго переделывать. Хорошая работа ИИ в игре — это всегда заслуга всей команды, а не одного специалиста!
Как видите, создавать ИИ для игр сложно, но это так весело и приятно! Среди прочего, это хорошая область для развития как Hard Skills, так и Soft Skills.
Давайте делать разные и увлекательные игры, а искусственный интеллект нам в этом поможет.
Оригинал