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:
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.
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:
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:
El GamePlayer es creado del GamePlayerPrefab cuando el juego empieza:
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.
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;
}
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.