El módulo de red de UnityGameFramework (UGF) proporciona una abstracción robusta para manejar la comunicación de datos en videojuegos desarrollados con Unity. Al centralizar la lógica de red, el framework permite a los desarrolladores enfocarse en el flujo de datos y la lógica de negocio en lugar de preocuparse por la implementación de sockets de bajo nivel.
Componente Central: NetworkComponent
La piedra angular de este sistema es el NetworkComponent, ubicado en el espacio de nombres de ejecución del framework. Este componente actúa como un gestor centralizado para todos los canales de comunicación, permitiendo:
- Administrar el ciclo de vida de los canales de red (creación y destrucción).
- Monitorear y distribuir estados de conexión.
- Manejar el despacho de eventos de red hacia otros módulos.
- Soportar topologías de múltiples servidores simultáneos.
Implementación de una Conexión TCP
Para establecer una comunicación basada en el protocolo TCP, se deben seguir una serie de pasos técnicos que aseguran la correcta serialización y envío de paquetes.
1. Definición del Canal de Red
A diferencia de un socket tradicional, UGF utiliza el concepto de INetworkChannel. Para instanciar uno, se requiere el método CreateNetworkChannel especificando el tipo de servicio.
// Ejemplo de creación de un canal de red orientado a TCP
string nombreCanal = "PrimaryChannel";
ServiceType tipoServicio = ServiceType.Tcp;
INetworkChannelHelper helper = new MiNetworkHelper();
INetworkChannel canalPrincipal = networkComponent.CreateNetworkChannel(nombreCanal, tipoServicio, helper);
2. El Rol del Network Channel Helper
La interfaz INetworkChannelHelper es fundamental. Es el lugar donde el desarrollador define cómo se empaquetan los datos, cómo se manejan las cabeceras de los mensajes y cómo se distribuyen los paquetes entrantes a los controladores correspondientes.
3. Establecimiento del Enlace
Una vez creado el canal, se utiliza el método Connect de la instancia del canal para iniciar el handshake con el servidor remoto, proporcionando la dirección IP y el puerto.
Gestión de Eventos de Red
El framework utiliza un sistema de eventos para notificar cambios en la conectividad. Suscribirse a estos eventos es crucial para manejar reconexiones o errores de red:
- NetworkConnectedEventArgs: Se dispara cuando el handshake TCP se completa con éxito.
- NetworkClosedEventArgs: Indica que el canal ha sido cerrado intencionalmente o por pérdida de señal.
- NetworkMissHeartBeatEventArgs: Notiifca cuando no se recibe el "latido" (heartbeat) del servidor en el tiempo esperado.
- NetworkErrorEventArgs: Captura fallos a nivel de socket o de protocolo.
Comunicación con Múltiples Servidores
En arquitecturas modernas de juegos (como MMOs o juegos con servicios distribuidos), es común que el cliente necesite hablar con un servidor de autenticación, un servidor de chat y un servidor de lógica de juego (World Server) al mismo tiempo.
Configuración de múltiples nodos
UGF facilita esto permitiendo la coexistencia de varios canales nombrados de forma única:
// Configuración de conexiones independientes
var authLink = netManager.CreateNetworkChannel("AuthNode", ServiceType.Tcp, new AuthHelper());
var chatLink = netManager.CreateNetworkChannel("ChatNode", ServiceType.Tcp, new ChatHelper());
var worldLink = netManager.CreateNetworkChannel("WorldNode", ServiceType.Tcp, new WorldHelper());
Control de flujo de mensajes
Para enviar datos a un servidor específico, simplemente se recupera el canal por su nombre identificador:
void EnviarDatosAlChat(IMessagePacket packet)
{
INetworkChannel canalChat = netManager.GetNetworkChannel("ChatNode");
if (canalChat != null && canalChat.Connected)
{
canalChat.Send(packet);
}
}
Diagnóstico y Monitorización
El framework incluye una herramienta de depuración integrada conocida como NetworkInformationWindow. Esta utilidad permite inspeccionar en tiempo real:
- El estado actual de cada canal (Conectado, Conectando, Desconectado).
- Direcciones locales y remotas (IP/Puerto).
- Estadísticas de envío y recepción de paquetes.
Esta visibilidad es esencial durante la fase de desarrollo para identificar cuellos de botella o fallos en la lógica de serialización de mensajes sin necesidad de recurrir a herramientas externas de sniffing de red en primera instancia.