Devlog: Multiplayer para Realidad Mixta

Devlog: Multiplayer para Realidad Mixta

Thijs ReusThijs Reus
·19 de septiembre de 2025·11 min. de lectura
Tenga en cuenta que esta publicación ha sido traducida automáticamente.

Continuamos nuestra exploración de las capacidades de Realidad Mixta del Meta Quest 3 usando Unreal Engine y el plugin MetaXR que comenzamos en una publicación de devlog anterior.

En esta publicación, miramos agregar capacidades multiplayer usando el excelente VR-Expansion Plugin para Unreal Engine.

Stack Tecnológico

Para esta exploración, estamos usando el siguiente stack tecnológico:

Multiplayer - genial pero complejo

El soporte multiplayer permite que múltiples usuarios compartan la misma experiencia virtual, interactuando con el mundo virtual de manera cooperativa o competitiva. Tales experiencias pueden ser puramente virtuales, permitiendo que los jugadores no necesariamente estén en el mismo espacio físico, o realidad mixta donde los jugadores típicamente están colocalizados en el mismo espacio físico. Esto permite experiencias realmente geniales con múltiples personas, pero desafortunadamente no hay almuerzo gratis.

Soportar multiplayer agrega mucha complejidad técnica a un proyecto (que está mucho más allá del alcance de este artículo de blog), dado que se requiere una configuración cliente/servidor, que inevitablemente agrega latencia a la experiencia debido a la replicación continua de datos entre los clientes (principalmente responsables de la entrada del usuario, renderizar la escena y reproducir audio / animaciones) y el servidor (tiene autoridad sobre todo lo que sucede en el mapa, como física, interacciones y lógica del juego, y replica datos relevantes a todos los clientes relevantes). Notablemente, los clientes de Unreal Engine solo pueden comunicarse con el servidor, y el servidor puede comunicarse con cada cliente, por lo tanto no hay comunicación directa entre clientes.

Especialmente cuando se usa un visor VR, cualquier tipo de latencia debido a la replicación es inmediatamente notable (por ejemplo, cuando la cámara virtual/manos se retrasan detrás de la posición/orientación del visor / controlador físico), lo que puede llevar a mareo por movimiento - así que esto debe evitarse a toda costa.

Gran parte de esta complejidad está afortunadamente ya resuelta por el VR-Expansion Plugin para Unreal Engine, especialmente en el área de replicar elementos VR entre clientes y el servidor para asegurar una experiencia VR fluida. Tiene un excelente proyecto de ejemplo que puede usarse como inspiración y guía para cómo se usa correctamente el plugin.

Cambios para soporte Multiplayer

En comparación con un proyecto VRTemplate por defecto en Unreal Engine, al menos los siguientes cambios notables deben hacerse al usar el VR-Expansion Plugin:

  • Usar un VRPlayerController en lugar de un PlayerController por defecto
  • Usar un VRCharacter en lugar de un Pawn o Character por defecto
  • Usar un GrippableActor (por ejemplo, GrippableStaticMeshActor) en lugar de agregar GrabComponent a un Actor

Una configuración como esta funciona muy bien para experiencias de realidad virtual. Sin embargo, para experiencias de realidad mixta (al menos con el plugin MetaXR) debemos hacer algunos ajustes para que funcione correctamente.

Realidad Mixta requiere ajustes adicionales

Tan pronto como tenemos una experiencia de realidad mixta con el plugin MetaXR que usa una Escena (donde el visor escanea la habitación para identificar elementos como paredes / suelo / techo / muebles), notamos un problema inmediato al usar la configuración de la sección anterior: la cámara está bloqueada en el suelo, en lugar de su posición esperada, sin importar si el visor se mueve hacia arriba o hacia abajo en la realidad.

La cámara está bloqueada en el suelo, lo cual no es ideal
La cámara está bloqueada en el suelo, lo cual no es ideal
Todos los elementos virtuales están en la ubicación incorrecta
Todos los elementos virtuales están en la ubicación incorrecta

Esto está sucediendo porque por defecto el plugin MetaXR tiene una característica World Lock en MRUtilityKit, que usa el ancla del suelo para bloquear visualmente el mundo virtual en su lugar, incluso para actores que no están anclados. Anclar un actor a una Escena asegura que su ubicación/orientación siempre sea consistente con el espacio físico, sin importar cómo fuera la posición/orientación inicial del visor, lo cual es bastante esencial para hacer experiencias de realidad mixta consistentes.

La característica World Lock esencialmente compara la ubicación/orientación anclada del ancla del suelo con la ubicación/orientación del actor del suelo virtual, y compensa el PlayerCharacter por esta cantidad para mover la cámara - efectivamente 'moviendo' todo el mundo virtual para mantenerlo correctamente alineado con el mundo físico. Esto sucede cada tick, para asegurar una experiencia fluida.

Entonces, ¿por qué está la cámara bloqueada en el suelo cuando se usa el VRCharacter, mientras funciona sin problemas con un Pawn / Character por defecto? Aparentemente, uno de los componentes del VRCharacter, a saber NetSmoother, está compensado por -98.15 en el eje Z, lo que tiene el efecto de que normalmente el VRCharacter está ubicado en una coordenada Z de aproximadamente 98.15, asumiendo que el suelo está en la coordenada Z 0. Sin embargo, con la característica World Lock estableciendo la ubicación/orientación del VRCharacter a la diferencia entre la ubicación/orientación del ancla del suelo anclado y el actor del suelo virtual, esto generalmente está alrededor de 0, lo que básicamente mueve todo el VRCharacter (incluyendo cámara y manos) hacia abajo por casi 1 metro virtual.

Para arreglar este síntoma, hemos hecho el siguiente cambio a nuestra subclase VRCharacter:

  • Establecer la posición del componente NetSmoother a (0, 0, 0) en lugar de (0, 0, -98.15)

No hemos observado ningún efecto secundario negativo de este ajuste aún, y la característica World Lock funciona correctamente con ese cambio.

Ubicación del componente Net Smoother ajustada
Ubicación del componente Net Smoother ajustada
La cámara y todos los elementos virtuales están en la ubicación correcta
La cámara y todos los elementos virtuales están en la ubicación correcta

Además, aplicamos los siguientes cambios en nuestra subclase VRCharacter para asegurar que el VRCharacter no se mueva, ya que rompería la inmersión:

  • EnableGravity está deshabilitado
  • GravityScale se establece en 0
  • HMDTrackingOrigin se establece en Stage en lugar de Floor
  • RetainRoomscale se establece en true
  • La locomoción está deshabilitada

Las características del plugin MetaXR solo deben usarse en visores

Para habilitar características multiplayer, se requiere un servidor, idealmente un servidor dedicado que no se ejecute en el visor, para asegurar que el visor tenga tanto rendimiento/batería disponible para el lado del cliente de la experiencia.

Un servidor dedicado típicamente se ejecuta en Windows o Linux, y usar el plugin MetaXR para realidad mixta agrega un poco de desafío en tales configuraciones, dado que la funcionalidad del plugin MetaXR solo funciona en un visor, y no soporta Linux como plataforma fuera de la caja.

Configuración de habitación condicional

Al construir un servidor dedicado (que ya es un poco de desafío en sí mismo) para Windows o Linux, necesitamos asegurar que la funcionalidad MetaXR no se use.

Nuestro punto de partida para esa funcionalidad está en el blueprint BP_RoomSetup, que normalmente comenzaría la configuración de la habitación tan pronto como se crea (en el evento BeginPlay). Para asegurar que esta funcionalidad solo se ejecute en un visor (o cuando un visor está presente, por ejemplo vía AirLink), agregamos las siguientes condiciones a la configuración de la habitación:

  • El PlayerController está controlado localmente, lo que significa que ejecutamos en un cliente
  • El HMD está conectado, lo que significa que un HMD está al menos presente
  • La aplicación no se inició con la opción -unattended
  • La aplicación se ejecuta en VRPreview o una compilación empaquetada
Configuración de Habitación Condicional
Configuración de Habitación Condicional

De esta manera, la configuración real de la habitación solo se hace en un APK ejecutándose en el visor, o una instancia Play-In-Editor por ejemplo vía AirLink. En un servidor dedicado, o un cliente no-VR la configuración de la habitación será ignorada.

Las imágenes a continuación muestran lo que un cliente en el visor y un cliente Windows (no-VR) ven (el otro jugador está representado con 2 manos, un cubo para una cabeza y un cilindro plano para un cuerpo).

Un cliente en el visor ve elementos de habitación
Un cliente en el visor ve elementos de habitación
Un cliente Windows no-VR no ve elementos de habitación
Un cliente Windows no-VR no ve elementos de habitación

Replicar elementos de habitación desde un cliente del visor al servidor y otros clientes todavía está en progreso.

Servidor dedicado para Linux con plugin MetaXR

Por defecto el plugin MetaXR no soporta la plataforma Linux, en su lugar solo soporta plataformas objetivo Win64 y Android. Al intentar construir un servidor dedicado para Linux para un proyecto que contiene el plugin MetaXR, esto normalmente resulta en un error de que la plataforma no está soportada.

Como solución alternativa, el OculusXR.uplugin puede ajustarse para agregar Linux en el array SupportedTargetPlatforms:

...
"SupportedTargetPlatforms": [
	"Win64",
	"Android",
	"Linux"
],
...

La compilación entonces tendrá éxito, sin problemas notables hasta ahora.

Conclusión

La Realidad Mixta es una forma emocionante de crear experiencias únicas que mezclan el mundo real y virtual. Tales experiencias pueden mejorarse aún más permitiendo que múltiples usuarios participen usando características multiplayer, para que puedan cooperar o competir por un objetivo dado.

Nosotros en Immerstory estamos emocionados de apoyar a nuestros clientes con sus experiencias inmersivas, y esperamos compartir más progreso de exploración pronto.

¿Qué experiencia inmersiva te gustaría ver? ¡Déjanos saber!

Recursos Adicionales

La documentación para el plugin MetaXR, específicamente el Mixed Reality Utility Kit que se usó para esta demo, se puede encontrar aquí

Más del blog