Herramientas usadas actualmente
Comunicación por audio
UniVoice se puede usar con FishNet en Unity. Existe un proyecto llamado FishyVoice que combina FishNetworking y UniVoice para proporcionar comunicación de voz sin depender de servicios de terceros
FishyVoice permite:
- Comunicación de voz basada en salas.
- Audio posicional automático.
- Compresión de audio para optimizar el rendimiento.
Otras alternativas de pago
Comunicación por audio y vídeo
FishyVoice y KlakNDI pueden complementarse bien para manejar audio y video en Unity. COn esta estrategia se pueden integrar:
-
Audio con FishyVoice:
- Usar FishyVoice para la comunicación de voz en red.
- Configurar la transmisión de audio posicional si es necesario.
-
Video con KlakNDI:
- Usar KlakNDI para capturar y enviar video en tiempo real.
- Configurar el NDI Sender para transmitir desde una cámara o textura en Unity.
-
Sincronización:
- Asegúrarse de que la transmisión de audio y video esté alineada para evitar desincronización.
- Usa un sistema de timestamps o buffers para mejorar la sincronización.
NDI
Para utilizar NDI (Network Device Interface) en un juego de Unity 3D implementado con FishNet, debes combinar herramientas específicas para el streaming de video con la infraestructura de red proporcionada por FishNet. Aquí está la guía detallada:
1. Configurar FishNet para Networking
FishNet es una solución de red avanzada que admite múltiples plataformas y protocolos, incluyendo Unity Transport 1.0/2.0 y servicios como Relay 14.
- Instalación: Descarga FishNet desde la Unity Asset Store 1 o sigue las instrucciones en su documentación oficial.
- Transporte: Usa FishyUnityTransport para integrar el transporte oficial de Unity, compatible con Relay y cifrado 4.
- Configuración: Define parámetros como
Max Payload Size
yHeartbeat Timeout
según las necesidades de tu juego 4.
2. Integrar NDI en Unity
NDI permite transmitir video en tiempo real a través de la red. Para implementarlo:
Opción A: KlakNDI (recomendado)
-
Descripción: Plugin de Keijiro que soporta envío/recepción de streams NDI 5.
-
Requisitos: Unity 2022.3+, y el SDK de NDI para iOS 5.
-
Pasos:
- Instalar KlakNDI mediante el gestor de paquetes de Unity.
- Enviar video:
- Agrega el componente
NdiSender
a un objeto vacío. - Configura
Capture Method
comoCamera
oTexture
(si usas Render Texture). - Para ocultar la salida en pantalla, renderiza la cámara a una Render Texture y úsala como fuente 25.
- Agrega el componente
- Recibir video:
- Usa
NdiReceiver
para recibir streams y asignarlos a una Render Texture o material.
- Usa
Opción B: Unity-VideoOutput
- Ventajas: Soporta NDI, Syphon y Spout, y es compatible con HDRP/URP 7.
- Limitaciones: Problemas conocidos con resoluciones no estándar y espacios de color 7.
3. Combinar FishNet y NDI
-
Sincronización:
- Usar FishNet para sincronizar eventos del juego (ej: inicio/fin de partida) que activan/desactivan streams NDI.
- Transmite metadatos (ej: posición de jugadores) a través de FishNet, mientras NDI maneja el video/audio.
-
Optimización:
- Asegurarse de que el ancho de banda de NDI no interfiera con FishNet. NDI consume ~100 Mbps en 1080p60, por lo que se recomienda una red local dedicada 810.
- Usa
Max Packet Queue Size
en FishyUnityTransport para priorizar paquetes críticos del juego 4.
4. Plataformas y Consideraciones Técnicas
-
Compatibilidad:
- KlakNDI funciona en Windows, macOS, Linux, iOS y Android 5.
- FishNet soporta consolas (PlayStation, Xbox) y dispositivos móviles 4.
-
Audio: KlakNDI no soporta audio; necesitarás una solución alternativa (ej: Unity WebRTC) 5.
-
Documentación:
- FishNet ofrece guías detalladas pero algunos usuarios reportan falta de ejemplos avanzados 1112.
- KlakNDI incluye ejemplos en su repositorio de GitHub 5.
5. Ejemplo de Flujo de Trabajo
-
Cliente/Host:
- FishNet gestiona la conexión entre jugadores.
- El host usa
NdiSender
para transmitir su pantalla (renderizada en una textura).
-
Clientes:
- Reciben el stream NDI via
NdiReceiver
y lo muestran en un objeto (ej: pantalla en el juego). - FishNet sincroniza acciones como pausar/reanudar el stream.
- Reciben el stream NDI via
Problemas Comunes y Soluciones
-
Stream no visible:
- Verifica que la Render Texture esté asignada correctamente y que el método de captura (cámara/textura) coincida 25.
-
Latencia alta:
- Reduce la resolución del stream NDI o usa formatos como NDI HX3 10.
-
Errores en Android/iOS:
- Asegúrate de tener los permisos necesarios y el SDK de NDI instalado 5.
Comunicación por OSC
Alternativas
Para enviar y recibir mensajes OSC (Open Sound Control) en Unity junto con FishNet, FishyVoice y KlakNDI, aquí tienes algunas opciones que podrían complementarse bien:
- extOSC: Es una de las herramientas más populares para manejar OSC en Unity. Permite enviar y recibir mensajes OSC sin necesidad de escribir código complejo y es compatible con múltiples plataformas.
- UnityOSCProtocolSupport: Un paquete oficial de Unity que facilita la comunicación OSC entre Unity y dispositivos externos. Es una opción más integrada dentro del ecosistema de Unity
- OSCSharp: Una biblioteca ligera para manejar OSC en C#, que podría integrarse con FishNet para una solución más personalizada.
- OSCJack: Ligero y eficiente, ideal para proyectos en tiempo real.
- UnityOSC: Alternativa clásica con soporte para mensajes complejos.
Alternativa recomendada
Para la integración con FishyVoice y KlakNDI, extOSC sería una excelente opción, ya que te permite manejar mensajes OSC de manera eficiente sin interferir con la transmisión de audio y video.
Aspectos a tener en cuenta
- Threading en Unity:
Los mensajes OSC llegan en hilos secundarios. UsarMainThreadDispatcher
(incluido en OSCJack) para ejecutar acciones en el hilo principal. - Firewalls/Puertos:
Abrir los puertos UDP en la red y desactivar firewalls durante pruebas locales. - Formato de Datos:
OSC soporta múltiples tipos (int, float, string). Coordinar con el dispositivo externo el formato exacto de los mensajes.
Para utilizar extOSC en Unity 3D junto con Fishnet y transmitir mensajes OSC, sigue estos pasos:
1. Configuración de extOSC en Unity
-
Importa extOSC: Descarga el paquete extOSC desde el Asset Store y agrégalo a tu proyecto.
-
Crea un OSC Transmitter/Receiver:
- Transmisor (Enviar mensajes OSC):
using extOSC;
public OSCTransmitter transmitter;
void Start()
{
transmitter = gameObject.AddComponent<OSCTransmitter>();
transmitter.RemoteHost = "IP_DESTINO"; // Ej: "192.168.1.100"
transmitter.RemotePort = 9000; // Puerto del receptor
}
void EnviarMensajeOSC(string direccion, int valor)
{
var mensaje = new OSCMessage(direccion);
mensaje.AddValue(OSCValue.Int(valor));
transmitter.Send(mensaje);
}
- Receptor (Recibir mensajes OSC):
using extOSC;
public OSCReceiver receiver;
void Start()
{
receiver = gameObject.AddComponent<OSCReceiver>();
receiver.LocalPort = 9000; // Puerto para escuchar
receiver.Bind("/direccion/osc", RecibirMensaje);
}
void RecibirMensaje(OSCMessage mensaje)
{
if (mensaje.ToInt(out var valor))
Debug.Log($"Valor recibido: {valor}");
}
2. Cómo viajan los mensajes OSC
-
Protocolo UDP: OSC generalmente usa UDP, un protocolo sin conexión que prioriza velocidad sobre confiabilidad.
-
Estructura del mensaje:
-
Dirección OSC: Similar a una ruta (ej:
/jugador/mover
). -
Argumentos: Datos adjuntos (ej:
float
,int
,string
).
-
-
Red local/internet: Funciona tanto en redes locales como remotas, pero requiere configuración de puertos y direcciones IP.
3. Configuración de puertos
-
Solo el receptor necesita puertos abiertos:
-
La máquina que recibe mensajes OSC debe tener el puerto abierto (ej:
9000
). -
El transmisor no requiere puertos abiertos, ya que envía datos a través de un puerto efímero.
-
-
Firewall/Router:
-
Asegúrate de que el firewall permita tráfico UDP en el puerto del receptor.
-
Si es remoto, configura port forwarding en el router del receptor.
-
4. Integración con Fishnet
Fishnet maneja la red del juego, mientras que OSC se usa para comunicación externa (ej: controlar el juego desde Max/MSP, TouchDesigner, o otro software). Para integrarlos:
-
Ejemplo de flujo:
-
Un dispositivo externo (ej: smartphone) envía un mensaje OSC a Unity.
-
El receptor OSC en Unity procesa el mensaje.
-
Usa Fishnet para sincronizar el estado en la red (ej: RPCs o SyncVars).
-
// Ejemplo: Enviar un mensaje OSC y sincronizar con Fishnet
void RecibirMensaje(OSCMessage mensaje)
{
if (mensaje.ToInt(out var valor))
{
// Usar Fishnet para propagar el cambio a todos los clientes
if (IsServer)
RpcActualizarEstado(valor);
}
}
[ObserversRpc]
void RpcActualizarEstado(int valor)
{
Debug.Log($"Estado actualizado: {valor}");
}
5. Consideraciones clave
-
Puertos no conflictivos: Asegúrate de que el puerto OSC (ej:
9000
) no coincida con los usados por Fishnet. -
Rendimiento: OSC sobre UDP es rápido pero no garantiza entrega. Usa TCP si necesitas confiabilidad (extOSC lo soporta).
-
Seguridad: Abrir puertos expone riesgos. Usa solo en redes confiables o implementa autenticación.
Resumen
-
extOSC se configura con un transmisor/receptor en Unity.
-
Los mensajes OSC viajan por UDP a una IP/puerto específicos.
-
Solo el receptor necesita puertos abiertos.
-
Combínalo con Fishnet usando RPCs para sincronizar estados en la red del juego.
Representación 3D del gestor de OVC
Cargar modelos en Unity dinámicamente
- GLTFUtility: Para importar archivos
.glb
/.gltf
en tiempo de ejecución. - UnityWebRequest: Para descargar modelos desde URLs de la aplicación web.
Sistema de Posicionamiento y Permisos en Fishnet
Requisitos:
- Herramienta de posicionamiento: Raycast desde la cámara para colocar objetos.
- Permisos por objeto:
- Visibilidad: Solo jugadores específicos ven el objeto.
- Edición: Solo el propietario o jugadores autorizados pueden mover/modificar el objeto.
Flujo Completo del Sistema
- Jugador abre el menú de modelos:
- Unity carga la lista de modelos desde la API web.
- Muestra miniaturas usando
UnityWebRequestTexture
.
Alternativa:
- Usar Blender en el backend para renderizar una miniatura automáticamente al subir el modelo.
- Usar Three.js en el frontend para generar una vista previa interactiva.
Mostrar Miniaturas en Unity
- Jugador selecciona un modelo:
- Activa la herramienta de posicionamiento con un preview fantasma.
- Al colocar el objeto:
- Fishnet lo sincroniza como
NetworkObject
. - El servidor asigna permisos iniciales (dueño puede editarlo, visibilidad definida).
- Fishnet lo sincroniza como
- Modificación de permisos:
- Menú contextual del objeto (ej: "Hacer público", "Otorgar acceso a JugadorX").
Seguridad y Optimización
-
Validación en el servidor:
- Asegurar que solo usuarios autorizados puedan subir modelos (JWT/OAuth2).
- Sanitizar nombres de archivos para evitar inyecciones.
-
Pooling de objetos:
Reutilizar instancias para modelos frecuentes (ej: árboles, rocas). -
Compresión de modelos:
Usar.glb
cuantizados (Draco compression) para reducir peso.- Compresión Draco para Modelos:
- Usar el paquete glTFast en Unity para importar modelos con Draco.
- Configura tu pipeline web para comprimir automáticamente con
gltf-pipeline
.
- Validación de Modelos en el Backend:
Javascript
Permitir a los jugadores crear lógica visualmente
Estas son dos posibilidades concretas que se han utilizado para permitir a los jugadores crear lógica y comportamientos visualmente, de forma similar a Scratch. Te explico cada una junto con ejemplos y enlaces directos:
1. Unity Visual Scripting (anteriormente Bolt)
Unity Visual Scripting es la solución integrada en Unity que permite crear lógicas complejas mediante nodos visuales sin necesidad de escribir código manualmente. Aunque fue conocida como Bolt en versiones anteriores, ahora es parte oficial de Unity, lo que significa que está optimizada y respaldada por la compañía.
Unity Visual Scripting es ideal si buscas integrarte de forma nativa con Unity y aprovechar una herramienta robusta y bien documentada, que puede ser adaptada para exponer solo una parte de su funcionalidad a los usuarios finales.
Ejemplo y Recursos:
-
Página Oficial de Unity Visual Scripting: tiene documentación, tutoriales y ejemplos que te permitirán familiarizarte con la creación de flujos visuales.
-
**Repositorio de Unity Visual Scripting Samples en GitHub:** Unity Visual Scripting Samples Este repositorio contiene paquetes y ejemplos concretos de mecánicas de juego implementadas con Visual Scripting. Estos ejemplos pueden servirte de base para crear una interfaz in-game simplificada, donde los jugadores puedan, por ejemplo, conectar nodos para definir acciones de objetos en un entorno 3D.
¿Cómo implementarlo? Para integrarlo en el juego, se podría exponer solo los nodos y funcionalidades básicas a los jugadores, simplificando la experiencia. Luego, mediante una capa adicional, interpretar los flujos creados para que ejecuten comportamientos dentro de tu juego. Además, su integración con FishNet debería ser más directa, ya que se encuentra dentro del ecosistema oficial de Unity.
2. Blockly for Unity (UBlockly)
UBlockly es una reimplementación de Google Blockly adaptada a Unity. Al igual que Scratch, ofrece una interfaz basada en bloques que se pueden arrastrar y soltar para formar scripts. Esto permite que incluso usuarios sin experiencia en programación puedan crear lógicas y comportamientos de forma visual.
Ejemplo y Recursos:
- **Repositorio UBlockly en GitHub:** UBlockly - imagicbell/ublockly Este repositorio contiene la implementación de Blockly para Unity, junto con ejemplos de cómo se pueden definir bloques, configurar la lógica y ejecutar el código generado en tiempo real. Verás que incluye demos que muestran cómo los bloques se traducen en código C# y se ejecutan dentro del motor Unity.
¿Cómo implementarlo? Con UBlockly, definirías bloques que representen acciones básicas del juego (movimiento, cambio de color, condiciones, bucles, etc.). Por ejemplo, cuando el jugador conecta bloques para formar un script, este se puede traducir en instrucciones que modifiquen el comportamiento de objetos 3D. Además, podrías combinar esta solución con la lógica de red de FishNet para sincronizar las creaciones y ejecutarlas de manera colaborativa en línea.
Para crear un sistema de programación visual dentro de Unity, similar a Scratch, donde los jugadores puedan definir comportamientos de objetos, puede usarse una estrategia escalable como esta:
1. Elegir un sistema de nodos
Para permitir que los jugadores creen scripts visualmente, puedes usar un framework de nodos:
- XNode – Un sistema gratuito y ligero para crear lógica basada en nodos.
- Bolt (Unity Visual Scripting) – Integrado en Unity, permite programación visual sin código.
- uNode – Otra opción gratuita para lógica basada en nodos.
2. Crear un sistema de arrastrar y soltar
Para que los jugadores puedan arrastrar y conectar bloques, puedes usar:
- UI Toolkit o Canvas UI para diseñar la interfaz de programación.
- EventSystem de Unity para manejar interacciones de arrastrar y soltar.
3. Definir comportamientos de objetos
Cada bloque de código visual debe traducirse en acciones dentro del juego:
- Usa ScriptableObjects para almacenar configuraciones de comportamiento.
- Implementa un sistema de ejecución que convierta los nodos en acciones reales.
4. Guardar y cargar scripts
Para que los jugadores puedan guardar sus creaciones, usa:
- JSON o ScriptableObjects para almacenar configuraciones.
- PlayerPrefs o archivos externos para guardar datos persistentes.
¿Cómo abordar el diseño e implementación de un sistema de programación visual en Unity que funcione junto con FishNet?
1. Diseñar la Arquitectura del Sistema
a) Separación de Capas: Dividir el sistema en módulos bien definidos:
- Interfaz Visual: Donde los usuarios ensamblan bloques o componentes.
- Representación de Datos: Utilizar ScriptableObjects para modelar los bloques, variables, condicionales y ciclos de forma estructurada.
- Motor de Ejecución: Un intérprete o un sistema basado en nodos que transforma la “receta” visual en acciones concretas dentro del juego.
- Sincronización en Red: Cómo se comparten y replican las modificaciones y ejecuciones de estos scripts entre los jugadores, aprovechando FishNet.
b) Seguridad y Aislamiento: Debido a que se trata de un entorno en línea, es crucial implementar validaciones y límites para que las “pequeñas aplicaciones” creadas por los jugadores se ejecuten en un entorno controlado, evitando comportamientos inesperados o potencialmente dañinos.
2. Herramientas y Plugins Recomendados
a) Framework de Nodos y Programación Visual:
- XNode: Es un framework de nodos gratuito y flexible que permite crear interfaces de programación visual. Aunque originalmente está pensado para herramientas de desarrollo, puede adaptarse a un entorno de runtime para que los usuarios creen y editen sus propios flujos de acción.
- Unity Visual Scripting (Bolt): Si bien está más orientado a desarrolladores, podrían usarse sus conceptos para inspirar la interfaz que se ofrezca a los jugadores. La ventaja es que al estar integrado en Unity, se tiene una robusta base para la ejecución de lógica visual.
b) Interfaz de Usuario (UI):
- UI Toolkit o Canvas tradicional de Unity: Utilizar estas herramientas para construir la interfaz “drag-and-drop” donde los usuarios arrastrarán, soltarán y conectarán bloques.
- Una interfaz intuitiva es clave, por lo que podrías combinar paneles visuales, líneas de conexión y menús contextuales para dar retroalimentación inmediata.
c) Representación de los Bloques y Variables:
- Utilizar ScriptableObjects para definir la "receta" de cada bloque (por ejemplo, variables, condicionales, bucles). Esto te permitirá editar, guardar y serializar de forma sencilla los elementos de programación.
- Implementar un sistema que “traduzca” la estructura en ScriptableObjects a instrucciones que se ejecuten en tiempo real.
d) Serialización y Sincronización con FishNet:
- Debido a que el juego es en línea con FishNet, es importante diseñar un mecanismo para que los scripts visuales se puedan guardar/recuperar y sincronizar entre los jugadores.
- Se puede desarrollar un sistema de serialización personalizado que convierta los bloques (o la conexión entre ellos) en una estructura de datos que luego se transmita mediante RPCs o SyncVars de FishNet. Esto asegurará que todos los jugadores vean y ejecuten la misma lógica de comportamiento.
4. Integración con FishNet
Dado que FishNet es la solución de networking elegida:
- Aprovechar la documentación de FishNet: Consulta ejemplos y tutoriales específicos sobre sincronización de datos personalizados. La estructura de datos de tus ScriptableObjects deberá estar adaptada para ser serializable por FishNet.
- Modularidad: Diseña cada parte de tu sistema (la interfaz, el motor de ejecución, y la sincronización) como módulos independientes que se comuniquen entre sí a través de interfaces bien definidas. Esto facilitará el mantenimiento y las futuras mejoras.