02/11/2020
Una de las preguntas más comunes entre los desarrolladores que se aventuran en la realidad virtual es si el robusto y familiar sistema de UI de Unity puede funcionar en un entorno 100% inmersivo. La respuesta, para alegría de muchos, es un rotundo sí. Aunque no funciona de manera nativa sin algunos ajustes, es totalmente posible adaptar tus interfaces de usuario existentes o crear nuevas desde cero para que sean completamente funcionales en VR. Este artículo te guiará a través de los conceptos, los desafíos y el proceso paso a paso para lograrlo.

La clave reside en comprender cómo el sistema de eventos de Unity interactúa con el mundo del juego y cómo podemos modificarlo para que entienda las nuevas formas de entrada que introduce la realidad virtual, como el puntero por mirada (gaze-pointer) o los punteros virtuales en el espacio del mundo. A continuación, desglosaremos todo lo que necesitas saber para llevar tus interfaces al siguiente nivel inmersivo.
- El Sistema de UI de Unity: Un Breve Repaso
- El Desafío de la Realidad Virtual: ¿Por qué no funciona directamente?
- La Solución: Adaptando el Sistema con Rayos en el Espacio del Mundo
- Guía Paso a Paso: Convierte tu UI a VR
- Tabla Comparativa: Configuración Estándar vs. VR
- Preguntas Frecuentes (FAQ)
- Conclusión
El Sistema de UI de Unity: Un Breve Repaso
Antes de sumergirnos en la VR, es crucial entender los pilares del sistema de UI de Unity. Este se compone de varios componentes clave que trabajan en conjunto para gestionar la interacción del usuario:
- EventSystem: Es el corazón del sistema. Actúa como un despachador central que procesa y dirige todos los eventos de entrada (clics, toques, etc.) a los elementos de la UI correspondientes.
- InputModules: Son la fuente principal de los eventos que maneja el EventSystem. Unity incluye módulos para entrada de ratón y táctil (como el StandaloneInputModule). Solo un módulo de entrada puede estar activo en una escena a la vez.
- Raycasters: Estos componentes son los verdaderos detectives. Su trabajo es lanzar rayos desde un punto (generalmente la cámara) hacia la escena para detectar con qué elementos de la UI o del mundo físico está interactuando el puntero. Los dos tipos principales son el GraphicRaycaster (para elementos en un Canvas) y el PhysicsRaycaster (para objetos 3D con colliders).
- Graphic Components: Son los elementos visuales con los que el usuario interactúa, como botones, sliders, toggles, etc.
En una aplicación tradicional, cuando haces clic en la pantalla, el InputModule detecta la posición 2D de ese clic. El sistema lo traduce en un rayo que se origina en la cámara y atraviesa esa posición en el viewport. Los Raycasters luego informan qué objetos fueron alcanzados por ese rayo, y el EventSystem elige el más cercano para enviarle el evento de 'clic'.
El Desafío de la Realidad Virtual: ¿Por qué no funciona directamente?
La respuesta corta es que en la realidad virtual no hay una pantalla física sobre la cual mover un ratón. El paradigma de entrada cambia por completo. El sistema de UI de Unity está fundamentalmente orientado a posiciones en una pantalla 2D, lo que presenta dos problemas principales en VR:
- Origen del Puntero: En VR, la interacción no proviene de un clic en una pantalla, sino de un puntero que existe en el espacio 3D. El método más común es el 'gaze-pointer', un rayo que se proyecta desde el centro de la visión del usuario (entre sus ojos). Este rayo no se origina en la cámara del motor de la misma manera que lo hace un clic de ratón, por lo que el sistema estándar no sabe cómo interpretarlo.
- Punteros en el Espacio del Mundo: Otro método es tener un puntero virtual que se mueve sobre un panel de UI flotante en el espacio. Este puntero no está atado a la vista del usuario, sino a los movimientos del ratón o un joystick. Nuevamente, el sistema base de Unity no está preparado para manejar un puntero que se mueve sobre una superficie 3D arbitraria sin una referencia de pantalla.
La Solución: Adaptando el Sistema con Rayos en el Espacio del Mundo
Afortunadamente, el sistema de UI de Unity es lo suficientemente flexible como para ser extendido. La solución pasa por crear nuestras propias versiones de los componentes clave para que trabajen con rayos en el espacio del mundo (world space rays) en lugar de posiciones de pantalla. La estrategia principal es utilizar estos rayos para el raycasting y, una vez que se detecta una colisión, convertir esa información de vuelta a una posición de pantalla virtual que el resto del sistema de UI (botones, sliders) pueda entender.

Para ello, se necesitan clases personalizadas que hereden de las clases base de la UI de Unity. Estas son las piezas clave de la adaptación:
- OVRInputModule: Un módulo de entrada personalizado que reemplaza al StandaloneInputModule y sabe cómo manejar entradas de VR como la dirección de la mirada o los botones de un gamepad.
- OVRRaycaster y OVRPhysicsRaycaster: Versiones personalizadas de los raycasters que, en lugar de usar la posición del ratón, utilizan un rayo explícito en el espacio del mundo para detectar colisiones con la UI y los objetos físicos.
Guía Paso a Paso: Convierte tu UI a VR
A continuación, te mostramos un proceso detallado para transformar una escena con una UI estándar de Unity en una completamente funcional para VR.
Paso 1: Reemplazar la Cámara Estándar
Lo primero es eliminar la `Camera` por defecto de tu escena. En su lugar, debes añadir un prefab específico para VR, como el `OVRCameraRig` del integration de Oculus. Este prefab contiene la configuración de cámaras necesaria para el renderizado estereoscópico y el seguimiento de la cabeza.
Paso 2: Actualizar el Módulo de Entrada
Selecciona el objeto `EventSystem` en tu jerarquía. Verás que tiene un componente `StandaloneInputModule`. Elimina este componente. Luego, añade tu nuevo módulo de entrada personalizado, el `OVRInputModule`. Este nuevo componente necesitará una referencia para saber desde dónde lanzar el rayo. Arrastra el `CenterEyeAnchor` del `OVRCameraRig` a la propiedad `Ray Transform` del `OVRInputModule`. Esto le indica que el puntero será controlado por la orientación de la cabeza del usuario.
Paso 3: Añadir un Puntero de Mirada (Gaze Pointer)
Para que el usuario tenga una referencia visual de dónde está apuntando, es fundamental añadir un puntero. Puedes usar un prefab simple (por ejemplo, un pequeño anillo o punto) y añadirle un script que lo gestione, como `OVRGazePointer`. El `OVRInputModule` lo encontrará automáticamente y se encargará de posicionarlo en el lugar correcto de la escena según donde mire el usuario.

Paso 4: Configurar el Canvas
Cualquier Canvas configurado en modo `World Space` puede ser adaptado. Selecciona tu Canvas y realiza los siguientes ajustes:
- Asignar la Cámara de Eventos: La propiedad `Event Camera` del componente Canvas estará vacía porque eliminamos la cámara original. Arrastra aquí la cámara principal de tu rig de VR (normalmente, la `CenterEyeAnchor`).
- Reemplazar el Raycaster: El Canvas tendrá un componente `GraphicRaycaster`. Elimínalo y reemplázalo por tu `OVRRaycaster` personalizado. Este nuevo componente sabe cómo interactuar con el `OVRInputModule`.
- Configurar Bloqueo: En el `OVRRaycaster`, puedes configurar qué objetos pueden bloquear el rayo del puntero. Es útil ajustarlo a `All` para que objetos 3D sólidos impidan que el puntero interactúe con la UI que está detrás de ellos.
Paso 5: Interactuar con Objetos Físicos
Si quieres que tu puntero de mirada interactúe con objetos 3D del mundo (como palancas o botones físicos), necesitas añadir el componente `OVRPhysicsRaycaster` a tu `OVRCameraRig`. Al igual que el `PhysicsRaycaster` original, puedes usar una máscara de capas (`Event Mask`) para filtrar con qué objetos puede interactuar.
Paso 6: Implementar un Puntero de Ratón en el Espacio del Mundo
Este es un método de interacción muy interesante que combina la familiaridad del ratón con la inmersión de la VR. La idea es que cuando el usuario mire un panel de UI, aparezca un puntero virtual sobre ese panel que puede controlar con el ratón físico.
- Añade un objeto visual (un prefab de puntero) como hijo del Canvas.
- En el componente `OVRRaycaster` del Canvas, arrastra este objeto a la ranura de referencia `Pointer`.
- Añade un script `OVRMousePointer` al objeto Canvas. Este script se encargará de mover el puntero virtual por la superficie del Canvas basándose en la entrada del ratón, pero solo cuando el Canvas esté 'activo' (es decir, cuando el usuario lo esté mirando).
Tabla Comparativa: Configuración Estándar vs. VR
| Componente | Configuración Estándar | Configuración Adaptada para VR |
|---|---|---|
| Cámara | Camera estándar | OVRCameraRig o similar |
| Módulo de Entrada | StandaloneInputModule | OVRInputModule (personalizado) |
| Raycaster de Gráficos | GraphicRaycaster | OVRRaycaster (personalizado) |
| Raycaster de Físicas | PhysicsRaycaster | OVRPhysicsRaycaster (personalizado) |
| Tipo de Puntero | Ratón/Táctil en pantalla | Puntero de Mirada (Gaze) / Puntero virtual en Canvas |
| Origen del Rayo | Desde la cámara, basado en coordenadas de pantalla | Desde un Transform (ej. `CenterEyeAnchor`), basado en un rayo 3D |
Preguntas Frecuentes (FAQ)
¿Puedo usar mi UI de Unity existente en un proyecto de VR?
Sí. Siguiendo los pasos de conversión descritos en este artículo (reemplazando la cámara, el módulo de entrada y los raycasters), puedes hacer que cualquier UI construida con el sistema de Unity y configurada en `World Space` sea completamente funcional en VR.
¿Qué métodos de entrada soporta esta adaptación?
El ejemplo principal se centra en dos métodos muy comunes: el gaze-pointer, donde apuntas con la cabeza y haces 'clic' con un botón de un gamepad o teclado, y el puntero de ratón en el espacio del mundo, que se activa al mirar un panel de UI y se controla con el ratón físico.

¿Por qué el puntero de mirada se alinea con las superficies?
Para una mejor retroalimentación visual y una sensación de conexión, el puntero de mirada no solo se posiciona en el punto de colisión, sino que también orienta su rotación para alinearse con la normal de la superficie sobre la que se encuentra. Esto hace que se sienta mucho más 'pegado' y natural, ya sea sobre un botón de la UI o un objeto 3D.
¿Esta técnica funcionará con controladores de movimiento?
Absolutamente. El principio es el mismo. En lugar de usar la orientación de la cabeza (`CenterEyeAnchor`) como el origen del rayo en el `OVRInputModule`, podrías usar la posición y orientación de un controlador de movimiento. Esto te permitiría apuntar con tu mano, lo cual es una forma de interacción aún más natural en VR.
Conclusión
Lejos de ser un obstáculo, el sistema de UI de Unity demuestra ser una herramienta increíblemente versátil que, con las extensiones adecuadas, se adapta perfectamente a las necesidades de la realidad virtual. Al reemplazar los componentes de entrada y raycasting estándar por versiones personalizadas que operan con rayos en el espacio del mundo, podemos reutilizar toda la lógica y los componentes gráficos que ya conocemos y amamos. Ya sea a través de un simple puntero de mirada o sistemas más complejos con punteros virtuales, las posibilidades para crear interfaces de usuario inmersivas, intuitivas y funcionales en VR son prácticamente ilimitadas.
Si quieres conocer otros artículos parecidos a Interfaz de Unity en VR: Guía Completa puedes visitar la categoría Juegos.
