Как работает AI в Battlefield 1

Иллюзия полномасштабной войны.

В закладки

На конференции DevGAMM 2017 в Минске старший геймдизайнер Battlefield 1 Карола Беренс (Carola Berens) рассказала о создании искусственного интеллекта в шутере и о том, как он помогает создать ощущение того, что вокруг игрока происходят по-настоящему масштабные сражения.

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

Frostbite — движок внутренней разработки EA. Он имеет полную поддержку анимации, физики, аудио, рендера, синематиков и так далее. Он был сделан специально для игр с большим открытым миром и разрушаемым окружением.

У движка есть свои ограничения в том, что касается AI. Мы не могли просто «населить» карты тысячами солдат, но нам надо было сделать так, чтобы так казалось. Больше всего ресурсов процессора «съедали» поиск пути, анимации, логика боя и разные уровни детализации, которые зависят от того, как далеко игрок находится от NPC.

Чтобы создать иллюзию полномасштабного сражения, мы использовали разные типы (Tier) AI. У первого типа были полноценные коллизии, поиск пути, анимацию, скелетную анимацию. NPC под управлением этого AI могли видеть и слышать игрока, реагировать его на действия, укрываться и отступать.

Второй тип AI был «дешевле» в том, что касается ресурсов системы. Эти NPC не имели логики поиска пути, а их анимация была упрощена. Их действия были заскриптованы, а единственной коллизией была коллизия на пули. И хотя игрок может застрелить таких NPC, сами они в ответ никогда не будут стрелять. Кроме того, персонажи под управлением AI второго типа могли случайно умирать от взрывов или выстрелов.

Третий тип солдат — это те, которых игрок видит на очень большом расстоянии от себя. У них не было логики пути и каких-либо коллизий, то есть, если поставить на пути такого NPC здание, он просто пройдёт сквозь него. Кроме того, они никак не реагировали на выстрелы игрока. У них не было детализированной анимации — это меши, которые выглядели хорошо только издалека. NPC под управлением этого AI — просто декорации, призванные сделать уровни более живыми, игрок не должен видеть их вблизи.

Местность вокруг игрока в очень большом радиусе «населена» управляемыми компьютером персонажами, которые будут реагировать на его действия и в общем делать то, что пользовать ожидает от AI. NPC, управляемые искусственным интеллектом второго типа, располагаются в пределах радиуса поражения игрока. За этой областью, там, куда игрок никогда не доберётся, мы используем меши.

Очевидно, что пользователь не захочет попасть туда, где начинаются «декорации», он всегда будет оставаться в центре. Поэтому в Battlefield 1 есть соответствующая логика, которая следит за тем, чтобы игрок всегда оставался в окружении полноценного AI.

Что касается ресурсов, которые система тратит на каждый из типов искусственного интеллекта, то один NPC с полноценным AI «стоит» столько же, сколько три персонажа под управлением AI второго типа или 10 мешей.

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

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

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

Вы, возможно, заметили, что на уровнях преобладают серые тона. И с этим нам тоже пришлось работать. Из-за того, что объекты и персонажи сливаются с окружением, игроку не обязательно видеть 10 NPC, но он должен «почувствовать» их присутствие.

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

При создании полноценного AI мы сфокусировались на двух основных элементах: навигации и чётком бездействии (legible idle). Первый предполагает наделение AI способностью перемещаться в сложных локациях, подниматься на другие этажи, проходить через двери, подниматься по лестницами, перепрыгивать через ограды и так далее. Это звучит как что-то простое, но, поверьте мне, сделать так, чтобы солдаты могли выполнять эти простые действия, очень трудно.

Чёткое бездействие — это всё то, что создаёт иллюзию живого мира. Персонажи переговариваются между собой, рассматривают плакаты и тому подобное. Всё это помогает нарративу.

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

Поэтому мы добавили Path Links, вроде тех, которые обозначены фиолетовой стрелкой. Их можно привязать к отдельным объектам, вроде дверей или окон, либо к целым массивам, вроде ограждений. Path Links содержит в себе стартовую и конечную точку проигрывания анимации, с помощью которой NPC преодолевает препятствия. Это значит, что для каждого из ассетов нам приходилось создавать специальные анимации.

Отдельно стоит поговорить о дверях. АI может подойти к закрытой или открытой двери — с этим никаких проблем нет. Но что, если NPC подходит к двери именно в тот момент, когда её открывает игрок? Что, если дверь открывается не в том направлении, в котором NPC ожидает? Что, если дверь взорвали? Пришлось проделать огромный объём работ, чтобы во всех случаях AI вёл себя корректно. Например, если солдат просто патрулирует территорию, он спокойно открывает дверь, но если идёт бой — он выламывает её ударом.

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

У нас было два варианта. Первый предполагал дать возможность AI самому выбирать, чем ему заняться: выпить воды, пойти патрулировать территорию, закурить, поговорить с соратником, посмотреть на плакаты и так далее. Это даёт искусственному интеллекту своего рода свободу воли. Вы не можете предсказать, куда NPC отправятся в следующий момент, они просто будут шататься по уровню. Это, конечно, не идёт на пользу игровому опыту, ведь вы не можете изучить поведение противника, подкрасться к нему.

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

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

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

#опыт #геймдизайн

{ "author_name": "Андрей Верещагин", "author_type": "editor", "tags": ["\u0433\u0435\u0439\u043c\u0434\u0438\u0437\u0430\u0439\u043d","\u043e\u043f\u044b\u0442"], "comments": 19, "likes": 85, "favorites": 1, "is_advertisement": false, "subsite_label": "gamedev", "id": 12953, "is_wide": false }
{ "id": 12953, "author_id": 22254, "diff_limit": 1000, "urls": {"diff":"\/comments\/12953\/get","add":"\/comments\/12953\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/12953"}, "attach_limit": 2, "max_comment_text_length": 5000 }

19 комментариев 19 комм.

Популярные

По порядку

Написать комментарий...

d1mazka

10

Познавательно! Спасибо

Ответить

Vovka Grekov

2

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

Ответить

Кириллъ Роженко

Vovka
2

Как показал опыт CoD WWII - нет.

Ответить

Алмаз Ахметзянов

Vovka
1

Выглядели бы хуже, думаю. Да и всякие ваномасы к 2D человечкам точно придирались по полной

Ответить

top.investor.here

0

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

Ответить

Павелъ Балашовъ

top.investor.here
3

А не подскажите где можно взглянуть на те самые исходники?

Ответить

Maxim Gorban

top.investor.here
1

Вы часом ML и АИ в играх не путаете?

Ответить

DoorInSummer .

1

К сожалению, все равно это аттракцион, который распадается на части при долгой игре.
Что забавно, даже игры с тактической паузой или пошаговыми боями не дают полноценного ощущения боевых действий. И даже в фантастическом сеттинге XCOM возникают вопросы к AI.
Зато с изометрией впечатления меняются. Помню, как поразили меня города Fallout 1 и 2, сколько деталей, куча подвижных персонажей, ведущих свою деятельность. Но есть и анти-впечатления - это серия Commandos, Desperados и другие игры с вечными патрулями туда-сюда (с перекурами).

Ответить

Максим Димитров

DoorInSummer
1

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

Ответить

DoorInSummer .

Максим
0

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

Ответить

Эрих Миронов

1

Было интересно почитать, спасибо

Ответить

Олег Кубанеишвили

0

Хм, может, пройти одиночку BF1 ?

Ответить

Максим Димитров

Олег
2

Только если совсем больше не во что играть.

Ответить

Саня Берлезов

Олег
0

Только ради сюжета,сам геймплей та еще параша

Ответить

Random Luck

Саня
0

а сюжет нет?)

Ответить

Саня Берлезов

0

Помню миссию с танком,10 солдат бегущих в ряд прошивала одна пуля насмерть,пехотинцы от взрывов падали и разлетались как тряпичные куклы,никакого ощущения реально боя,скорей уж ощущение того,что меня наебали на 2К

Ответить

Alexander Maltsev

–1

За то нытиков и "не оч реалистично" навалом. Люди заморачиваются, а они ноют (да некоторые еще и из-за пары копеек лол)

Ответить

Павелъ Балашовъ

Alexander
0

Ну и что что они заморочились? Если получилось, то что получилось.

Ответить

Vitaliy Polykevich

0

Отличная статья, спасибо!

Ответить

Выходной бокал

0

<removed>

Ответить

Выходной бокал

0

<removed>

Ответить

Выходной бокал

0

<removed>

Ответить
0

Прямой эфир

Подписаться на push-уведомления
[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } } ]