В мире разработки игр на Unity существует немало сетевых фреймворков – поначалу новичок даже может запутаться в их многообразии. Некоторые были созданы самой компанией Unity Technologies (например, Netcode for GameObjects), другие же являются сторонними решениями (Mirror, FishNet, Photon). При выборе подходящего инструмента важно принимать во внимание особенности проекта — от жанра игры до требований к масштабу серверной инфраструктуры и наличию серверной логики, работающей отдельно от клиента. Инструмент, который хорошо работает в не очень сложной пошаговой игре типа Heartstone может показывать себя гораздо хуже в более крупных проектах вроде Call of Duty: Mobile с realtime-мультиплеером и большим количеством одновременных игроков в рамках одной сессии.
Однако для начала давайте разберемся, что вообще представляют из себя сетевые фреймворки и зачем они нужны разработчикам.
Сетевой фреймворк служит своего рода прослойкой между клиентским кодом (то есть игрой) и транспортным уровнем передачи данных. Он берет на себя рутинные задачи по сериализации данных игровых объектов, распределению нагрузок между клиентом и сервером, осуществлению RPC-вызовов и управлению синхронизацией состояния игры (позиции, анимации, здоровье, окружение на уровне и т. д.). Без такого фреймворка разработчику пришлось бы вручную создавать логику для работы всей вышеперечисленной логики.
Фреймворк же предоставляет готовые инструменты для объявления сетевых объектов и вызова методов на удаленных клиентах или сервере, решая проблемы с дублированием логики и разрешением конфликтов при обновлении состояния. Кроме того, он обычно включает высокоуровневые механизмы оптимизации — интерес-менеджмент, предсказания (client-side prediction), интерполяцию, компенсацию лага (lag compensation), — которые позволяют игре работать максимально плавно и корректно даже при колебаниях качества соединения.
В целом, сетевые решения можно условно разделить по нескольким критериям:
- Модель работы (Client-Server, Peer-to-Peer, Dedicated Server, Listen Server).
- Тип синхронизации (событийная, реплицированная через объекты, ручной RPC-подход).
- Производительность (пропускная способность, задержки, потребление ресурсов).
- Удобство интеграции (API, документация, пользовательский опыт, поддерживаемые платформы).
- Архитектура (включает ли в себя фреймворк серверную часть, поддерживает ли облачные сервисы).

Photon
Photon — это целая экосистема сетевых решений от Exit Games, включающая несколько продуктов, ориентированных на разные типы проектов: от простых кооперативных игр до сложных детерминированных проектов. Наиболее востребованы следующие продукты для Unity:
- Photon PUN (Photon Unity Networking) — «классическая» версия Photon, давно используемая в производстве. Облачный сервис (с опцией Self-Hosted) со встроенными компонентами для синхронизации объектов, RPC-вызовов и т. д.
- Photon Fusion — более современный вариант с гибкой архитектурой и режимами, позволяющими использовать полноценный авторитетный сервер.
- Photon Quantum — мощное решение для детерминированной симуляции, полезное в соревновательных играх, требующих точного расчета, минимальных лагов.
Также помимо полноценных сетевых фреймворков Photon предоставляет доступ к библиотекам, реализующим текстовый и голосовой чаты.
В Photon Unity Networking по умолчанию используется облачный сервер Photon, к которому подключаются все клиенты. Тем не менее, при необходимости есть возможность хостить собственный сервер. Синхронизация основана на концепте комнат. Все синхронизируемые объекты (имеющие компонент PhotonView) синхронизируются через периодические события (пакеты), а RPC (Remote Procedure Call) используется для вызовов функций на удаленных клиентах.
Photon Unity Networking имеет ряд ограничений, среди которых следует выделить отсутствие авторитетного сервера из коробки – реализовывать его придется самостоятельно. Стоимость использования фреймворка зависит от показателя CUU (Concurrent Users, одновременные пользователи).
Этот фреймворк хорошо подойдет для обучения основам разработки сетевых игр и для создания проектов небольшим онлайном до 16 игроков.
С помощью PUN, например, сделана игра Pixel Gun 3D

Photon Fusion является более современной альтернативой PUN. Он позволяет использовать авторитарный сервер, на котором обрабатывается вся игровая логика и рассылается клиентам, и предоставляет более гибкие возможности для синхронизации игрового состояния. Производительность у Photon Fusion лучше, чем у PUN, так как используется улучшенная система отправки пакетов.
Этот фреймворк больше подходит для крупных и сложных игр с большим количеством игроков.
Photon Quantum является наиболее продвинутым решением в этой линейке. Он позволяет создавать детерминированную симуляцию путем запуска одной и той же логики на всех клиентах, результаты выполнения которой будут идентичны при одинаковых входных данных. Идея заключается в том, что фреймворк пересылает между клиентами только пользовательский ввод, на основании которого и работает игровая логика. Photon Quantum позволяет разработчикам сфокусироваться на разработке игровых механик, а не на написании сетевого кода и логики синхронизации. Фреймворк прекрасно подходит для создания игр, где крайне важны тайминги и отсутствие задержек (например, в файтингах или шутерах).
Продукты от Photon являются мощными и надежными решениями, на основе которых уже создано множество игр. Тем не менее, они обладают своими минусами и подводными камнями. Отдельно стоит учитывать, что продукты Photon в отличие от полностью бесплатных open-source аналогов являются условно-бесплатными, а стоимость использования напрямую зависит от количества одновременных игроков. Если вы создаете небольшой учебный проект или ваша коммерческая игра находится на стадии разработки, то вы можете использовать бесплатный план, в который входят 20 одновременных игроков. Если же ваша игра с использованием, допустим, Photon Fusion набрала популярность и в нее одновременно играет до 1000 человек, ежемесячная плата за использование фреймворка составит 250$.
Netcode for GameObjects
Netcode for GameObjects — официальная сетевая библиотека, разработанная Unity Technologies. Ее целью является предоставление универсального стандарта для сетевых проектов прямо из коробки в экосистеме Unity, а также плотную интеграцию с сервисами игрового движка.
Главными преимуществами данной библиотеки являются официальная поддержка от разработчиков игрового движка и достаточно низкий порог входа: библиотека позволяет быстро и просто настроить базовую логику для синхронизации игровых сущностей. Netcode for GameObjects рассчитан на средние по масштабу проекты, особенно если они имеют кооперативную или соревновательную составляющую, но при этом не нуждаются в экстремальной оптимизации для большого количества игроков.
Тем не менее, следует учитывать, что фреймворк достаточно новый и все еще находится в стадии активной разработки. Из чего вытекают не самая лучшая оптимизация и риски возникновения различных багов. Важно еще отметить то, что на данный момент с помощью Netcode for GameObjects сделано относительно мало игр, поэтому по многим моментам еще нет наработанной практики, а сообщество у фреймворка не такое большое, как у аналогов от сторонних разработчиков. Из более-менее серьезных проектов можно выделить лишь игру Boss Room, которая является даже не полноценным коммерческим проектом, а лишь демонстрацией возможностей фреймворка.

Исходный код данной игры доступен по следующей ссылке.
FishNet
FishNet — набирающий популярность сетевой фреймворк с открытым исходным кодом, который распространяется бесплатно и развивается силами небольшой команды и сообщества. Разработчики фреймворка делают упор на производительность, гибкую архитектуру с авторитарным сервером и удобную работу с сетевыми объектами Подход с авторитарным сервером гарантирует, что ключевая геймплейная логика будет выполняться именно на нем, а клиенты выступают лишь источниками входных данных. Такой подход позволяет сократить риск читерства и обеспечить детерминированность, что особенно важно в динамичных экшен-играх, где ключевую роль играет точная синхронизация состояний игровых объектов. При этом FishNet предоставляет средства для предсказания и интерполяции, что заметно упрощает создание плавного игрового опыта даже при нестабильном сетевом соединении.
Еще одной важной особенностью FishNet является его модульность, которая в сочетании с открытым исходным кодом позволяет заменять отдельные модули фреймворка на свои собственные.
Несмотря на все вышеперечисленные преимущества, следует понимать, что FishNet обладает достаточно высоким порогом входа и вряд ли подойдет новичкам. Также учитывайте, что фреймворк поддерживается небольшой командой разработчиков и сообществом, что может влиять на выход новых версий и исправление багов.
Фреймворк прекрасно подойдет для мультиплеерных и кооперативных проектов небольших и средних размеров.
С помощью FishNet была разработана инди-игра Cat Warfare.

Mirror
Mirror — еще одно популярное и надежное open-source решение, которое появилось на основе когда-то встроенного в Unity сетевого фреймворка UNet. Сообщество взяло код UNet, исправило часть унаследованных проблем и продолжило развивать проект, внедряя новые возможности. За несколько лет Mirror стал де-факто стандартом для независимых студий, предпочитающих open-source.
Большинство проектов на Mirror строится на стандартной модели авторитарного сервера. Доступно множество различных вариантов сетевых вызовов, в том числе стандартные Command и RPC, а также более продвинутые варианты.
Из преимуществ данного фреймворка можно выделить модульность и модифицируемость, активное сообщество, множество различных гайдов и статей на форумах, а также плагинов, расширяющих функционал Mirror. При этом фреймворк обладает достаточно высокой производительностью.
Mirror прекрасно подходит для разработки онлайн-игр в самых разных жанрах. Тем не менее, с созданием крупных MMORPG могут возникнуть серьезные проблемы, решение которых потребует серьезной оптимизации фреймворка и переписывания некоторых модулей.
На Mirror выпущено множество популярных игр, среди которых VR-шутер Population: ONE, мобильный battle-royale Zooba, самобытный кооперативный инди-проект Liar's Bar и множество других.

Заключение
В целом, выбор подходящего сетевого фреймворка для Unity зависит от множества факторов: от жанра игры и ее масштабов до имеющегося у команды опыта и бюджета на обслуживание серверов или пользование самим фреймворком. И вряд ли на вопрос «А какой же фреймворк мне все-таки выбрать?» получится найти идеально верный ответ. Photon упрощает жизнь за счет облачной инфраструктуры, Netcode for GameObjects приглянется тем, кто предпочитает экосистему Unity и официальную поддержку, FishNet и Mirror, в свою очередь, ценятся разработчиками за открытость исходного кода и активное сообщество.
Впрочем, я бы рекомендовал смотреть в сторону Photon Fusion, если вы намерены разрабатывать серьезную мультиплеерную игру, или Photon Quantum, если во главе угла стоит детерминированность и точность симуляции, а вы не боитесь ECS-подхода. Если же вы предпочитаете open-source решения, то наилучшим выбором будет именно Mirror из-за своей популярности и надежности.
А какой сетевой фреймворк используете вы в своих проектах, и с какими неожиданными проблемами пришлось столкнуться при его интеграции?