Note: UNet is deprecated, and will be removed from Unity in the future. A new system is under development. For more information and next steps see this blog post and the FAQ. |
Many multiplayer games can use the Network Manager to manage connections, but you can also use the lower-level NetworkServer and NetworkClient classes directly.
Al usar la API de Alto Nivel, cada juego debe tener un servidor host para conectarse. Cada participante en un juego de varios jugadores puede ser un cliente, un servidor dedicado o una combinación de servidor y cliente al mismo tiempo. Este rol de combinación es el caso común de un juego multijugador sin servidor dedicado.
Para juegos multijugador sin servidor dedicado, uno de los jugadores que ejecuta el juego actúa como el servidor para ese juego. La instancia del juego de ese jugador ejecuta un “cliente local” en lugar de un cliente remoto normal. El cliente local usa las mismas Escenas de Unity y GameObjects como servidor, y se comunica internamente mediante colas de mensajes en lugar de enviar mensajes a través de la red. Para el código y los sistemas HLAPI, el cliente local es simplemente otro cliente, por lo que casi todos los códigos de usuario son iguales, ya sea un cliente local o remoto. Esto hace que sea más fácil hacer un juego que funcione tanto en modo multijugador como en modo independiente con el mismo código.
Un patrón común para juegos multijugador es tener un GameObject que administre el estado de la red del juego. A continuación se muestra el inicio de un script de NetworkManager. Este script se adjuntaría a un GameObject que se encuentra en la escena de inicio del juego. Tiene una interfaz de usuario simple y funciones de manejo de teclado que permiten que el juego se inicie en diferentes modos de red. Antes de lanzar su juego, debe crear un menú más atractivo visualmente, con opciones tales como “Comenzar juego para un jugador” y “Iniciar juego para varios jugadores”.
using UnityEngine;
using UnityEngine.Networking;
public class MyNetworkManager : MonoBehaviour {
public bool isAtStartup = true;
NetworkClient myClient;
void Update ()
{
if (isAtStartup)
{
if (Input.GetKeyDown(KeyCode.S))
{
SetupServer();
}
if (Input.GetKeyDown(KeyCode.C))
{
SetupClient();
}
if (Input.GetKeyDown(KeyCode.B))
{
SetupServer();
SetupLocalClient();
}
}
}
void OnGUI()
{
if (isAtStartup)
{
GUI.Label(new Rect(2, 10, 150, 100), "Press S for server");
GUI.Label(new Rect(2, 30, 150, 100), "Press B for both");
GUI.Label(new Rect(2, 50, 150, 100), "Press C for client");
}
}
}
Este código básico llama a las funciones de configuración para que todo funcione. A continuación se muestran las funciones de configuración simples para cada uno de los escenarios. Estas funciones crean un servidor o el tipo correcto de cliente para cada escenario. Tenga en cuenta que el cliente remoto asume que el servidor está en la misma máquina (127.0.0.1). Para un juego terminado, esta sería una dirección de Internet, o algo suministrado por el Sistema de emparejamiento.
// Crea un servidor y escucha en un puerto
public void SetupServer()
{
NetworkServer.Listen(4444);
isAtStartup = false;
}
// Create a client and connect to the server port
public void SetupClient()
{
myClient = new NetworkClient();
myClient.RegisterHandler(MsgType.Connect, OnConnected);
myClient.Connect("127.0.0.1", 4444);
isAtStartup = false;
}
// Create a local client and connect to the local server
public void SetupLocalClient()
{
myClient = ClientScene.ConnectLocalServer();
myClient.RegisterHandler(MsgType.Connect, OnConnected);
isAtStartup = false;
}
Los clientes en este código registran una función callback para el evento de conexión MsgType.Connect. Este es un mensaje integrado del HLAPI que el script invoca cuando un cliente se conecta a un servidor. En este caso, el código para el controlador en el cliente es:
// Función del cliente
public void OnConnected(NetworkMessage netMsg)
{
Debug.Log("Connected to server");
}
Esto es suficiente para poner en marcha una aplicación multijugador. Con este script, puede enviar mensajes de red utilizando NetworkClient.Send y NetworkServer.SendToAll. Tenga en cuenta que el envío de mensajes es una forma de bajo nivel de interacción con el sistema.