Gamedev Владимир Семыкин
5 036

Секреты ИИ скелетов и акул в Sea of Thieves — часть вторая

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

В закладки
Аудио

Автор блога AI and Games Томми Томпсон на сайте Gamasutra опубликовал вторую часть своего разбора работы ИИ в Sea of Thieves. В этом тексте он рассказал про навигационную систему, которая позволяет акулам передвигаться в воде, а также раскрыл подробности работы ИИ скелетов. Мы выбрали из материала главное.

Один из типов миссий в игре представляет собой охоту за головами особых скелетов. Чтобы всё работало как надо, скелеты должны появляться в мире только при необходимости. Тем не менее они же могут появляться и во время выполнения миссии другого типа.

Обычно их работа определяется парадигмой ИИ, которая называется деревом поведения. Этот инструмент по умолчанию встроен в Unreal Engine 4. Деревья поведения допускают ветвление логики, поэтому ИИ будет по-разному реагировать на соответствующие условия. Кроме того, они могут быстро реагировать на изменения в мире и обновлять своё поведение в соответствии с предпочтениями.

Многие из наземных ИИ-персонажей (такие как скелеты и животные на островах) используют оригинальный встроенный инструментарий ИИ. Но в Sea of Thieves скелеты устроены несколько сложнее.

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

Если пользователь хочет исцелиться в Sea of Thieves, он откроет инвентарь, возьмёт банан, а затем нажмёт на кнопку «съесть», которая запустит функцию Heal() в кодовой базе для игроков-людей. Обычно, чтобы персонаж ИИ, например, скелет, делал то же самое, можно просто запустить ту же функцию Heal() и убедиться, что используется соответствующая анимация, чтобы игроки могли понять, что происходит.

Оказалось, что в Sea of Thieves всё работает несколько иначе — скелеты имитируют вводные сигналы игрока. Таким образом, вместо того, чтобы просто вызывать определённое поведение кода, они нажимают виртуальные эквиваленты кнопок и эффективно «играют» в игру, как люди. Кроме того, скелеты используют тот же базовый контроллер, что и игрок-человек, то есть они применяют не только некоторые анимации пользователей, но и интерфейс ввода.

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

Хотя стоит упомянуть, что движение по земле не задействует виртуальные аналоги стиков — они просто используют навигационные сетки, запечённые на островах. Всё это означает, что ИИ может выполнять только те действия, которые может совершать и игрок. Конечно, это имеет смысл, учитывая, что они — нежить.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#ии #seaofthieves

{ "author_name": "Владимир Семыкин", "author_type": "editor", "tags": ["\u0438\u0438","seaofthieves"], "comments": 10, "likes": 58, "favorites": 98, "is_advertisement": false, "subsite_label": "gamedev", "id": 56217, "is_wide": true, "is_ugc": false, "date": "Sat, 29 Jun 2019 21:51:55 +0300" }
{ "id": 56217, "author_id": 94357, "diff_limit": 1000, "urls": {"diff":"\/comments\/56217\/get","add":"\/comments\/56217\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/56217"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64954, "last_count_and_date": null }
10 комментариев

Популярные

По порядку

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

Мде... По поводу акул, - подобная система оправдывала бы затраты на свое создание, если бы игра была симулятором акулы, но в подобных играх, как по мне, ничего криминального нет в том, что бы не заморачиваться по поводу того, что акула нереалестично застыла в воде. То есть, скилеты, это норм, а вот акула, не двигающаяся непрерывно - вах, вах, вах. Это из разряда - спорить о неправильности траекторий полета галактик, когда обсуждаешь мультипликацию, в которой ГЧБР бросаются друг в друга этими самыми галактиками...
Да и про тестирование ИИ, что-то они намудрили, с прожиманием кнопок...

Ответить
18

нереалЕстично, скИлеты ... Аж самому себе втащить захотелось...

Ответить
5

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

Ответить
2

Да и про тестирование ИИ, что-то они намудрили, с прожиманием кнопок...

На самом деле, это не мудрствование, а скорее наоборот, упрощение разработки, принцип loose coupling (слабой связанности).
Все human-like игровые сущности работают одинаковым образом, вне зависимости откуда им приходят команды. Это позволяет легко менять источник этих команд без необходимости переписывать внутреннюю логику самих AI-управляемых объектов и добавлять новые функции для выполнения каких-то действий.

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

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

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

Ответить
–1

наверно когда ты сидишь на зарплате у майков, делать просто и быстро - невыгодно

Ответить
0

Знаете, вот вспоминаю я старый добрый ИИ ФЕАР на смарт-нодах и думаю...
Что в этих скелетах инновационного?..
Что в этих акулах принципиально нового?..

Ничего же.

Ответить
5

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

Ответить
0

Акулы действительно неплохо вписываются в окружения и реально интересны , но вот про скелетов ничего подобного сказать нельзя достаточно скучные и разнообразят только тем , что их несколько видов

Ответить
0

Столько умов собралось писать революционное ИИ, столько интересных и сложных процессов происходит за кулисами, а в игру всё еще играть неинтересно, потому что там ничего не происходит. Ничего там, кроме как таскать ящики с пустых островов, где на 1км область появляются 2-3 скелета, - нет. Один из случаев когда разработка игры интересней самой игры. Провел в игре два дня, и понял что в ней абсолютно нечего делать, хотя симуляция воды и волн - одна из самых впечатляющих, которую я видел в индустрии. В итоге SoT это простая тех. демка.

Ответить
0

Прямой эфир

{ "remaining": "WzAsMSwyLDMsNCw1LDYsNyw4LDld" } [ { "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" ], "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" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } } ]
Новая игра Ubisoft на релизе выглядит
точно так же, как и на E3
Подписаться на push-уведомления