{ "author_name": "Андрей Верещагин", "author_type": "self", "tags": ["\u043e\u043f\u044b\u0442","\u0433\u0435\u0439\u043c\u0434\u0438\u0437\u0430\u0439\u043d"], "comments": 20, "likes": 84, "favorites": 28, "is_advertisement": false, "section_name": "gamedev", "id": "12953", "is_wide": "" }
Андрей Верещагин
6 631
Gamedev

Как работает 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 может выбирать, чем ему заняться.

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

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

Популярные материалы
Показать еще
{ "is_needs_advanced_access": false }

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

Популярные

По порядку

0

Прямой эфир

Узнавайте первым важные новости

Подписаться
[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "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": "create", "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-549065259", "adfox_url": "//ads.adfox.ru/228129/getCode?p1=bxeub&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid21=&puid22=&puid31=&puid32=&fmt=1&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } } ]