Русский
Русский
English
Статистика
Реклама

Игровая разработка

Meta Gameplay Framework, или бэкенд без серверных разработчиков

12.11.2020 12:19:49 | Автор: admin


Привет! Меня зовут Кирилл, я руководитель отдела серверной разработки в Pixonic. Здесь я работаю уже более 5 лет. Долгое время Pixonic была компанией одной игры War Robots. Но однажды к нам пришло осознание, что так больше продолжаться не может, и мы начали работу над созданием новых проектов.

Поначалу мы взялись за это дело по старинке, используя традиционные для нас подходы: писали клиент на Unity 3D, бэкенд разрабатывали на Java. Это было привычно, понятно, но имело ряд серьезных недостатков. Проекты разрабатывались медленнее, чем нам бы хотелось. Для выполнения любой задачи необходимо было задействовать как минимум двух разработчиков. Однако, когда в разработке участвуют два и более человека, неизбежно возникают ошибки в духе: то один не так понял другого, то второй работает быстрее, чем первый. Такие ситуации приводят к тому, что кому-то из разработчиков в дальнейшем приходится возвращаться к задаче, которую он, казалось, уже давно закончил, а ведь у него и других дел полно. Так мы начали думать над тем, как разрешить эту проблему.

Еще нас огорчало, что каждый раз так или иначе приходилось сталкиваться с инфраструктурными вопросами: разработка и поддержание API и схем баз данных, написание DTOшек, их преобразование из и в модели на клиенте и сервере. Эта рутина многим привычна, они ее даже не замечают, однако она отнимает время, которое можно было бы использовать с большей пользой. Эту проблему, казалось бы, можно решить клонированием предыдущего проекта но все оказывается сложнее, когда дело доходит до взаимодействия с геймдизайнерами. Они постоянно придумывают что-то новое, и даже если поначалу кажется, что у проектов много общего возьми да скопируй, то по факту оказывается, что это совсем не так. В итоге от клонированного проекта остается только набор библиотек и каркас la bootstrap.

После долгих размышлений наши желания оформились в следующие требования:

  • Один разработчик должен уметь выполнить задачу как на клиенте, так и на сервере: не должно быть разделения ролей по профилю.
  • Разработчики в своей работе не должны задумываться об инфраструктуре: о базах данных, протоколах взаимодействия между сервисами, логировании совершенных операций. Все внимание должно быть сосредоточено на разработке бизнес-логики.
  • Модели, используемые на сервере, должны как можно чаще использоваться на клиенте.
  • Фреймворк должен предоставлять простые и понятные механизмы для выполнения рутинных операций: списания/начисления игровой валюты, выдачи игровых предметов, открытия лутбоксов, работы с платежами из сторов, с аналитикой и т.д.
  • Все операции, совершаемые игроком, должны быть доступны из панели администрирования это позволило бы команде техподдержки, тестировщикам и разработчикам лучше понимать, что происходило с игроком в случае поступления жалоб или обнаружения ошибок.

На момент начала разработки фреймворка на рынке уже было несколько предложений, частично удовлетворяющих нашим требованиям, PlayFab и GameSparks. Это отличные решения, построенные по модели LiveOps, но имеющие ряд критических для нас недостатков:

  • Код пишется на JavaScript, что не дает возможности полноценного переиспользования в Unity 3D, и в любом случае приходится преобразовывать ответы сервиса в модели клиента. Получается, что разработчик должен знать два языка программирования и выполнять дополнительную работу, которой хотелось бы избежать.
  • Наша цель разработка хита, а значит речь идет о миллионах игроков в день. Стоимость работы этих сервисов на наших объемах становится значительно больше, чем стоимость самостоятельного владения подобным решением.

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

  • C# (.net core для сервера и клиента, .net 3.5, 4.X для клиента). Мы хотим, чтобы разработчик мог разрабатывать как клиентскую, так и серверную часть задачи. Уйти от Unity 3D мы не можем, а вот написать сервер на C# вполне.
  • Orleans фреймворк для построения распределенных, отказоустойчивых и масштабируемых систем в модели акторов от Microsoft (использовался в Halo). Использование этого фреймворка обусловлено тем, что с нашими задачами рано или поздно придется масштабироваться к тому же, хочется, чтобы решение было отказоустойчивым.
  • GRPC для общения сервисов между собой, так как в системе, кроме сервиса игроков, построенного на Orleans, существуют и другие: авторизация, загрузка каталогов и прочее в том числе и сервисы, которые ранее были написаны на Java и оказались по-настоящему автономны и независимы от того проекта, в котором используются.
  • Postgres для хранения данных игроков. Для масштабирования базы данных мы используем шардирование.
  • Docker с ним удобно разворачивать окружение локально и в тестовой среде. Таким образом, геймдизайнеры и разработчики могут работать с метой так, чтобы никому не мешать. Можно у себя ее локально поднять, проверить, что все работает, как нужно, и запушить уже измененный код в репозиторий.
  • Prometheus для мониторинга.
  • Event Sourcing парадигма, которую мы используем для хранения данных игроков. Она часто используется в банках. Подход здесь такой: когда мы работаем через Event Sourcing, все, что мы делаем, представлено в виде потока событий. Как упоминалось ранее, хотелось бы постоянно иметь историю, которая сохраняется в базе данных. Этот поток событий и есть наша история, по которой мы можем отслеживать, что происходило. Если что-то пошло не так, мы можем посмотреть интересующее нас событие в прошлом и полностью восстановить состояние игрока.

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

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

  • вкладки конфигурирования игровых предметов;
  • вкладки настройки экспериментов (A/B тестов);
  • вкладки настройки лутбоксов;
  • вкладки настройки игровых валют;
  • вкладки для хранения простых настроек, заданных в виде ключ-значение.



Пример конфигурирования предмета

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

// Находим в каталоге предмет с идентификатором 'Reaver_1':ItemBlueprint itemBlueprint = catalog.GetItemBlueprint(ItemBlueprint.ValueOf("Reaver_1")); // Получаем проверенное значение из колонки с названием 'grade'. // Если поле отсутствует или имеет неверный тип, далее этот результат будет передан // в админку, где будет выведена информация о месте нахождения ошибки:Validated<int> grade = itemBlueprint.ShouldHasIntAttr("grade");

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

  • Профиль игрока. Он содержит имя и дату регистрации пользователя, а также позволяет хранить проектно специфичные данные.
  • Кошелек. Благодаря нему начисляются и списываются валюты, выводится их баланс. Помимо прочего, реализация нашего кошелька позволяет отслеживать источники, из которых были получены валюты, и, как следствие, определять, на что игроки тратят реальные деньги, а на что полученные в процессе игры. Это важно для понимания того, что представляет большую ценность для игрока.
  • Инвентарь. Он позволяет управлять внутриигровыми предметами: добавлять их, удалять, осуществлять поиск.
  • Предметы. Они делятся на два вида:

  1. Обладающие индивидуальностью и состоянием. Таким предметам можно задавать проектно специфичные параметры. Так, например, у брони может отслеживаться состояние ее износа.
  2. Не обладающие индивидуальностью. Обычно это потребляемые предметы. В таком случае хранится только счетчик их количества. Пример таких предметов бутылки с целебным зельем.

  • Лутбоксы. Сейчас без них немыслима ни одна free-to-play игра. Наше решение позволяет задавать различные варианты генерации контента для выдачи: от 100% гарантированного в этом случае лутбоксы можно использовать как обычные контейнеры, до полностью случайного.

Помимо этих базовых примитивов, на которых строится большая часть мета-геймплея в играх, фреймворк также предоставляет механизмы работы с A/B тестами, авторизацией, обработкой платежей сторов, выполнения отложенных задач, обезличивания данных и многие другие.

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

// Описываем команду, представляющую из себя обычную DTO,// которая может быть сериализована в Json:public class DemoCommand : ICommand{    public string BlueprintId;    public int Value;} // Описываем обработчик команды:public class DemoHandler : HandlerBase, ICommandHandler<DemoCommand>{    public void Handle(ICommandContext context, DemoCommand command)    {        // Inventory  объявлен в HandlerBase.        // Создаем новый предмет по образцу из каталога:        var demoItem = Inventory.GrantItem(ItemBlueprintId.ValueOf(command.BlueprintId));         // Задаем предмету значение атрибута 'demo_value':        demoItem.Attributes["demo_value"] = command.Value;     }}

Заводим команду и ее обработчик. В реализации обработчика видно, что мы обращаемся к инвентарю и выдаем предмет игроку. После этого мы присваиваем предмету атрибут demo_value со значением, переданным в команде.

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

// Выполняем команду на сервере:var command = new DemoCommand { BlueprintId = "Reaver_1", Value = 777 };var commandResult = connection.Execute(command); // Из ответа получаем обновленный инвентарь игрока:var inventory = commandResult.Player.Inventory; // Получаем последний созданный предмет:var demoItem = inventory.FindItemsByBlueprint(ItemBlueprintId.ValueOf("Reaver_1")).Last(); // Выводим установленное значение:Console.WriteLine(demoItem.Attributes["demo_value"]);

Так при чем здесь Event Sourcing?

Как видно из предыдущего примера, мы пишем код в классическом императивном стиле. Здесь нет работы с базой данных. Метод обработки команды не возвращает никаких результатов. Так как же это работает?

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

Ниже приведена упрощенная диаграмма того, что происходит при взаимодействии клиента и сервера:



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

Ниже приведен пример отображения транзакций игрока из реального проекта. Здесь мы видим две прошедших транзакции. Одна из них создание нового игрока, вторая принятие пользовательского соглашения с определенной версией.


Пример лога транзакций из реального проекта

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

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

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

Перевод Охотники, щелкуны и Элли как устроен игровой искусственный интеллект в The Last of Us

20.06.2020 12:14:32 | Автор: admin
Вчера состоялся релиз сиквела The Last of Us игры, уже семь лет являющейся одним из наиболее узнаваемых эксклюзивов PlayStation. Это кинематографическая история о человеческих жизнях в бесчеловечной реальности мира, разрушенного современной чумой. В то время, когда игроки берут на себя управление циничным и озлобленным главным героем Джоэлом, искусственный интеллект разыгрывает других персонажей, будь то союзник, враг или зараженный.

На фоне выхода второй части игры рассказываем о том, почему игрокам так понравился оригинал. В этой переводной статье поговорим о философии дизайна The Last of Us, касающейся всех аспектов искусственного интеллекта.



Предупреждение: речь в статье идет только об оригинальной игре 2013 года.


Об игре


The Last of Us игра от третьего лица в жанре action-adventure с фокусом на механиках стелса и динамической системе укрытий. В мире постапокалиптической Америки игроки вынуждены противостоять двум типам противников: охотникам людям, контролирующим и патрулирующим отдельные территории по всей стране, и зараженным существам, в которых превращаются люди, заболевшие грибковой чумой.
Когда мы только начинали создавать прототипы ИИ в случае, когда врагом является человек, первый вопрос, которым мы задались, был следующий: как заставить игрока поверить в реальность своих противников, чтобы ему не хотелось их убивать? Ответ на этот вопрос и стал основой дизайна вражеского ИИ. Для ответа на него потребовалось нечто большее, чем просто нанять лучших актеров озвучки, лучших 3D-художников и аниматоров, хотя все это тоже было немаловажным. Прежде всего нам требовалось решить проблему самого искусственного интеллекта. Потому что, если мы не сможем заставить игрока поверить, будто эти отряды выживших мыслят и взаимодействуют, как настоящие люди, никакие передовые мокапы не удержат игрока в потоке.

Трэвис Макинтош, Вражеский ИИ в The Last of Us, Game AI Pro, том 2, глава 34, 2015

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

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


Архитектура ИИ


Начнем с объяснения основ архитектуры искусственного интеллекта различных персонажей в игре и того, почему Naughty Dog построили ее именно таким образом.

ИИ в The Last of Us строится на использовании конечных автоматов (КА) давно устоявшегося подхода к созданию искусственного интеллекта. Популяризовала его Half-Life еще в 1998 году. Его суть состоит в том, что персонаж может иметь несколько сменяющих друг друга состояний: к примеру, он будет атаковать цель либо искать ее местоположение до тех пор, пока не произойдет событие-триггер, которое переведет его из одного состояния в другое.


Простой КА с двумя состояниями

ИИ в The Last of Us построен на идее поведений и навыков. Навыки это то, что персонаж может сделать. Например, охотник может начать выяснять, что за шорохи он слышит или что за движение видит, спрятаться за укрытием или обойти игрока. В случае зараженных этот список будет иной: например, в него будут входить хаотическое блуждание по карте и преследование противника. В любом из вариантов используются более мелкие специфические действия, такие как перемещение по локациям, взаимодействие с объектами в мире или реагирование на них. Здесь и вступает в силу поведение.

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

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



Более разветвленная и независимая система ИИ позволяет дизайнерам выполнять множество итераций, не перегружая программистов запросами функций или необходимостью индивидуальной настройки определенных частей кода. Это позволило сосредоточить гораздо больше сил и времени на тестировании каждого типа персонажа, обеспечить его соответствие изначально задуманному дизайну, улучшить функции, быстро прототипировать новые идеи или без особых проблем отказываться от тех, которые не работали.
Лучший способ достичь поставленных целей сделать наших персонажей неглупыми, прежде чем сделать их умными. Персонажи создают иллюзию интеллекта, когда их помещают в хорошо продуманную обстановку; реагируют на игрока, воспроизводят убедительные анимации и звуки и в целом ведут себя довольно интересно. Все это может запросто сойти на нет, если они будут бездумно врезаться в стены или совершать любые другие ошибки, характерные плохому ИИ. Устранение этих проблем не только является крайне полезным опытом, но также дает понять, насколько иначе выглядят персонажи, которые просто не совершают глупостей.

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

Марк Ботта, ИИ зараженных в The Last of Us, Game AI Pro, том 2, глава 33, 2015

Но даже наличие хорошего набора уже доступных инструментов не означает, что не возникнет нужды в дальнейших экспериментах. Для того, чтобы достичь своего замысла, Naughty Dog радикально поменяли и пересмотрели множество элементов дружественного и вражеского ИИ. Некоторые вражеские архетипы и даже система поведения Элли приняли свой финальный вид только в последние пять месяцев до релиза игры.

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




Охотники


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

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

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

Прежде всего стоит поговорить о зрении. NPC используют различные поля обзора для обнаружения игрока в пространстве.

Изначально в The Last of Us они были такими же, как в другой серии игр Naughty Dog Uncharted. Но со своей функцией они справлялись плохо: игрока слишком быстро замечали как на близком, так и на дальнем расстоянии. Они не соответствовали темпу игры, а потому были видоизменены и имели уже не конусообразную форму. Теперь поле зрения NPC стало напоминать контур замочной скважины, тем самым обеспечивая более широкое периферическое зрение и более узкий обзор на расстоянии.


Поле зрения NPC в Uncharted


Поле зрения NPC в The Last of Us

Вдобавок к этому, игрока нельзя обнаружить мгновенно: ему нужно оставаться на виду у противника хотя бы пару секунд, чтобы быть замеченным. Быстрее это происходит в режиме боя, когда враг уже начеку и имеет повышенную концентрацию на поиске противника. Кроме того, любой NPC, в поле зрения которого находится игрок, выполняет дополнительный тест и запускает рейкаст луч из камеры от своей точки до позиции Джоэла для того, чтобы понять, блокирует ли что-то его видимость. Изначально таким образом проверялся каждый сустав в модели Джоэла, но этот вариант оказался не слишком рабочим. В результате остановились на проверке двух условий: попадает ли рейкаст в его грудь либо верхнюю часть головы. Это реализовать оказалось довольно просто, но в то же время эффективно.

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



У охотников есть множество навыков. Как мы видим, большинство из них строится вокруг боя: ближнего, дальнего, при прямом наступлении или подходе с фланга. Большинство последовательностей боевых действий в The Last of Us начинается с того, что игрок, пребывавший в невидимом режиме, оказывается обнаружен. Поэтому сейчас мы сосредоточимся на двух навыках, наиболее критических в режиме стелса: на расследовании и поиске.

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

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

Давайте рассмотрим, как эти системы запускают в работу режимы поиска и расследования.

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

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

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

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


Часть территории не видно, но ее можно проверить

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

Прежде всего, врагам может понадобиться укрытие. Как они узнают, где лучше спрятаться? В данном случае снова используется система очков укрытий, но уже с другими критериями. Нам уже не нужны открытые посты, теперь нам нужна защита для юнита. Игра выполняет подсчет 20 ближайших точек для укрытия на карте в пределах радиуса NPC, а затем запускает 4 рейкаста на каждый фрагмент укрытия, чтобы оценить, сможет ли игрок убить врага в перестрелке с этой позиции. Если система решает, что место безопасно, оно оценивается по степени удобства достижения и тому, не нужно ли ИИ при этом перемещаться перед игроком. Укрытия ранжируются по этим критериям, после чего персонаж выбирает пост, набравший наибольшее количество очков. При этом стоит учитывать, что наиболее предпочтительная позиция в данный момент может потерять свою актуальность уже спустя 5 секунд, стоит лишь игроку переместиться в другую точку, и тогда последующие расчеты других наилучших мест могут повлиять на темп битвы.


Выбор наилучшего укрытия с учетом позиции игрока

Теперь, когда подходящее укрытие выбрано, как охотникам лучше скоординировать свою атаку?

Перво-наперво в этот момент игра создает ссылку на местоположение игрока. Генерируется пакет данных с его координатами и соответствующей временной меткой. Ее полезно знать для того, чтобы засечь, сколько времени прошло с тех пор, когда игрока было видно в последний раз. Если Джоэла заметит другой NPC, будет сгенерирован новый пакет данных. Всякий раз, когда это происходит, сгенерированные данные совместно используются и другими NPC, находящимися поблизости. Охотники будут продвигаться к локации игрока: одни используя укрытия, чтобы застать его врасплох, другие напролом. Роли между NPC распределяет боевой координатор. Среди них: фланкер, передовой, сопутствующий стрелок, выжидающий наводчик.

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

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



Зараженные


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

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

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

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

Давайте посмотрим на то, как работает звук в игре.

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


Радиус распространения звука

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

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



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

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



Учитывая, что противостояние зараженным во многом основано на скрытности, как щелкун и бегун будут искать игрока, если услышат что-то подозрительное?

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

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

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

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

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

image

Элли


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

Одна из первых демонстраций игры в январе 2013 года показывала то, как игроки покидают карантинную зону Бостона. Тэсс и Элли под предводительством Джоэла пробирались сквозь небоскреб, переполненный бегунами и щелкунами. В этом демо персонажи-компаньоны должны были держаться поодаль от места чистки от зараженных, но в то время их ИИ был еще сырым и не соответствовал задуманному Naughty Dog.

Итак, давайте поговорим о приоритетах ИИ в случае с Элли:

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

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

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


Определение допустимых позиций для Элли на основе положения Джоэла в случае, когда они прячутся за укрытием

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

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

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


Режим следования в укрытии


Режим защиты в укрытии

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

Когда Элли обзаводится настоящим оружием, она использует его только в том случае, когда игрок первым нападает на врага или же находится в опасности. Стоит вам убить пару противников и вновь спрятаться за укрытием, как Элли тоже прекратит атаковать и последует за вами. В редких случаях она также может поделиться с Джоэлом аптечкой или боеприпасами, если находится рядом. Это связано с особенностями системы инвентаря и будет действовать только тогда, когда у самого игрока нет нужных припасов.

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

И остается еще один немаловажный приоритет.

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

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

Заключение


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

О важности левел-дизайна, или как не сломать кор игры плохим лэйаутом

26.01.2021 10:19:42 | Автор: admin

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

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

Для начала немного об игре. War Robots это мобильный сессионный PvP-шутер про огромных роботов. Игроки здесь делятся на две команды и сражаются в одном из режимов: захват маяков или дезматч. Кор-геймплей формируют следующие механики:

  • Стрельба;

  • Перемещение;

  • Режимы боя.

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

Особенности стрельбы

Автоматическая вертикальная наводка

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Самонаводящиеся ракеты и урон по площади

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

На примере карты Dead City можно видеть, что большая часть укрытий низкая (отмечены красным), но есть и высокие (отмечены зеленым).

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

Наглядный пример изображен на картинке ниже. За узким укрытием робот не может избежать урона по площади, а за соседним широким может.

Разная дистанция стрельбы

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

Ниже два фрагмента одной и той же карты Rome. На ней хорошо виден контраст между пространствами с разным количеством укрытий.

Другой пример карта Factory. На ней есть зона для ближней (красная рамка) и средней (зеленая рамка) дистанции боя. То есть, акцент сделан только на две дистанции из трех. И так со всеми нашими картами.

Почему мы не используем три дистанции на каждой карте? Это обусловлено размером карт и совокупностью механик, которые не позволяют нам этот размер увеличить. Бой длится 10 минут, в нем участвует 12 игроков. Увеличивая размер карты, мы не сможем равномерно распределить геймплей по всем ее зонам и при этом сохранить длительность боя в пределах 10 минут.

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

Особенности перемещения

Управление

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

  • Делаем пространства просторнее и шире: арены достаточно большие для возможности маневрировать; коридоры достаточно широкие, чтобы не цепляться за стены при движении; мосты и рампы достаточно широкие, чтобы с них случайно не упасть.

  • Никаких элементов платформера: если игрок может где-то пройти или куда-то запрыгнуть, это должно быть легко не нужно заставлять его сражаться с управлением. Например, на карте Castle есть пропасть, которую игроки могут без проблем перепрыгнуть. Для этого не нужно подходить к самому краю обрыва или разбегаться перед прыжком.

Низкая скорость

Большинство наших роботов имеет относительно низкую скорость в сравнении с дальностью пушек. Это повлияло на типовые размеры карт, предрасположенные к определенным дистанциям боя. Так, у нас есть маленькие карты для ближней дистанции боя (800х800 м), средние для средней (1000х1000 м) и большие для дальней (1200х1200 м). При этом карты максимального размера многие игроки уже воспринимают как слишком большие: они успевают заскучать на них, пока идут от спавна к точке столкновения.

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

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

Во-первых, мы не используем сложных траекторий вроде зигзага.

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

Во-вторых, мы упрощаем заходы на возвышенности.

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

В-третьих, мы следим за частыми развязками движения.

На изображении ниже неудачный пример с карты Powerplant. Если игроку нужно захватить маяк в низине, он спрыгивает вниз, а обратно может подняться только по двум рампам, расположенным в противоположных концах карты. Это неудобно и долго. Хорошим решением было бы добавить подъемы ближе к маяку.

Размеры роботов

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

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

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

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

Чтобы новые Титаны и роботы не испытывали проблем с перемещением в дальнейшем, мы ввели метрики высоты и ширины роботов: чтобы обычный робот помещался в низком проходе, он должен быть не выше 25 метров. В свою очередь, чтобы Титан там точно не застрял, он должен быть не ниже 28,5 метров.

Прыжки и полет

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

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

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

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

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

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

Килл-зоны на картах

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

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

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

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

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

Особенности режимов

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

Domination

Это основной режим игры, и все карты строятся в первую очередь под него. Его особенности:

  • На карте 5 маяков;

  • 2 команды по 6 игроков;

  • У каждой команды своя база со спавнами;

  • Контроль маяков приносит команде очки;

  • Побеждает команда, первая набравшая заданное количество очков.

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

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

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

Зоны спавна команд мы размещаем по одной для каждой команды в разных концах карты.

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

Но в режиме Domination есть одна проблема: игрокам слишком долго идти от спавна до зоны столкновения с врагом, особенно на больших картах. Эту проблему удалось решить в новом режиме Beacon Rush, который в итоге самым стал популярным в игре.

Beacon Rush

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

Введение дополнительных спавнов привело к некоторым положительным изменениям в геймплее:

  • Сократилось время сближения с врагом: игрокам теперь не нужно долго идти от стартового спавна до точки столкновения;

  • Повысилась динамика боя: столкновения на маяках стали более ожесточенными, ведь игроки теперь спавнятся прямо на них;

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

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

Team Deathmatch

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

  • 2 команды по 6 игроков;

  • Цель уничтожение вражеских роботов;

  • Побеждает команда, уничтожившая всех роботов противника.

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

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

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

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

Free for All

Последний режим каждый сам за себя:

  • всего 6 игроков;

  • цель уничтожить вражеских роботов;

  • побеждает игрок, совершивший наибольшее количество убийств.

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

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

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

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


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

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru