Как Fika Productions отправилась в плавание с одноранговым многопользовательским хитом Ship of Fools

Когда компания Fika Productions решила заполнить пробел на рынке кооперативных ролевых игр, ее целью была кооперация на диване. А потом случился 2020 год. Мы встретились с ведущим программистом Дэниелом Кармайклом и разработчиком Янником Вандерлоо, чтобы рассказать о своей игре и исследовать некоторые проблемы, которые им пришлось решить, чтобы вывести Ship of Fools на рынок в сложное для индустрии время.
Что послужило вдохновением для создания "Корабля дураков"? Есть ли у вас коллеги с морским образованием?
Дэниел: Нашим вдохновением было, прежде всего, заполнить пробел на рынке кооперативных roguelight. Мы все поклонники жанра roguelite, и хотя существует множество отличных игр в жанре roguelite, нам казалось, что ни одна из них не справляется с кооперативной частью по-настоящему хорошо.
Тематически нам понравилась идея с лодкой, потому что если лодка тонет, то тонут все. В этом и заключается основная идея: работать вместе, чтобы удержать лодку на плаву. Ни у кого не было морского опыта, и мы не морские обитатели или что-то в этом роде.
В штате нет осьминогов и соленых морских собачек. Есть. Как для вас выглядит исследование рынка?
Дэниел: Наше исследование рынка было всего лишь небольшим исследованием Reddit, но мы получили от него много пользы. На 25-30 сабреддитах, посвященных диванным кооперативам и рогелитам, мы задали вопрос: "Что, по вашему мнению, необходимо для успешной кооперативной рогелитной игры?" Мы получили множество предложений, обобщили их в документе и стали искать совпадения и темы. Этот процесс подтвердил некоторые из наших идей, а также дал нам несколько новых.
Какой момент в работе над "Кораблем дураков" вам больше всего понравился?
Дэниел: У нас в офисе был небольшой прикол. Каждый раз, когда мы выпускали небольшую функцию, кто-то говорил: "У нас есть игра!". И вот однажды мы объединили большую часть игры, которая была действительно важна, я протестировал ее и навсегда запомнил, как сказал команде: "У нас есть игра , которую можно продавать!" И это было совсем другое ощущение. Это был очень гордый момент для нас.
Был ли в разработке Multiplayer особенно сложный аспект, и как вы его преодолели?
Янник: Сетевое взаимодействие в играх обычно простое, когда все управление берет на себя либо хост, либо клиент. Однако все усложняется, когда необходимо разделить управление, например, когда одними элементами управляет локальный игрок, а другими - хост игры.
Снаряды были особенно сложны в этой установке. Мы хотели, чтобы при выстреле они ощущали себя резкими, а для этого нужно было продумать множество сценариев. Более того, когда враг стреляет в ответ, а игрок отражает выстрел, нам пришлось тщательно продумать взаимодействие и убедиться, что оно подходит всем игрокам, даже в ситуациях с высокой задержкой. Приходилось думать о множестве крайних случаев. Особенно как сделать ее быстрой и отзывчивой для обоих игроков.
Дэниел: Еще одна серьезная проблема, с которой мы столкнулись, - это работа в сети. Мы потратили добрых полтора года на разработку игры для локального кооператива, даже не думая об онлайне. И тут бац! Наступила пандемия. Внезапно наша игра, рассчитанная только на локализацию, потеряла смысл, поскольку все остались дома, а не вместе.
Изначально мы стремились к тому, чтобы все происходило лицом к лицу, в моменте. Это было сердце нашей игры. Но во время пандемии наш издатель сказал: "Эй, мы должны выйти в интернет", и мы ответили: "Хорошо, давайте сделаем это". И нам казалось, что нам пришлось переделывать целый год, настраивая каждую часть игры для игры по сети.
Итак, небольшой совет коллегам-разработчикам: всегда помните о сетевой игре с самого начала, даже если вы не готовы к ней на 100%. Проектирование с учетом онлайна - это, как правило, верный шаг, и гораздо проще убрать его позже, чем впихивать уже постфактум.
Расскажите мне подробнее об управлении снарядами и о том, как Netcode for GameObjects оказался здесь на высоте?
Янник: Сетевая игра оказалась уникальным поворотом. У нас нет традиционной настройки Netcode for GameObjects. Вместо этого у нас есть объекты, существующие как на стороне клиента, так и на стороне хоста, каждый из которых знает о действиях другого и о том, кто контролирует ситуацию в каждый момент времени. Они как будто постоянно разговаривают, информируя друг друга о происходящем.
Например, в сценарии с выстрелом пули, если она попадает в цель на стороне хозяина, игра ждет, пока клиент подтвердит попадание. Клиент может согласиться, а может сказать: "Нет, я уклонился от этого" или даже: "Я отразил пулю!". В зависимости от реакции клиента игра корректирует результат, обеспечивая синхронность действий обеих сторон.
Такая настройка обеспечивает большую гибкость. Игроки на стороне клиента могут видеть немедленную реакцию на свои действия, например, на отклонение пули, что делает игру отзывчивой. Однако конечный результат может потребовать корректировки с учетом мнения ведущего, который в случае расхождения может отменить первоначальную реакцию.
Это своего рода танец, в котором полномочия могут меняться то туда, то сюда. Мы пришли к выводу, что самое простое решение - позволить каждой стороне делать свое дело, а затем примирять разногласия по мере их возникновения, основываясь на обратной связи с другой стороной. Это совместный процесс, в котором и хозяин, и клиент вносят свой вклад в ход игры.
Вот небольшое наглядное объяснение для ваших читателей.

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

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

Наконец, здесь мы видим, что происходит, когда клиент, играющий Хинка, отклоняет снаряд. При высоком пинге есть небольшая задержка, поэтому, хотя хост может сначала увидеть, что снаряд попал в лодку, он исправится, как только реакция клиента будет подтверждена. Таким образом, клиент не чувствует задержек - он как будто играет в режиме реального времени, а его действия зеркально отражаются на хосте, чтобы игра была синхронизирована.
Идея заключается в том, чтобы в самый ответственный момент, когда вы делаете выстрел или отражаете атаку, игра реагировала мгновенно, делая процесс Multiplayer незаметным.
Можете поделиться какими-нибудь другими подробностями? Есть ли что-нибудь, что наши читатели могли бы вынести для себя как важный урок?
Дэниел: Мы столкнулись с множеством проблем, но одна из них была связана с управлением памятью. Нам было очень сложно разобраться со сборкой и Addressables, тем более что это была первая многопользовательская игра для всей команды.
Забавно, что в нашей игре не так много активов, но время загрузки в один момент достигло двух минут, что для небольшой игры просто безумие. Это определенно вызвало недовольство со стороны игроков.
Так что, да, мы хорошо усвоили, что нужно поддерживать порядок в памяти и активах. Мы должны были с самого начала закрепить основы.
Что насчет Addressables? Чему конкретно вы там научились?
Янник: С Addressables все довольно просто. Вам нужно распределить свои активы по группам, которые имеет смысл загружать одновременно. Таким образом, вы не загромождаете свою игру вещами, которые даже не используются в конкретной сцене.
Например, в нашей игре есть разные сектора, каждый со своим набором врагов, сцен и декораций. Изначально мы объединили все в одну большую группу, что было кошмаром для времени загрузки. Чтобы упорядочить работу, мы начали группировать активы по секторам. Это значительно улучшило ситуацию, ведь теперь мы можем загружать только врагов или только пейзажи сектора, что в конечном итоге делает все намного эффективнее и плавнее.
Почему вы выбрали Netcode for GameObjects (NGO) для создания сети?
Янник: Мы выбрали NGO для работы с сетью главным образом потому, что она поддерживается Unity. Это означает, что он будет развиваться вместе с платформой и получит долгосрочную поддержку, что очень важно для нас. Кроме того, NGO обладала всеми необходимыми нам функциями.
Главное, чего мы хотели, - это одноранговое соединение, чтобы избежать затрат на сервер, что может быть очень важно для игры, чьи будущие продажи и база игроков неясны. Приобретая NGO, мы были уверены, что делаем надежную ставку как на наши текущие потребности, так и на будущее развитие. Это был разумный выбор - остаться в экосистеме Unity и обеспечить долгосрочную поддержку нашей игры.
Что будет дальше с "Кораблем дураков"?
На данный момент мы выпустили два больших обновления, наполненных свежим контентом, и запустили два DLC, в которых появились новые персонажи, чтобы разнообразить игру. Эти DLC совершенно необязательны, что дает игрокам больше возможностей для выбора, не заставляя их чувствовать себя обделенными, если они решили не брать их. Что самое интересное? Эти крупные обновления контента были запланированы, и, судя по тому, что мы видели, людям они очень понравились.
Что касается того, что будет дальше, то у нас есть планы, но пока мы их держим в секрете. Однако когда мы будем готовы рассказать о будущих обновлениях, вы обязательно будете в курсе.
Интересуетесь разработкой мультиплеера? Изучите раздел Multiplayer в отчете 2024 Unity Gaming Report , чтобы узнать мнение успешных студий, свежие данные о том, почему все больше студий разрабатывают многопользовательские игры, и множество советов, которые помогут вам и вашей команде быть впереди всех.