Version: 5.5
Converting a single-player game to Unity Multiplayer
Network Clients (clientes de red) y Servers (servidores)

Multiplayer Lobby (Lobby Multi-jugador)

Many multiplayer games have a staging area (often known as a “lobby”) for players to join before playing the actual game. In this area, players can pick options and set themselves as ready for the game to start.

El NetworkLobbyManager es un NetworkManager especializado que proporciona un lobby para juegos de Unity Multi-jugador. Este incluye:

  • Limite en la cantidad de jugadores que pueden unirse
  • Soporte para varios jugadores por cliente con un limite en la cantidad de jugadores por cliente
  • Previene que los jugadores se unan a juegos en progreso
  • Estados listos por jugador, para que el juego empiece cuando todos los jugadores estén listos
  • Datos de configuración por jugador
  • Re-unirse al lobby cuando el juego haya terminado
  • Funciones virtuales que permiten una lógica personalizada para eventos de lobby
  • Una interfaz de usuario simple para interactuar con el lobby

Abajo hay unas funciones virtuales NetworkLobbyManager llamadas en el servidor:

Todas las funciones del servidor tienen implementaciones vacías predeterminadas, excepto para OnLobbyServerPlayersReady, el cual cambia ServerChangeScene con la PlayScene.

Abajo están las funciones virtuales NetworkLobbyManager llamada en el cliente:

Todas las funciones cliente de arriba tienen una implementación vacía predeterminada.

Objetos Jugador Lobby

Hay dos tipos de objetos jugador - cada uno que tiene una ranura prefab en el NetworkLobbyManager. Las ranuras se pueden ver en esta captura de pantalla.

El LobbyPlayer es creado del LobbyPlayerPrefab cuando un jugador se une al lobby:

  • Un LobbyPlayer para cada jugador
  • Creado cuando el cliente se conecta, o un jugador se agrega
  • Existe hasta que el cliente se desconecta
  • Mantiene la flag ready ("lista) para este jugador para el lobby
  • Maneja comandos mientras se está en el lobby
  • Agrega scripts de usuario a este prefab para mantener datos del jugador específicos al juego
  • Este prefab debe tener un componente NetworkLobbyPlayer

Minimum Players (Jugadores mínimos)

El campo “Minimum Players” representa la cantidad mínima de jugadores “Ready” (listos) en el Lobby para que el juego (Match) empiece. Si la cantidad de clientes conectados es más que el valor de “Minimum Players”, entonces se espera a que todos los clientes conectados estén “Ready” (listos) para empezar la partida (Match).

Por ejemplo si “Minimum Players” es configurado a 2:

  • Empiece una instancia del juego y empiece como Host (anfitrión). Luego en el UI del Lobby del juego presione “Start” para su jugador. Usted todavía estará en modo Lobby ya que la cantidad mínima de jugadores Ready para que empiece el juego es 2.
  • Empiece dos o más instancia del juego y empiece los Clients ahí. No importa si la cantidad de “Minimum Players” esté configurado a 2. Espere a que todos los - 3 en este caso - jugadores conectados estén Ready (listos).
  • Presione “Start” en el UI del Lobby para un jugador. Los dos jugadores están Ready (listos), pero todavía en modo Lobby. Presione “Start” en el UI del Lobby para el último jugador y ahora todos los jugadores se movieron a modo de Game (juego).

GamePlayer

El GamePlayer es creado del GamePlayerPrefab cuando el juego empieza:

  • Un GamePlayer para cada jugador
  • Se crean cuando la escena del juego empieza
  • Se destruye cuando se re-ingresa al lobby
  • Maneja comandos mientras se está en el juego
  • Este prefab debe tener un componente NetworkIdentity

El componente NetworkLobbyPlayer es utilizado para objetos LobbyPlayer. Este proporciona algunos callbacks de funciones virtuales que pueden ser utilizados para un comportamiento de lobby personalizado

    public virtual void OnClientEnterLobby();
    public virtual void OnClientExitLobby();
    public virtual void OnClientReady(bool readyState);

La función OnClientEnterLobby se llama en el cliente cuando el juego ingresa al lobby. Esto sucede cuando la escena del lobby empieza por la primera vez, y también cuando se devuelve al lobby de la escena del juego.

La función OnClientExitLobby se llama en el cliente cuando el juego se sale del lobby. Esto sucede cuando se cambia a la escena de juego.

La función OnClientReady se llama en el cliente cuando el estado ready del jugador cambia.

Agregando el Lobby al Juego

Proceso de agregar un NetworkLobby a un juego multi-jugador (sin utilizar el paquete de asset multiplayer-lobby):

  • Cree una nueva escena lobby

  • Agregue la escena a los build settings, como la primera escena

  • Cree un nuevo game object en la nueva escena, re-nómbrela a LobbyManager

  • Agregue el componente NetworkLobbyManager al objeto LobbyManager

  • Agregue el componente NetworkManagerHUD al objeto LobbyManager

  • Abra el inspector para el componente NetworkLobbyManager

  • Configure la ranura LobbyScene del NetworkLobbyManger a la escena que contiene el objeto LobbyManager

  • Configure la ranura PlayScene del NetworkLobbyManager a la escena principal de juego para el juego

  • Cree un nuevo gameObject y re-nómbrelo a LobbyPlayer

  • Agregue el componente NetworkLobbyPlayer al LobbyPlayer

  • Cree un prefab para el LobbyPlayer y borre la instancia de la escena

  • Configure la ranura LobbyPlayerPrefab al prefab LobbyPlayer

  • Configure la ranura GamePlayerPrefab al prefab para el jugador en el juego principal

  • Guarde la escena.

  • Ejecute el juego

  • Esta versión del NetworkLobbyManager utiliza la interfaz de usuario OnGUI como el NetworkManagerHUD. Para una mejor interfaz de usuario utilice el paquete asset multiplayer-lobby.

El NetworkLobbyManager tiene muchos callbacks de funciones virtuales que pueden ser utilizadas para un comportamiento personalizado de lobby. Lo más importante es OnLobbyServerSceneLoadedForPlayer que es llamado en el servidor para cada jugador a medida están en transición del lobby al juego principal. Este es un lugar ideal para aplicar los ajustes del lobby al objeto de juego del jugador.

    // for users to apply settings from their lobby player object to their in-game player object
    public override bool OnLobbyServerSceneLoadedForPlayer(GameObject lobbyPlayer, GameObject gamePlayer)
    {
        var cc = lobbyPlayer.GetComponent<ColorControl>();
        var player = gamePlayer.GetComponent<Player>();
        player.myColor = cc.myColor;
        return true;
    }

Proyecto ejemplo

Hay un proyecto ejemplo en el Unity asset store que utiliza el NetworkLobbyManager y proporciona un GUI para el lobby. Este puede ser utilizada como punto inicial para crear un jugador multi-jugador con un lobby.

Proyecto ejemplo de Lobby

Converting a single-player game to Unity Multiplayer
Network Clients (clientes de red) y Servers (servidores)