En los juegos multijugador, los clientes deben estar sincronizados. Es posible intercambiar paquetes de datos directamente desde su transporte, pero esto puede resultar complejo para desarrolladores con poca experiencia. Entonces, veamos algunas soluciones de red listas para usar para todo tipo de casos de uso.
¡Hola! Soy Dmitrii Ivashchenko, ingeniero de software líder en MY.GAMES. ¡Nuestra serie de artículos sobre el panorama multijugador en tiempo real de Unity en 2023 continúa! El tema de hoy se refiere a las soluciones listas para usar para el modo multijugador en tiempo real que tenemos a nuestra disposición. Empecemos.
En los juegos multijugador, los servidores y los clientes intercambian datos enviando paquetes a través de la red. Para crear un espacio virtual compartido para los jugadores que se conectan desde diferentes ubicaciones, los eventos en el proceso del juego (como los movimientos de los personajes o la creación de objetos) se sincronizan con otros clientes enviándoles paquetes de datos. La parte responsable de enviar y recibir paquetes a través de la red se denomina capa de transporte.
En teoría, es posible enviar estos paquetes llamando directamente a las funciones de envío de su transporte; este enfoque puede volverse rápidamente inconveniente para los desarrolladores que tienen poca experiencia trabajando con juegos multijugador. Por lo tanto, es una mejor idea utilizar uno de los que se enumeran a continuación, en lugar de escribir uno propio desde cero. Veamos esas soluciones.
Unity ofrece dos paquetes Netcode: Netcode para GameObjects (en la etapa de lanzamiento de vista previa), Netcode para Entidades (en modo experimental) y el UNET en desuso. También proporciona el servicio Unity Relay para conectar clientes de juegos; hablemos de eso ahora.
Unity Relay es una forma para que los desarrolladores de juegos proporcionen conectividad mejorada entre jugadores a través de un mecanismo de código de unión, sin la necesidad de invertir en soluciones de terceros, mantener servidores de juegos dedicados (DGS) o preocuparse por las complejidades de la red en juegos multijugador. En lugar de utilizar DGS, el servicio Relay proporciona conectividad a través de un servidor Relay universal, que actúa como proxy.
El servicio Relay permite a los jugadores comunicarse a través de varios protocolos diferentes, incluidos UDP, DTLS y WebSocket seguro (WSS). Después de seleccionar un servidor de retransmisión, los clientes se comunican directamente con el servidor de retransmisión utilizando uno de los protocolos antes mencionados. Las conexiones WebSocket permiten la conectividad multijugador en navegadores que utilizan WebGL.
Relay admite trabajar con cualquier motor de juego. Si utiliza Relay con Unity, se recomienda utilizar Relay SDK, que está integrado con Unity Transport Package (UTP).
Unity Transport es una biblioteca de redes de bajo nivel para desarrollar juegos multijugador. Es la base de Netcode para GameObjects y Netcode para Entidades, pero también puedes usarlo con tu solución.
Unity Transport admite sin esfuerzo todas las plataformas admitidas por Unity Engine, gracias a una capa de abstracción basada en conexión (controlador de red integrado) proporcionada sobre UDP y WebSockets. Puede configurar UDP y WebSockets con o sin cifrado. También puede utilizar canalizaciones para obtener funciones adicionales, como confiabilidad, ordenación de paquetes y fragmentación de paquetes.
Las características principales de Transport 2.0 incluyen soporte adicional para WebGL; esto permite que el paquete Unity Transport se utilice en todas las plataformas compatibles con Unity Engine. Los usuarios de transporte ahora tienen acceso a nuestra implementación de transporte Websocket, con o sin TLS. Los jugadores en movimiento ahora pueden aprovechar la migración de red transparente, generalmente entre torres de telefonía celular. Esta característica está actualmente limitada al lado del cliente y al transporte UDP.
Para trabajar con Unity Transport, debe instalar Unity Editor versión 2022.2 o posterior y también instalar el paquete com.unity.transport
.
Relay funciona con Unity Transport (UTP), que permite a los clientes conectarse que de otro modo no podrían comunicarse debido a restricciones de enrutamiento, como firewalls estrictos.
El relé tiene las siguientes limitaciones:
A pesar de las limitaciones, el servicio Relay es una herramienta poderosa para simplificar la conectividad de los jugadores y brindar una experiencia de juego multijugador fluida.
Dos de las soluciones más populares para el código de red de juegos principal de Relay incluyen Netcode for GameObjects (NGO) y API Mirror Networking.
La mejor práctica recomendada es utilizar NGO (en la mayoría de los casos) porque ofrece un conjunto estable de funciones principales, como variables de red, administración de escenas, llamadas a procedimientos remotos (RPC) y mensajería. Sin embargo, con su simplicidad y facilidad de uso, API Mirror Networking también es ideal para juegos que no requieren el conjunto completo de funciones proporcionadas por NGO.
Photon Realtime es la capa central para juegos multijugador (y soluciones de red más complejas de Photon). Se ocupa de problemas como el emparejamiento de jugadores y la comunicación rápida utilizando un enfoque escalable. Photon Realtime se utiliza tanto en juegos como en soluciones multijugador más específicas.
Photon Realtime no incluye mecanismos de sincronización de simulación y estado del juego como los que se encuentran en las soluciones Fusion o Quantum, sino que se centra en el transporte de mensajes a través de la red.
El término Photon Realtime también abarca nuestro amplio marco de API, herramientas y servicios, que definen la interacción entre clientes y servidores.
Todos los clientes Photon Realtime se conectan a una secuencia de servidores dedicados, divididos en tres tareas distintas: autenticación y distribución regional (servidor de nombres), coincidencia de jugadores (servidor maestro) y juego (servidor de juegos). Todos estos servidores se administran a través de la API en tiempo real, por lo que no necesita preocuparse por ellos, aunque conocerlos ciertamente puede resultar útil.
Photon Cloud es un servicio totalmente administrado que proporciona alojamiento global para clientes de Photon Realtime. El código del juego se comunica con Photon Cloud, conectándose a la nube y utilizando su API para realizar acciones como conectarse, unirse a una sala aleatoria o generar eventos.
En Photon Realtime, los datos de la habitación se pueden guardar y cargar fácilmente, y se pueden configurar webhooks para conectar Photon Cloud con un servidor web externo.
Photon Fusion es una nueva biblioteca de alto rendimiento para la sincronización del estado de la red para Unity. Admite dos topologías de red fundamentalmente diferentes y un modo para un jugador sin conexión de red utilizando una única API.
Fusion está diseñado teniendo en cuenta la simplicidad para la integración en el flujo de trabajo de Unity y ofrece funciones avanzadas como compresión de datos, predicción del lado del cliente y compensación de retraso "listas para usar".
En Fusion, por ejemplo, RPC y el estado de la red se definen mediante atributos en los métodos y propiedades MonoBehaviour
, sin necesidad de un código de serialización explícito, y los objetos de red se pueden definir como prefabricados, utilizando todas las funciones prefabricadas más recientes de Unity.
Fusion utiliza un algoritmo de compresión moderno para reducir los requisitos de ancho de banda con una sobrecarga mínima en el procesador. Los datos se envían como instantáneas comprimidas completas o como bloques parciales y se logra la coherencia posterior. En el último caso, se proporciona un sistema de áreas de interés totalmente personalizable, lo que permite un gran número de jugadores.
Fusion implementa una simulación basada en ticks y funciona en modo compartido o en modo host. La principal diferencia es quién tiene autoridad sobre los objetos de la red, pero esto a su vez determina qué otras funciones del SDK están disponibles.
Fusion se desarrolló para reemplazar dos productos Photon existentes para Unity (Bolt y PUN). Los componentes centrales importantes de Fusion son NetworkRunner
y NetworkObject
. NetworkRunner
puede considerarse como el núcleo de Fusion: hay un corredor en escena que gestiona las operaciones y la simulación de la red.
Fusion ofrece varios NetworkBehaviours
prediseñados para la creación rápida de juegos o prototipos.
Fusion separa el procesamiento de entrada en dos pasos: recopilar la entrada del hardware local y colocarla en una estructura, luego leer esa entrada para cambiar el estado del juego (avanzar en la simulación).
Fusion admite RPC (llamadas a procedimientos remotos) para casos en los que la entrada estándar de Fusion o el uso de propiedades [Networked]
no son la solución más práctica. Para comenzar con Fusion, recomendamos estudiar la Guía de introducción a Fusion.
Photon Quantum es un motor totalmente determinista para juegos multijugador. Se basa en el enfoque de predicción/reversión, que es perfecto para juegos en línea que son sensibles a los retrasos, como juegos de rol de acción, juegos de deportes, juegos de lucha, FPS, etc.
Cuando se utiliza este motor, no es necesario utilizar netcode; Todos los elementos del juego están conectados en red de forma predeterminada y 100% sincronizados. Sólo necesitas crear una simulación con varios jugadores conectados, como cuando se desarrolla una experiencia multijugador local. Los subsistemas deterministas de Quantum garantizan que las simulaciones en cada cliente estén siempre sincronizadas y sin demoras, incluidos: física, bots, búsqueda de rutas y animación.
Los juegos deterministas son inherentemente resistentes a las trampas. La lucha contra los tramposos se lleva a cabo mediante la comprobación de repeticiones o simulaciones de jueces del servidor (la medida antitrampas más eficaz).
La entrada del jugador se envía a los servidores de Photon Cloud y luego se distribuye entre los demás jugadores. Los webhooks se pueden utilizar para conectar su propio backend y complementos para ejecutar código personalizado en el lado del servidor.
Photon Quantum se basa en una arquitectura ECS y se afirma que tiene un alto rendimiento para ejecutar incluso juegos multijugador físicamente intensivos en PC, consolas, realidad virtual y teléfonos móviles.
Las simulaciones codificadas en Quantum no dependen de Unity y pueden ejecutarse en cualquier lugar. Todas las acciones locales se realizan sin demora y las entradas remotas se predicen y revierten. Quantum tiene la capacidad de ver repeticiones. Las repeticiones se pueden guardar en el backend o usar en el juego. Para comenzar, puede consultar la serie Quantum 100.
Normcore es una herramienta de alto rendimiento para agregar un modo multijugador a cualquier proyecto basado en Unity. Normcore incluye física de red, espacios persistentes, chat de voz y soporte XR.
Normcore sincroniza automáticamente todas las transformaciones de objetos cuando le agrega el componente RealtimeTransform
. Esto no requiere ninguna codificación. Además, Normcore ofrece interpolación dependiente del estado y física de red confiable para un movimiento perfecto en cualquier conexión.
Una de las ventajas clave de Normcore es su rápido transporte de datos basado en WebRTC. Utiliza el tamaño de paquete máximo que no causa fragmentación durante la transmisión, lo que acelera el proceso de transferencia de datos. Todos los paquetes de datos en Normcore están cifrados de forma predeterminada, lo que garantiza la seguridad y confidencialidad de los datos del usuario.
Normcore también utiliza un sistema de actualización delta. Esto significa que rastrea todos los cambios desde que se envió el último paquete y, cuando llega el momento de enviar un paquete nuevo, ya sabe qué incluir en él. Esto ahorra recursos y mejora el rendimiento. Las funciones de serialización de datos en Normcore permiten optimizar el uso de la CPU. Todo el código de serialización se genera automáticamente antes de la compilación del proyecto, lo que garantiza un uso rápido y eficiente de los recursos.
Los servidores Normcore operan en regiones de todo el mundo y están conectados a través de una red privada de fibra óptica, que proporciona baja latencia. Puede alojar Normcore en sus propios servidores o permitir que Normcore aloje una copia privada de nuestra infraestructura en la nube por usted.
Mirror Networking es una biblioteca de red de alto nivel para Unity, optimizada para facilitar su uso y confiabilidad. Esta biblioteca está diseñada para simplificar el proceso de trabajar con conexiones de red, permitiendo a los desarrolladores concentrarse en la creación de sus proyectos.
Mirror Networking es compatible con más de una docena de protocolos de bajo nivel y evoluciona y mejora constantemente. Incluye funciones para llamadas a procedimientos remotos y gestión de contexto a través de la red y también admite trabajar con física en aplicaciones en red.
La biblioteca ofrece más de una docena de adaptadores de red integrados y cinco opciones de sistemas de administración de red, lo que permite a los desarrolladores crear versiones personalizadas. También se incluyen varios ejemplos de uso completos para facilitar el proceso de aprendizaje y codificación.
Nakama de Heroic Labs es un popular servidor de juegos de código abierto que te permite poseer toda tu infraestructura en un solo paquete abierto. Nakama incluye todas las API de juegos en tiempo real y funciones sociales y competitivas necesarias.
Equipado con todas las funciones necesarias para tu juego, como multijugador en tiempo real y funciones sociales y competitivas, Nakama te permite personalizar todos los aspectos tanto del lado del cliente como del servidor usando Go, TypeScript y Lua. Con Nakama, puedes crear juegos competitivos multijugador en tiempo real, personalizar algoritmos de emparejamiento, agregar recompensas diarias, crear tablas de clasificación, implementar monedas en el juego y brindar chat en tiempo real.
Fish-Networking es una biblioteca gratuita de código abierto para soluciones de redes en Unity, desarrollada por un diseñador de juegos experimentado. Ofrece un amplio conjunto de funciones que normalmente sólo están disponibles con soluciones pagas.
Las principales ventajas de Fish-Networking son la optimización del ancho de banda y los recursos (lo que puede ahorrar costos de servidor), la compatibilidad con una gran cantidad de jugadores (de docenas a cientos) y funciones integradas como predicción del cliente, compensación de latencia y carga del servidor. equilibrio y soporte para objetos de red anidados.
La siguiente tabla proporciona una descripción general de varias soluciones de red para el desarrollo de juegos en Unity, comparándolas según los protocolos utilizados, las topologías admitidas, la cantidad máxima de jugadores por sesión, la versión mínima de Unity admitida y el estado actual a mediados de 2023.
Solución | Protocolos | Topologías | Máx. jugadores por sesión | Versión mínima de Unity | Estado |
---|---|---|---|---|---|
Código de red para entidades | UDP, WebSockets | Unity Relay, P2P, cliente alojado, DGS | 100 (Limitación del relevo de unidad) | 2022.3 | 🧪 Experimentales |
Código de red para GameObjects | UDP, WebSockets | Relay (a través de Unity Relay), P2P, alojado por el cliente, DGS | 100 (Limitación del relevo de unidad) | 2021.3 | ℹ️ Prelanzamiento |
Fotón en tiempo real | UDP, TCP, HTTP o WebSockets confiables | Retransmisión (sobre nube de fotones), DGS | 32 | 2018.4 | ✅ Listo para producción |
Fusión de fotones | TCP, RUDP, WebSockets | Retransmisión (a través de Photon Cloud), P2P, cliente alojado, DGS | 200 | 2020.3 | ✅ Listo para producción |
fotón cuántico | RUDP | Retransmisión (sobre nube de fotones) | 32 | 2018.4 | ✅ Listo para producción |
Norcore | WebRTC sobre UDP y TCP | Retransmisión (a través de Normcore Cloud) | 100 | 2020 LTS | ✅ Listo para producción |
Redes espejo | KCP , WebSockets | Cliente alojado, DGS, P2P, Relay | 200 | 2020 LTS | ✅ Listo para producción |
Nakama | RUDP | Retransmisión , Autorizado , Cliente alojado | Limitado por el rendimiento del servidor | 2018.4 | ✅ Listo para producción |
Red de pesca | RUDP, WebSockets | Relé, P2P, DGS | 200 | 2019.4 | ✅ Listo para producción |
Fotón PUN | UDP, TCP, WebSockets | DGS, Retransmisión, P2P, Cliente alojado | 32 | 2019.4 | ⚠️ En desuso |
Perno de fotón | UDP, TCP | P2P, DGS | 50 | 2019.4 | ⚠️ En desuso |
UNET | TCP, UDP | Cliente alojado, DGS | Limitado por el rendimiento del servidor | 5.1 | ⚠️ En desuso |
La variedad de soluciones disponibles permite a los desarrolladores elegir una herramienta que se adapte a sus necesidades específicas. Muchas soluciones admiten diferentes tipos de topologías, lo que permite adaptarlas a los requisitos específicos de un juego. Algunas de las soluciones de red antiguas, como Photon PUN, Photon BOLT y UNET, están desactualizadas y no se recomiendan para su uso en nuevos proyectos, mientras que Netcode for Entities y Netcode for GameObjects aún se encuentran en la etapa experimental o de prelanzamiento, que también todavía no permite su uso para la producción.