Conectar jugadores: cómo funciona Unity Multiplayer
Una de las principales fuentes de quebraderos de cabeza a la hora de desarrollar un videojuego es, sin lugar a dudas, la implantación de un sistema multijugador. El nivel de detalles, la complejidad en el desarrollo e incluso en la búsqueda y solución de fallos y problemas el multijugador son algunas de las características propias de cualquier sistema que se tenga que sincronizar y comunicar con múltiples instancias de un proyecto.
Como ya hemos visto anteriormente Unity nos ofrece una variedad de servicios que pretender hacer nuestra vida, como desarrolladores, mucho más fácil. Es ahí donde encontraremos también el servicio de Unity Multiplayer, un servicio que mediante componentes y una API (interfaz de programación de aplicaciones) de bajo nivel nos permitirá crear e implementar funciones de red de forma sencilla y rápida.
Lo primero que deberemos hacer es aceptar las condiciones EULA (Licencia de usuario final) del sistema y accederemos a la configuración básica del servicio. Hay que destacar que el servicio de multiplayer de Unity no es totalmente gratuito y según la configuración del mismo y de las características que necesitemos (CCU (usuarios concurrentes), Live Server, etc) el sistema calculará de forma aproximadamente el coste mensual del servicio.
Unity Network Manager
Para empezar a usar las opciones de Multiplayer necesitaremos tener un objeto en nuestra escena que contenga el componente NetworkManager. Este componente nos permitirá configurar las características del proyecto (creación de instancias, control de escenas, control de estados, matchmaking,…). Si añadimos también el componente de NetworkManagerHUB dispondremos también de algunos controles de interfaz de usuario para poder interactuar con nuestro controlador.
Configurando el Player
El siguiente paso sería configurar el objeto correspondiente al jugador para poder enviar los datos necesarios al servidor. Para ello añadiremos el componente NetworkIdentity a nuestro objeto. Deberemos activar la opción “Local Player Authority” para poder controlar el movimiento de nuestro objeto a través del servidor. Una vez asignado el componente podemos registrar nuestro objeto como jugador en el controlador. Para ello volveremos al objeto de NetworkManager y en las opciones de SpawnInfo asignaremos el objeto del jugador en la opción de PlayerPrefab. Como podremos ver en las opciones podemos realizar acciones de Spawing (creación de objetos en vivo) con otros tipos de objetos como puede ser el caso de enemigos.
Antes de continuar, hablemos un poco sobre cómo funciona el concepto de multijugador en los videojuegos online. Para simplificar el ejemplo consideraremos un juego en el que simplemente habrá dos jugadores online. En este caso el servidor creará las diferentes instancias de los jugadores y las ubicará en el mundo virtual, enviando sus posiciones a los dos clientes. Cuando un cliente interactúe con el proyecto sólo moverá a su jugador y enviará la información correspondiente al servidor que a su vez la comunicará al segundo cliente para que este sea capaz de representar el movimiento del primer jugador. Habiendo aclarado esto podemos entender que de los 2 jugadores debemos diferenciar cuál corresponde a nuestro jugador para que sea el que procese el Input.
Controlando al jugador
Unity nos lo pone fácil simplemente debemos añadir la referencia a la librería de networking (using UnityEngine.Networking;) y hacer que la clase del PlayerController herede de la clase NetworkBehaviour (public class PlayerController : NetworkBehaviour). Gracias a esto podremos usar simplemente isLocalPlayer para determinar si ese PlayerController corresponde a nuestro usuario o al de otro jugador. Con esto podremos mover a nuestro PlayerController en local, pero las otras instancias del juego que estén conectadas no verán ningún cambio, para eso debemos enviar los cambios de posición de nuestro PlayerController.
Además de usar isLocalPlayer en nuestro código podemos usar también una función que al crear la instancia sólo afectará al jugador local, para ellos debemos sobreescribir la función OnStartLocalPlayer dentro de nuestro PlayerController (public override void OnStartLocalPlayer() {} ) y especificar dentro de la función todo aquellas acciones a ejecutar sobre nuestro jugador local en el momento de instanciarlo.
Por último para poder sincronizar los datos de los clientes a través del servidor debemos enviar y recibir la información para ello simplemente deberemos añadir el componente NetworkTransform a nuestro objeto Player, este componente sincronizará los datos de posición y rotación entre clientes.
Estos componentes son aplicables a cualquier objeto que debamos sincronizar entre clientes como puede ser en el caso de disparos, obstáculos que sean desplazados por los usuarios, etc.
La funcionalidad de Multiplayer nos aporta muchas más variables con las que interactuar y que controlar (retardos, pérdidas de paquetes, incoherencias entre los tiempos de retardo, etc), pero a su vez nos permite grandes posibilidades y es uno de los recursos por los que optan muchos de los videojuegos que podemos encontrar actualmente. Esto es un pequeño ejemplo a modo de introducción de cómo funciona el servicio de Unity de Multiplayer, pero este servicio es muy amplio y extenso como para mostrarlo en su totalidad aquí, así que no dudes en buscar más sobre este servicio y todas sus posibilidades.
¿Te atreves a crear un proyecto multijugador usando Unity Multiplayer? Déjanos tu comentario
Curso relacionado: Curso Superior de Diseño y Desarrollo de Videojuegos