Реализация лобби в Unity

Реализация лобби в Unity

Введение

В этой статье разберём, как сделать лобби в Unity на трёх популярных сетевых фреймворках: Photon PUN 2, Mirror и Unity Netcode for GameObjects (Netcode for GO)

Из чего состоит лобби

Чтобы сделать лобби, понадобятся:

  • Подключение к серверу

  • Список доступных комнат (если фреймворк поддерживает)

  • Возможность создания и входа в комнату

  • Отображение подключённых игроков

  • Кнопку запуска игры

Важно: все изменения должны быть моментально синхронизированы между клиентами.

Наиболее популярные фреймворки

1. Photon PUN 2

Плюсы:

  • Простота интеграции
  • Встроенная поддержка лобби
  • Облачные серверы

Минусы:

  • Ограничения бесплатной версии
  • Зависимость от облака

2. Mirror

Плюсы:

  • Открытый исходный код
  • Поддержка собственных серверов
  • Гибкость

Минусы:

  • Отсутствие встроенного списка комнат
  • Необходима собственная реализация лобби

3. Unity Netcode (GO)

Плюсы:

  • Нативная интеграция с Unity
  • Поддержка ECS и Unity Relay

Минусы:

  • Высокий порог входа
  • Объём шаблонного кода
  • Скудная документация

Photon PUN 2 — Простое подключение через облако

Подключение и создание комнаты

PhotonNetwork.ConnectUsingSettings(); PhotonNetwork.JoinLobby(); PhotonNetwork.CreateRoom("Room1", new RoomOptions { MaxPlayers = 4 });

Отображение списка комнат

public override void OnRoomListUpdate(List<RoomInfo> roomList) { foreach (var room in roomList) Debug.Log($"Комната: {room.Name}, Игроков: {room.PlayerCount}/{room.MaxPlayers}"); }

Вход в комнату и запуск сцены

PhotonNetwork.JoinRoom("Room1"); PhotonNetwork.LoadLevel("GameScene"); //запуск инициирует хост через RPC

Mirror — Контроль и гибкость

Создание хоста и клиента

using Mirror; public class LobbyNetworkManager : NetworkManager { public override void OnServerAddPlayer(NetworkConnectionToClient conn) { GameObject player = Instantiate(playerPrefab); NetworkServer.AddPlayerForConnection(conn, player); } }

Отображение списка игроков

List<NetworkConnectionToClient> players = NetworkServer.connections.Values.ToList();

Запуск игры хостом

[Server] public void StartGame() { ServerChangeScene("GameScene"); }

Unity Netcode for GO — Инструмент от Unity

Запуск хоста или клиента

NetworkManager.Singleton.StartHost(); //вроде можно и StartClient();

Передача данных игроков

public class LobbyPlayer : NetworkBehaviour { public NetworkVariable<FixedString32Bytes> playerName = new(); }

Запуск сцены с сервера

[ServerRpc(RequireOwnership = false)] public void StartGameServerRpc() { NetworkManager.Singleton.SceneManager.LoadScene("GameScene", LoadSceneMode.Single); }

Реализация

  • Создайте сцену "LobbyScene" с интерфейсом: кнопка создания комнаты, список игроков, кнопка запуска

  • Передавайте имя игрока через CustomProperties (Photon), SyncVar (Mirror) или NetworkVariable (Netcode)

  • Реализуйте доступ к кнопке запуска только для хоста

  • Сохраняйте данные о подключённых игроках в отдельном компоненте Player или PlayerData

Рекомендации

  • Photon: оптимален для новичков и мобильных проектов

  • Mirror: подойдёт для проектов с собственным сервером и требованиями к расширяемости

  • Netcode: для тех, кто работает в экосистеме Unity и использует Relay или Multiplay

"Лучше всем вместе, чем вдвоём. Поэтому я и создала свой квест"

Вика Культурная

Полезные ссылки

7
2 комментария