Redes
Last updated
Needle Engine incluye una solución de red completa para experiencias multijugador. Se puede lograr un estado de mundo compartido, chat de voz, persistencia de sesión y más con nuestros componentes y API de red. Puedes poner tus propios componentes en red eligiendo entre redes automáticas o manuales.
Las redes en Needle Engine se basan en . Las redes automáticas utilizan datos JSON para facilitar su uso. Para casos de uso complejos y requisitos de alto rendimiento, utilizamos .
Se puede acceder a la funcionalidad principal de red utilizando this.context.connection
desde un componente. El servidor backend predeterminado conecta a los usuarios a salas. Los usuarios en la misma sala compartirán estado y recibirán mensajes entre sí.
En el centro de las redes en Needle Engine se encuentra el concepto de salas sincronizadas. Cada sala tiene una ID, y los usuarios se conectan a una sala proporcionando esta ID. Las salas se almacenan en un servidor, y los usuarios pueden unirse y salir de las salas en cualquier momento. Cuando un usuario se une a una sala, recibe el estado actual de la sala, aplica ese estado actual a su escena y luego escucha los cambios en el estado de la sala. Cuando un usuario sale de una sala, deja de escuchar los cambios en el estado de la sala.
El estado de la sala se almacena como datos JSON en el servidor, por lo que todos los cambios son persistentes. Esto significa que el estado de la sala no solo es útil para las redes, sino también para persistir acciones de un solo usuario.
Needle puede proporcionar IDs de solo visualización para las salas. Al acceder a una sala con una ID de solo visualización, el usuario no podrá interactuar con la sala, pero podrá ver el estado actual y recibir actualizaciones en vivo. Esto es útil para presentaciones o demostraciones.
Los objetos en una sala pueden ser propiedad de un usuario. Esto significa que solo el propietario de un objeto puede cambiar su estado.
Por defecto, los objetos no tienen propietario.
Componentes como DragControls
solicitarán la propiedad de un objeto antes de moverlo realmente.
En componentes personalizados, puedes controlar cómo se maneja la propiedad.
Puede que no se requiera propiedad, puede que se permita la transferencia automática de propiedad a otro usuario, o que la propiedad solo se transfiera mediante una acción específica.
Cuando un usuario abandona una sala, los objetos propiedad de ese usuario serán eliminados o se les restablecerá la propiedad, dependiendo de cómo se creó el objeto.
Añade un componente SyncedRoom
a tu escena. Por defecto, esto utilizará la infraestructura de red proporcionada por Needle.
Añade un componente SyncedTransform
a un objeto cuyo movimiento quieras sincronizar a través de la red.
Añade un componente DragControls
al mismo objeto.
Ejecuta el proyecto. En el navegador, haz clic en "Join Room" y copia la URL.
Abre una nueva ventana del navegador y pega la URL. Ahora deberías ver el mismo objeto en ambas ventanas. Intenta arrastrar el objeto en una ventana y mira cómo se mueve en la otra ventana.
El componente DragControls
, como muchos otros componentes de Needle, tiene soporte de red incorporado.
La propiedad se transferirá a quien empiece a arrastrar el objeto.
SyncedRoom
Gestiona la conexión de red y la conexión a una sala.
SyncedTransform
Gestiona la sincronización de transforms.
SyncedCamera
Genera un prefab para cualquier usuario conectado a la sala que seguirá su posición.
VoIP
Gestiona conexiones de audio voz sobre IP, acceso al micrófono, etc., entre usuarios.
ScreenCapture
Gestiona el compartir pantalla a través de las API web.
Networking
Utilízalo para personalizar la URL del backend del servidor. También permite configurar un servidor local para desarrollo.
DragControls
Gestiona el arrastre de objetos. La propiedad se pasará automáticamente al último usuario que arrastre un objeto.
Duplicatable
Gestiona la duplicación de objetos. Los objetos duplicados se instancian para todos en la sala.
Deletable
Gestiona la eliminación de objetos. Las eliminaciones se sincronizan a través de la red.
DeleteBox
Gestiona la eliminación de objetos que tienen un componente "Deletable" cuando se arrastran a un volumen de caja.
PlayerSync
Potente componente que instancia un objeto específico para cada jugador conectado.
PlayerState
Añade este componente a los objetos asignados a PlayerSync
.
PlayerColor
Componente simple para colores específicos del jugador. A cada usuario se le asigna un color aleatorio al unirse a una sala. Este componente asigna ese color al material principal del objeto.
WebXR
Gestiona la sincronización de avatares de usuario (manos y cabezas).
Los campos de tus propios componentes pueden ser conectados en red muy fácilmente. Los cambios en el campo se detectarán automáticamente y se enviarán a todos los usuarios de la sala. Los cambios también se persisten como parte del estado de la sala, por lo que los usuarios que se unan a la sala más tarde también recibirán el estado actual del campo, asegurando que todos vean los mismos datos.
Para conectar automáticamente en red un campo en un componente, decóralo con el decorador @syncField()
:
::::code-group :::code-group-item Sincronizar un número
::: :::code-group-item Sincronizar el color de un objeto
::: ::::
Ten en cuenta que syncField tiene un parámetro opcional para especificar un método que debe llamarse cuando el valor cambia. Este método debe definirse en la misma clase.
::: tip Configuración de proyecto personalizado
Si estás utilizando una configuración de proyecto personalizado, necesitas tener experimentalDecorators: true
en tu archivo tsconfig.json
para que los decoradores syncField funcionen. Los proyectos creados con Needle Starters tienen esto habilitado por defecto.
:::
A menudo, querrás crear y destruir objetos en tiempo de ejecución, y por supuesto estos cambios deberían sincronizarse a través de la red.
El componente PlayerSync
simplifica este proceso instanciando automáticamente un objeto específico para cada jugador conectado.
Cuando un jugador sale de la sala, el objeto se destruye para todos los usuarios.
Además, Needle Engine proporciona dos métodos de alto nivel:
🏗️ Ejemplos de código en construcción
Needle Engine también proporciona una API de bajo nivel para enviar y recibir mensajes. A esto lo llamamos "redes manuales". Los principios son los mismos, pero tienes control total sobre el envío y la recepción de mensajes y cómo manejarlos.
Envía un mensaje a todos los usuarios en la misma sala:
Puedes suscribirte a eventos en la sala usando una clave específica. Normalmente, querrás que esto coincida con la cancelación de la suscripción:
Suscribirse en onEnable
y cancelar la suscripción en onDisable
.
Con este enfoque, no se recibirán mensajes mientras el objeto esté deshabilitado.
O suscribirse en start
y cancelar la suscripción en onDestroy
.
Con este enfoque, se seguirán recibiendo mensajes mientras el objeto esté deshabilitado.
Cancelar suscripción a eventos:
Al enviar mensajes de red, la API de bajo nivel te permite decidir si ese mensaje debe ser persistido (guardado en el estado de la sala) o no (solo enviado a los usuarios actualmente en la sala). Para persistir un mensaje, asegúrate de que tenga un campo guid
. Este campo se utiliza típicamente para aplicar los datos del mensaje a un objeto específico, proporcionando el guid de ese objeto. Si quieres apuntar a un objeto específico (y, por lo tanto, incluir un campo guid
) pero quieres que los datos no se persistan, establece el campo dontSave
en true
en tu mensaje.
Todos los mensajes persistentes se guardan en el estado de la sala y se enviarán a los usuarios que se conecten más tarde. Los mensajes no persistentes solo se envían a los usuarios actualmente en la sala, lo cual es útil para efectos (como reproducir un efecto de sonido) que no tienen sentido para los usuarios que actualmente no están en la sala. Opcionalmente, puedes incluir un campo deleteOnDisconnect
en tu mensaje para eliminar este mensaje en particular cuando el usuario se desconecte.
Para eliminar el estado de un guid específico del almacenamiento del backend, establece la clave del mensaje en delete-state
y apunta a un objeto específico con su guid: { guid: "guid_to_delete" }
.
Existen varias flags de depuración que se pueden utilizar para profundizar en los mensajes de red.
Estas se pueden añadir a la URL de la página, como https://localhost:3000/?debugnet
.
?debugnet
Registra todos los mensajes de red entrantes y salientes en la consola
?debugowner
Registra todas las solicitudes y cambios de propiedad en la consola
?debugnetbin
Registra información adicional para mensajes binarios entrantes y salientes
Los siguientes eventos están disponibles para escuchar en tus componentes. Describen eventos de red comunes a los que podrías querer reaccionar en tus componentes, como tú mismo u otro usuario uniéndose o saliendo de una sala.
Por defecto, las escenas de Needle en red se conectan a la infraestructura en la nube gestionada y proporcionada por Needle. No se necesita configuración adicional y actualmente no hay costos adicionales por usar este servicio.
Típicamente, esto funcionará bien para alrededor de 15-20 usuarios en la misma sala. Una vez que tu proyecto madure, puedes actualizar a una solución de red más grande/mejor/más fuerte, alojando tu propio servidor de red.
Puede que quieras alojar tu propio servidor de red para despliegues más grandes o para tener más control sobre la infraestructura e implementación de red.
La instancia de servidor predeterminada de Glitch es pequeña y solo puede manejar una cantidad limitada de usuarios. Si esperas que más de 15-20 personas estén en tu escena al mismo tiempo, deberías considerar alojar tu servidor de red en otro lugar (como en Google Cloud o AWS). :::
::::code-group :::code-group-item Fastify
::: :::code-group-item Express
::: :::code-group-item Integración personalizada
::: ::::
Las siguientes opciones están disponibles:
options.endpoint
string
Opcional. Endpoint relativo del servidor. Por ejemplo, /socket
iniciará el endpoint websocket en tuserver/socket
. Por defecto es /
.
options.maxUsers
number
Número máximo de usuarios concurrentes en un servidor. Por defecto es 50
.
options.defaultUserTimeout
number
Tiempo en segundos después del cual un usuario se considera desconectado. Por defecto es 30
.
process.env.VIEW_ONLY_SALT
string
Valor de "sal" utilizado para generar IDs de sala de solo visualización a partir de IDs de sala regulares. Por defecto utiliza un valor de sal predefinido.
process.env.NEEDLE_NETWORKING_S3_*
string
Habilita el almacenamiento S3. Consulta a continuación la lista completa de variables de entorno que necesitas configurar para esto. Cuando no se configura, se utiliza el almacenamiento predeterminado (archivos JSON en disco).
El servidor de red gestionará automáticamente la conexión y desconexión de usuarios, la recepción y envío de mensajes, y la persistencia del estado de la sala.
::: tip Diferentes ubicaciones de servidor para desarrollo local y alojado
Si estás trabajando en código de red personalizado, puede que quieras usar diferentes ubicaciones de servidor para el desarrollo local y la aplicación alojada. Puedes configurar URLs de servidor individuales en el componente Networking
:
El estado de red se almacena por defecto en disco en el servidor como archivos JSON en el directorio /.data
.
Cada sala tiene su propio archivo, y el estado se envía a los clientes que se conectan cuando se unen a una sala.
Opcionalmente, el estado de red se puede almacenar con un proveedor de almacenamiento compatible con S3. Utiliza las siguientes variables de entorno para habilitar el almacenamiento S3:
Para propósitos de prueba y desarrollo, puedes ejecutar el paquete de red de Needle Engine en un servidor local. Hemos preparado un repositorio configurado para alojar el paquete websocket y facilitarte esto.
Sigue las instrucciones en el README para configurar el servidor. El servidor se ejecutará en wss://localhost:9001/socket
por defecto.
Añade el componente Networking
a tu escena.
Pega la dirección del servidor local en el campo Localhost
del componente Networking
.
Needle Engine utiliza valores predeterminados razonables para peerjs. Si quieres modificar esos valores predeterminados, puedes llamar a
con tu configuración personalizada. Esto se puede utilizar para modificar el proveedor de alojamiento para los servidores ICE/STUN/TURN, por ejemplo cuando utilizas tus propios servidores WebRTC.
::: warning Con fines informativos. Utiliza las API proporcionadas por Needle Engine en su lugar. Normalmente, no necesitas interactuar directamente con estos formatos de mensajes, ya que la API de red de bajo nivel ya maneja el análisis de mensajes y te proporciona los tipos correctos. La información aquí se proporciona para usuarios avanzados que deseen comprender los formatos de mensajes subyacentes o implementar sus propias soluciones de red. :::
Los mensajes se envían en formato JSON. Siempre tienen un campo key
que describe el tipo de mensaje y un campo data
que contiene la carga útil del mensaje. El campo data
puede ser cualquier objeto serializable en JSON.
::::code-group :::code-group-item Unirse
::: :::code-group-item Salir
::: :::code-group-item SalaUnida
::: :::code-group-item SalaAbandonada
::: :::code-group-item UsuarioUnidoASala
::: :::code-group-item UsuarioAbandonóSala
::: :::code-group-item EstadoSalaEnviado
::: ::::
::::code-group :::code-group-item InformaciónConexión
::: :::code-group-item syncInstantiate
::: :::code-group-item syncDestroy
::: :::code-group-item Ping
::: :::code-group-item Pong
::: :::code-group-item EliminarEstado
::: :::code-group-item EliminarTodoEstado
::::
::::code-group :::code-group-item SolicitudPropiedad
::: :::code-group-item RespuestaPropiedad // Type: OwnershipResponse
::: ::: code-group-item RespuestaTransmisiónPropiedad
::: ::::
Los mensajes Flatbuffer se envían directamente como mensajes binarios.
::::code-group :::code-group-item SyncedTransform ('STRS')
::: :::code-group-item SyncedCamera ('SCAM')
::: :::code-group-item Vec2|3|4
::: ::::
Los mensajes JSON son fáciles de usar y entender, pero suelen ser más grandes en memoria y ancho de banda. Para grandes cantidades de datos, o al enviar actualizaciones rápidas, los mensajes binarios son más rápidos y eficientes. Puedes usar mensajes Flatbuffers en Needle Engine para casos en los que eso sea necesario. Usar Flatbuffers requiere pasos de configuración adicionales, como definir y compilar un esquema de mensaje, y es más difícil de depurar ya que estás tratando con mensajes binarios.
Ten en cuenta que al enviar y recibir mensajes flatbuffer, no hay un campo key
; el tipo de mensaje es parte del esquema Flatbuffer. Lo que envías y recibes a través de la conexión Websocket es un único buffer binario.
Envía un mensaje binario a todos los usuarios en la misma sala:
Suscríbete a mensajes binarios en formato Flatbuffer:
Cancela la suscripción a mensajes binarios:
Antes de poder enviar y recibir mensajes Flatbuffer, necesitas definir un esquema y compilarlo a TypeScript. Luego, registra el esquema con el sistema de red y utiliza los métodos del esquema generados para crear y analizar mensajes.
::::code-group :::code-group-item Registrar un esquema
::: :::code-group-item Enviar Mensajes
::: :::code-group-item Recibir Mensajes
::: ::::
::: tip Mensajes Flatbuffer personalizados y persistencia Actualmente, los mensajes binarios personalizados no pueden persistirse en el servidor de red. Modifica el servidor de red y añade tus esquemas flatbuffer personalizados para asegurar que la propiedad guid pueda procesarse. :::
Needle Engine hace que el complejo tema de las redes sea accesible y fácil de usar. Puedes empezar con las redes automáticas para tus componentes con solo unas pocas líneas de código, y puedes profundizar en las redes manuales cuando necesites más control.
Página traducida automáticamente mediante IA
para duplicar objetos a través de la red.
para destruir objetos a través de la red.
Nuestro servidor de red está disponible en NPM como paquete node.js. El paquete contiene integraciones preconfiguradas para los populares frameworks web y , y puede integrarse en otros frameworks de servidor Node.js también.
::: tip Para experimentos rápidos: Remix en Glitch Puedes remezclar un servidor de red simple funcionando en Glitch desde esta página: haciendo clic en el botón en la esquina inferior derecha.
::: tip Ejemplo en Glitch.com Consulta el código en para un ejemplo de cómo integrar Needle Networking con un servidor Express. :::
Los servidores de red personalizados pueden desplegarse en cualquier lugar, por ejemplo en Google Cloud. Para más instrucciones, por favor consulta este repositorio:
:::
Descarga el ejemplo de servidor local desde
Los componentes Screencapture
(Compartir pantalla) y VoIP
(Comunicación de voz) de Needle Engine utilizan para la red de audio y video. Peer.js utiliza WebRTC internamente.