Final Foe. О разработке сетевого мультиплеера на Unity

Final Foe. О разработке сетевого мультиплеера на Unity

Привет всем!

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

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

Часть 1. Многопользовательская игра - что это?

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

По сути, существует 3 самых распространённых варианта многопользовательской игры:

Локальный мультиплеер
Вариант, при котором двое или более людей одновременно играют на одном и том же устройстве. Не путать с игрой по локальной сети (LAN). Для локального мультиплеера не нужно передавать данные по сети. Разработка почти не отличается от разработки однопользовательской игры. Кстати, в Steam специально для таких игр есть отличная функция Remote Play Together, позволяющая одному игроку подключиться к другому, видеть его экран и управлять удалённо. Эдакий TeamViewer для игр.

Хост-Клиент
Он же Host-Client или Listen Server. Один из игроков одновременно является и сервером и клиентом, т.е. хостом. Остальные игроки - только клиентами. Хост включает сервер на собственном компьютере и подключается сам к себе. Клиенты подключаются к хосту. Все сетевые данные между клиентами передаются через хоста. У хоста всегда нулевой пинг, у удалённых клиентов пинг выше.

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

Final Foe. О разработке сетевого мультиплеера на Unity

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

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

Выделенный сервер, при всех своих преимуществах, потребовал бы от меня постоянно оплачивать хостинг и постоянно администрировать, а возможно и масштабировать этот сервер. Это означало, что после выпуска игры мне бы пришлось регулярно тратить деньги и время на поддержание работоспособности мультиплеера в моей игре. А учитывая, что я планировал продавать свою игру по принципу единовременной продажи (Buy-To-Play) - однажды мог бы настать такой момент, когда игру уже никто не покупает, а поддерживать выделенные сервера для ранее купленных копий игры я должен. И в этот момент математика доходов и расходов начала бы работать не в мою пользу.

А вот вариант "Хост-Клиент" давал мне ряд преимуществ. Во-первых, Final Foe - это PVE-ориентированная игра. Игроки в ней должны сражаться на одной стороне, отбиваясь от монстров. Это значит, что небольшая разница в сетевой задержке между хостом и подключёнными игроками не так критична, как в PVP-ориентированных играх. Во-вторых, для варианта "Хост-Клиент" не требуется постоянно поддерживать отдельный сервер. Если несколько друзей хотят сыграть в Final Foe, то один из них просто запускает игру как хост, а остальные подключаются к нему. И всё, они играют.

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

Final Foe - Multiplayer Gameplay

Часть 2. Доступные сетевые решения.

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

Я расскажу вам о паре сетевых решений для Unity. Однако вы наверняка знаете, что существует немало других игровых движков: Unreal Engine, Godot, российский движок Unigine и остальные. Вполне возможно, что вам подойдёт какой-то другой движок, с какими-то другими сетевыми решениями. Например, в движке Unreal Engine - сетевое решение доступно сразу, "из коробки". В какой-то момент я даже хотел перевести проект Final Foe на Unreal Engine из-за этого. Сравнение Unity и Unreal Engine - это тема для отдельной статьи. И эта тема не так проста и однозначна, как может показаться. Лично для меня, и Unity и Unreal Engine - это очень мощные и функциональные инструменты. Со своими преимуществами и недостатками по отношению друг к другу.

Говоря обобщённо, "сетевое решение" (сетевая библиотека) - это дополнительный ассет с библиотекой кода, в которой весь функционал для передачи данных по сети уже написан. Вам остаётся лишь использовать его в своей игровой логике, следуя документации и обучающим материалам. Скачиваем, добавляем в проект. И после этого вы сразу можете делать то, что вам нужно: синхронизировать передвижение персонажей между клиентами, синхронизировать анимации, визуальные эффекты, звуки, переменные, методы и многое другое. Буквально с помощью нескольких строчек кода. А иногда, просто добавив определённый компонент на игровой объект. Нет необходимости вручную формировать и отправлять пакеты с данными. Это уже написано за вас. Конечно, понадобится изучить документацию и понять, что к чему. Но это всё равно гораздо проще, чем писать абсолютно всю сетевую логику для вашей игры с нуля.

Final Foe. О разработке сетевого мультиплеера на Unity

Больше года назад команда Unity Technologies сделала обзорное сравнение нескольких сетевых решений для Unity. Я вкратце рассмотрю три из них.

Photon PUN 2
В проект интегрируется достаточно просто. В YouTube даже есть цикл обучающих видеороликов на русском языке. У Photon есть собственная сетевая инфраструктура, в которой можно создать лобби для подключения между игроками. Поэтому вам не нужно будет беспокоиться о том, каким образом игроки найдут друг друга в сети и подключатся друг к другу. Однако если в вашей игре будет более 100 игроков одновременно - вам нужно будет платить от 95$ в месяц. Чем больше игроков - тем больше стоимость.

Mirror
Простая интеграция. Понятная и полезная документация. Есть возможность использовать сетевой транспорт Steam. Есть обучающие видеоролики от DapperDino по интеграции в сетевую инфраструктуру Steam для подключения игроков друг к другу с помощью сетевого лобби. Огромное и дружелюбное сообщество в Discord, в котором я неоднократно получал полезные ответы на важные вопросы. У сетевой библиотеки Mirror крайне положительные отзывы на Unity Asset Store и репутация надёжного бесплатного сетевого решения.

Netcode
На данный момент - это официальное сетевое решение от Unity. Оно вышло не так давно, поэтому мне пока не довелось поработать с Netcode и я сужу лишь по тем данным, которые мне удалось узнать. Netcode базируется на сетевой библиотеке MLAPI и активно развивается. В интернете появляется всё больше обучающих видеороликов по этому сетевому решению. На официальном сайте сказано, что настроить подключение Netcode к сетевой инфраструктуре Steam достаточно просто. Было бы интересно испытать данное сетевое решение в будущем.

Часть 3. Mirror + Steam.

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

Без использования статического IP-адреса и правильно настроенных портов - велик шанс, что наладить подключение будет довольно проблематично. Возможно игрокам понадобится использовать дополнительные программы типа Hamachi, эмулирующие локальную сеть между ними. Захотят ли ваши игроки этим заниматься? Вряд ли. Поэтому для подбора и подключения игроков во всех современных играх типа "Хост-Клиент" обычно используются специальные промежуточные сервера. Так называемые "лобби". В заранее определённой сетевой инфраструктуре.

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

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

Если честно, почти до самого финального этапа разработки игры я не был уверен, что у меня получится сделать мультиплеер, и в особенности - настроить взаимодействие с сетевой инфраструктурой Steam.

Примерно за 4 месяца мне удалось добавить мультиплеер на базе Mirror в свою игру. И ещё 1-2 месяца заняла настройка взаимодействия со Steam. Наверное, можно было бы справиться и быстрее. Не могу сказать, что я торопился.

Final Foe. О разработке сетевого мультиплеера на Unity

Часть 4. Послесловие

До выхода моей игры Final Foe в Steam осталось меньше недели! Так что самое время добавить её в желаемое :-)

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

Присоединяйтесь к социальным сетям моей студии Alekliart. Спасибо за внимание!

Моя студия Alekliart в социальных сетях:

40
20 комментариев