Как использовать распределённую власть для многопользовательских кооперативных игр

Когда Arcane Alpacas выпустила первую демо-версию своего захватывающего FPS-шутера Dagger Directive в Steam в начале этого года, общий отклик был отличным – но сообщество дало понять, что они хотят играть в эту игру вместе. Основываясь на этом отклике, команда решила добавить мультиплеер в игру. Они протестировали несколько различных решений, прежде чем в конечном итоге решили использовать набор встроенных мультиплеерных решений, включенных в Unity 6. Мы встретились с программистом и дизайнером Дэниелом Фаулером, чтобы узнать, как они использовали Netcode for GameObjects, Relay и другие сетевые сервисы Unity для подключения игроков, и как Распределенная Автономия (DA) управляет всей операцией с помощью легкой, масштабируемой серверной поддержки.
Давайте начнем с небольшого рассказа о том, как Arcane Alpacas начала и что вы хотели создать.
Дэниел Фаулер, программист и дизайнер: Я основал компанию несколько лет назад. До этого мы – Уэйд Хрибар, Коді Роуланд и я – работали в Oculus над Onward, VR FPS игрой, и мы хотели уйти от работы в крупных компаниях.
Я начал этот проект сам, а затем со временем привлек остальных двоих, по мере необходимости. Я получил контракт на публикацию с MicroProse и затем выпустил демо. Демо прошло очень хорошо, и мы хотели добавить мультиплеер, потому что это был наш самый большой пункт обратной связи от сообщества. С тех пор игра хорошо себя чувствует. Мы запустились, и мы собираемся выпустить пакет контента.
Несколько недель назад мы выпустили обновление сетевого взаимодействия после разговора с командой Unity – они дали нам некоторые отзывы, и мы тоже поделились своими, и мы получили много хороших идей, которые мы рассмотрели и реализовали. Мультиплеер теперь гораздо более стабильный, и мы в основном получили положительные отзывы от сообщества, хотя, конечно, есть еще некоторые проблемы, которые нужно решить.
Это здорово! Что еще происходит с этим проектом?
Я начал этот проект четыре с половиной года назад. В то время мы портили Onward для Quest, поэтому мы брали высококачественную VR-игру для ПК и пытались перенести ее на мобильный телефон. Делая это, нам пришлось убрать кучу вещей – особенно траву, и мы не могли использовать вычислительные шейдеры на Oculus. Я хотел начать проект и посмотреть, как я могу сгенерировать огромное количество травы и сделать это довольно эффективно. В конце концов, я создал собственную систему травы, которая использует Burst compiler для генерации миллионов полигонов травы, мелких растений и цветов, когда игрок перемещается по карте.
Игроки могут выбрать любое время суток для начала своих миссий, и время проходит по мере игры – так что, начиная миссию в 6 утра и подождав час, положение солнца изменится на это время. Мы использовали полностью реалистичное освещение и создали свой собственный шейдер неба. На это также влияет постобработка, поддерживаемая скриптовыми объектами для хранения всех значений и того, как они меняются в течение дня, а освещение и время суток влияют на поведение ИИ и сенсоры.
Я добавил элементы времени суток, потому что хотел поэкспериментировать с реалистичным освещением, так как мы также готовились к созданию второй игры. Это было моим увлекательным занятием на выходных. А потом, через некоторое время, я начал добавлять персонажей, и стало казаться, что у меня есть целая игра. Я немного доработал это и предложил некоторым людям на работе поиграть, и им это понравилось.
Реалистичное освещение и миллионы полигонов травы возможны благодаря тому, что мы используем Universal Render Pipeline (URP) и Forward+ rendering, вместе с GPU Resident Drawer и GPU occlusion culling. Мы использовали SRP batcher до того, как обновились до Unity 6 с Unity 2021.3. Resident Drawer и occlusion culling улучшили производительность примерно на 20% по сравнению с SRP Batcher. Более простые шейдеры и текстуры также помогли с производительностью. Мы проверили, что все это работает, используя RenderDoc, и исправляли проблемы по мере их появления. В конце концов, вы можете играть на SteamDeck с 30-60 fps на средних графических настройках.
Я действительно хотел создать большую открытую среду, которая позволяет игрокам делать все, что они хотят. Это больше похоже на песочницу, чем на что-то вроде Call of Duty, где вы просто идете по одному и тому же коридору с одними и теми же врагами, которые появляются на месте. Я хотел дать игроку свободу выбора, как они подходят к различным целям, и смешать это с временем суток. А затем, с кооперативной игрой, это позволяет им разделиться на отдельных игроков или команды по двое или просто оставаться в большой группе из четырех – это добавляет много.
Мы собираемся расширять игру – у нас есть еще пять миссий в разработке. Мы только что закончили наш первый контент-пак, добавив еще 12 оружий, 14 или 16 вариантов униформы и кучу нового оборудования.
Мне действительно понравились старые Delta Force и Ghost Recon игры, поэтому я хотел создать что-то похожее на них. Мне пришлось сохранить стиль искусства простым, потому что я инженер, а не художник. Я сосредоточился на создании искусства, которое я мог бы сделать – так что, если бы мне пришлось делать всю игру самому, я бы смог. Вот откуда и появился стиль игры. Но я думаю, что это сработало довольно хорошо, смешивая эффекты освещения в реальном времени и постобработку со старыми текстурами и моделями с низким количеством полигонов. Это как бы объединяет много вещей.
Я думаю, что Valheim вдохновил меня, когда он вышел, потому что до этого у меня не было всех эффектов постобработки и освещения, он выглядел гораздо больше как игра из середины 90-х. Затем я увидел, что они сделали с множеством эффектов, которые у них были, и подумал, что я тоже могу это сделать.
Когда ты перешел на Unity 6?
Проект начался в Unity 2019, затем я обновился до Unity 2021.3. Я сидел на этом до конца прошлого года, когда я обновился до Unity 6, просто чтобы протестировать GPU occlusion culling. И это дало нам хорошее увеличение производительности на 15-20%.
Ранее я использовал SRP Batcher с URP и несколькими другими вещами, и я смог отключить все эти вещи и просто использовать GPU occlusion culling. Я не использую LOD, но у него есть настройка для отсечения на основе размера экрана, так что я включил все это, и снова это было улучшение производительности на 15-20%. И теперь у нас игра работает на Steam deck. Я не возвращался назад с тех пор, как увидел увеличение производительности.

Давайте поговорим немного больше о сетевой стороне – как вы используете Relay?
Это в основном для игроков, чтобы им не пришлось настраивать кучу вещей на своем маршрутизаторе. Я пробовал переадресацию портов, когда я потратил несколько дней на тестирование множества многопользовательских систем и смотрел, что хорошо работает. Мы быстро все настроили в начале, но как только мы решили использовать Unity 6 multiplayer для сетевого взаимодействия, я просто продолжил и настроил Relay, и с тех пор мы тестируем таким образом.
Для производительности мы использовали сетевой симулятор, который хорошо работал. Просто подключение к мобильному телефону через точку доступа значительно помогло нам с тестированием производительности.
Вы также использовали Распределенную Автономию. Как это произошло?
Я подумал о создании многопользовательского режима для этой игры после того, как мы выпустили демо-версию. Самая большая обратная связь заключалась в том, что людям хотелось кооперативной игры – мы знали, что это будет важно, но думали отложить это на вторую игру.
Но с объемом обратной связи и после разговора с нашим издателем, мы решили сесть и посмотреть, сколько времени это займет. Я попробовал Photon, затем систему Fusion от Photon и посмотрел на несколько других библиотек. Я думал о том, чтобы просто создать свою, а затем решил попробовать Netcode for GameObjects. Я решил попробовать Распределенную Автономию, потому что в целом вся игра была готова – я не хотел иметь дело с запросами и одобрением изменений владения GameObjects.
Поскольку это кооперативная игра, обман игроков не является нашей проблемой – если они обманывают с друзьями, то это уже их дело. У нас также есть читы в игре, так что они могут включить бесконечные патроны и многое другое – так что если они дублируют объекты, это не имеет значения.
Это помогло мне решить, что я буду использовать DA. Мы смогли быстро настроить это, чтобы другие два участника могли работать над завершением контента, пока я сосредоточился на всех сетевых вопросах. Я оценил, что нам потребуется 12 или 13 недель, чтобы все завершить, и в итоге это заняло около 14.

Вы использовали Relay, так что я предполагаю, что иногда вы запускаете его в режиме прямого подключения?
Да. Я также настроил прямое подключение, чтобы игроки могли запускать его самостоятельно и позволять своим друзьям подключаться напрямую к ним. Им нужно настроить переадресацию портов на своем маршрутизаторе, но у меня есть инструкции, как это сделать. Но тогда нет миграции хоста, так что, если хост отключается, игра просто заканчивается для всех.
Эта функциональность больше нужна, если мы когда-либо закроемся как студия или если Unity закроет серверы реле или что-то в этом роде, игроки все равно смогут хотя бы играть в игры с прямым подключением, надеюсь, какое-то время.
Это имеет смысл. Это очень перспективно и также хорошо для игроков, так что это здорово слышать.
Практически каждая игра, над которой я работал за последние 15 лет, была многопользовательской, и это была проблема везде, где я был – что-то неожиданно отключается, и тогда нам приходится спешить, чтобы что-то исправить. Я хотел опередить эти вещи.
Вы упоминали миграцию хоста и передачу прав собственности в обсуждениях. Как вы относитесь к ценности, которую это приносит? Это хорошее дополнение к вашей игре и помогает в разработке?
Миграция хоста, особенно, была почти безшовной. Снова, это одна из тех вещей, которая всегда была проблемой в играх, над которыми я работал в прошлом, когда хост внезапно исчезает, и тогда нам нужно переключить кучу вещей и решить, кто что владеет и все такое.
Но было много вещей, которые просто работали. Я занимаюсь этим уже очень давно, так что я вижу, как это происходит, и вначале я очень подозрителен. Но у нас также не было проблем, или если мы сталкиваемся с небольшой проблемой, то я просто смотрю документацию, и обычно это как: "О, я забыл отметить галочку, которая говорит автоматически передать этот игровой объект следующему человеку," или что-то в этом роде. Это было просто вопросом того, чтобы убедиться, что я правильно настроил вещи, так что если я столкнусь с проблемами, я могу быстро их исправить с этой системой.
Посмотрите Dagger Directive в раннем доступе на Steam и посмотрите последнее обновление команды здесь. Узнайте больше о Распределенной власти и других многопользовательских решениях Unity и найдите истории от разработчиков Unity на нашей странице ресурсов.
