Construyendo mi primer juego multijugador con Netcode for GameObjects

Mi nombre es Esteban Maldonado y soy un defensor de desarrolladores para Unity. Mi trabajo es difundir la palabra sobre Unity Gaming Services y crear nuevo material educativo para que los desarrolladores puedan comenzar con las herramientas para su propio viaje de desarrollo multijugador.
Una de esas soluciones es Netcode for GameObjects (NGO), una biblioteca de red de nivel medio de primera parte construida para el motor de juego Unity. Una solución de netcode es esencial en cualquier proyecto de desarrollo multijugador.
Una de las responsabilidades de un defensor de desarrolladores en Unity es crear juegos de muestra que muestren nuestras herramientas, y se me asignó una muestra de NGO – Galactic Kittens.
Sin embargo, aunque he tenido mi buena parte de trabajos profesionales en la industria de los juegos, personalmente tengo poca experiencia haciendo juegos multijugador, por lo que esto iba a resultar no solo una oportunidad de aprendizaje para los desarrolladores que usen la muestra, sino también una experiencia de aprendizaje para mí al hacer el juego en primer lugar.
Junto con mi equipo, desarrollamos el concepto de Galactic Kittens – el nivel de dificultad de la muestra, las mecánicas básicas, las habilidades de los personajes (que fueron eliminadas más tarde), y más.
Para abordar este proyecto de juego de muestra, uní fuerzas con el talentoso equipo de Bromio para hacer que este juego de muestra cobrara vida con activos artísticos pulidos, música y efectos de sonido, y soporte de programación. Nuestro objetivo combinado era proporcionar a los desarrolladores una introducción simple y amigable para principiantes a la construcción de un juego multijugador en Unity con Netcode for GameObjects.
En este blog, cubriré el viaje de desarrollo de Galactic Kittens, desde el prototipo hasta el lanzamiento estable, y cómo puedes aprovechar esta muestra para comenzar tu propio proyecto multijugador.
Antes de sumergirme en su desarrollo, aquí hay un resumen rápido de nuestro nuevo juego de muestra Galactic Kittens. Esta muestra es una aventura espacial cooperativa en 2D diseñada para ayudarte a aprender algunos conceptos básicos de la red multijugador.
La muestra está destinada a enseñarte técnicas necesarias para comenzar con el desarrollo multijugador, tales como:
- Gestión de sesiones de red, con cambio automático de escena
- Sincronización básica de movimiento 2D, incluyendo cambios en hojas de sprites
- Generación de objetos de juego en tiempo de ejecución, en el lado del servidor
- Transferencia de propiedad de los jugadores principales del servidor a su cliente
- Creación de VFX en todos los clientes conectados
- Cómo reproducir efectos de sonido y música para todos los clientes
- Comunicando estadísticas de jugadores y del juego (salud, enemigos derrotados, etc.) y mostrándolas en la interfaz de usuario del juego
Puedes aprender más sobre Galactic Kittens en nuestro sitio web, o descargar la muestra directamente desde GitHub para comenzar a explorar el código.
Aunque no tenía mucha experiencia haciendo juegos multijugador, Unity tiene muchos recursos públicos para ayudar a los usuarios a comenzar a usar NGO.
Con estos recursos, comencé de manera muy simple familiarizándome con conceptos y terminología de red básicos, utilizando nuestra documentación de Unity Multiplayer. A continuación, seguí los tutoriales del proyecto Hola Mundo y estudié las muestras breves disponibles para comenzar a obtener algunos resultados.
Después de algunos intentos y errores, pude hacer un prototipo base simple desde cero.

En este punto, no había lobby personalizado, no había interfaz de usuario real, no había gestión de conexión real – ya te haces una idea. El prototipo consistía en solo dos naves iguales (con tres puntos de vida cada una) que se movían por la pantalla y disparaban un proyectil cúbico cuando presionabas la barra espaciadora. Era suficiente para mostrar la aparición de objetos y la sincronización de movimiento entre clientes.
Era un comienzo, pero sabía que Bromio nos ayudaría a llegar a la meta y convertir esto en una muestra funcional.
Después de mi progreso inicial, comencé a trabajar con Bromio para desarrollar el prototipo en algo más listo para producción. Al igual que yo, no tenían mucha experiencia haciendo juegos multijugador, pero aceptaron el desafío y nos ayudaron a alcanzar nuestro objetivo.
Para trabajar de manera más eficiente, desglosamos el juego en componentes aislados para comenzar el desarrollo en paralelo – con artistas trabajando en activos y programadores trabajando en la lógica central del juego.
Aquí hay un vistazo a la evolución del estilo artístico en Galactic Kittens.
Mientras tanto, el desarrollador principal de Bromio y yo estábamos descubriendo aspectos divertidos y desafiantes de hacer Gatitos Galácticos en una muestra de juego funcional.
Uno de los mayores desafíos en el desarrollo fue la gestión de conexiones y la selección de personajes. Tuvimos que almacenar los datos de los personajes en archivos separados ScriptableObject, que verás cuando descargues el proyecto.
Estos archivos contienen la información necesaria sobre cada explorador espacial, incluyendo qué sprites (jugador y nave) mostrar en la interfaz de usuario y los prefabs que deben generarse para cada jugador una vez que comience la escena de juego.
En la pantalla de selección de personajes, un gran desafío fue asegurarse de reconocer el evento de desconexión de un cliente y manejar ese evento a través de la interfaz de usuario.
Decidimos que los usuarios no deberían poder elegir el mismo personaje, para mostrar cómo los desarrolladores podrían hacer esto en sus propios juegos. (En realidad, es más fácil dejar que los jugadores elijan el mismo personaje ya que no hay restricciones adicionales.)

El siguiente desafío para la gestión de conexiones fue el evento de desconexión de jugadores en medio de una sesión de juego. Esto significaba no solo que el juego tenía que adaptarse a los jugadores que se iban, sino que también tenía que bloquear a otros jugadores de entrar mientras una partida está en sesión. Decidimos hacer que el gestor de conexiones solo permitiera nuevas conexiones mientras la instancia del anfitrión está en la pantalla de selección de personajes. Esta no es una solución única para todos: otros juegos pueden permitir que los jugadores se unan tarde en una sesión en curso, mientras que otros juegos pueden no hacerlo; depende de los desarrolladores decidir qué es lo mejor para su experiencia.
Queríamos mantener el juego simple, sin IA compleja o lógica de comportamiento elaborada para los enemigos o meteoritos que ven los jugadores. De esta manera, podríamos proporcionar una muestra de juego completa sin desviar la atención de mostrar a los usuarios cómo usar la biblioteca NGO.
Como tal, hay dos tipos principales de enemigos y un obstáculo de meteorito:
Meteorito Fantasma Espacial Tirador Espacial
Ambos enemigos eligen un patrón de movimiento aleatorio, mientras que el enemigo Tirador Espacial es el único que realmente dispara láseres enemigos de vuelta. Por favor, consulta nuestra guía para desarrolladores para más información sobre cómo se construyen estos enemigos y cómo puedes agregar tu propia lógica.
Para cuando trabajamos en la batalla contra el jefe, todas las lecciones aprendidas de implementar el lobby del juego, el comportamiento de la nave espacial del jugador y los enemigos simples nos ayudaron a construir rápidamente la experiencia final de la batalla contra el jefe.
Un desafío particular fue cronometrar la alarma de advertencia que escuchas y ves antes de que entre el jefe. Al final, enviamos eventos con RPCs de cliente y servidor para señalar que la experiencia de juego regular había terminado y la batalla final contra el jefe estaba a punto de comenzar.

El comportamiento del jefe está estructurado como una máquina de estados finitos (FSM) que selecciona aleatoriamente qué conjunto de ataques lanzar a los jugadores conectados. Para hacer esto, utilizamos una clase de C# llamada BossController, que maneja la transición de un estado de jefe a otro. Consulta la guía del desarrollador para obtener información sobre el código detrás de esta batalla y cómo puedes agregar tus propios estados de jefe.
El recurso número 1 que nos ayudó a tener éxito en nuestra misión de construir este juego de muestra fue unirse al servidor de Discord de Networking Multijugador de Unity y hacer preguntas a la comunidad. Aquí, pudimos hablar con otros desarrolladores que están creando juegos multijugador y también hablar con los creadores del servicio multijugador de Unity. El conjunto colectivo de conocimientos fue más que suficiente para ayudarnos a llegar a la meta.
Trabajar en Unity significa que puedo colaborar junto a personas expertas en redes que trabajan arduamente para desarrollar recursos y documentación útiles diseñados para ayudar a todos a comenzar con el desarrollo multijugador. El sitio de documentación multijugador de Unity fue útil muchas veces, desde familiarizarme con la terminología básica de redes hasta tratar con la latencia y realmente programar con NGO.
Estamos definitivamente emocionados por Galactic Kittens. Nos gustaría que tú, y los futuros usuarios de NGO, usen esta muestra como un paso en la dirección correcta hacia tu viaje de aprendizaje multijugador. No dudes en ponerte en contacto en el servidor de Discord o foros para hacer preguntas o proporcionar comentarios y sugerencias.
Una de las cosas que estoy ansioso por aprender es cómo agregar pooling de objetos a un ejemplo de juego multijugador. Esta es la técnica que te permite preasignar la memoria necesaria para los objetos que se generan repetidamente durante una sesión de juego. En un experimento anterior, probé esta técnica en un proyecto de Unity fuera de línea y definitivamente puede mejorar la eficiencia en tiempo de ejecución de tu juego. Hemos aplicado esta técnica a Boss Room y otros ejemplos de UGS también.
Si estás comenzando tu propio viaje multijugador, hay muchos recursos que mi equipo en Unity proporciona para facilitarte las cosas.
Te recomendaría comenzar en la página de Netcode for GameObjects, donde puedes familiarizarte con el paquete. A continuación, puedes explorar NGO a través del Galactic Kittensejemplo o dar pequeños pasos con ejemplos breves.
Una vez que estés en tu viaje, te recomiendo unirte al servidor de Discord de Unity Multiplayer Networking y revisar los foros. Y, si sientes que Galactic Kittens es demasiado simple o no es un desafío suficiente, definitivamente te animo a que revises Boss Room, que es un juego de muestra 3D completo que lleva el desarrollo de NGO a un nivel listo para producción.
Para llevar tu juego en línea, Unity Gaming Services puede ayudarte aún más, ya sea que busques agregar los servicios de Lobby o Matchmaker, chat de voz y texto con Vivox, o incluso soluciones de alojamiento como el servicio P2P Relay o Game Server Hosting. ¡Manos a la obra!
Para saber más sobre las tendencias recientes y el futuro del multijugador, lee el Informe de Multijugador de Unity 2022, que agrega los resultados de más de 1,500 respuestas a encuestas en EE. UU., Reino Unido, Japón y Corea.
