Hace ya un tiempo que Unity integró en su motor gráfico soporte nativo para ciertos dispositivos o cascos de realidad virtual. En este post vamos a comenzar a utilizarlo y veremos como nos facilita la vida en comparación a nuestros primeros desarrollos para el DK1 allá por el 2012 (4 años ya…😅)

En primer lugar creamos un proyecto vacío de Unity (5.3 o superior) y habilitamos el soporte de VR en la ventana de Build Settings > Player Settings > Other Settings

De este modo cuando pulsemos Play ya se estará renderizando todo con la doble cámara necesaria para realidad virtual.

VR enabled

Para desarrollar estos ejemplos utilizaremos assets del proyecto VR Samples que Unity publicó en la Asset Store (así que si todavía no te lo has bajado ya estás tardando 😉).

¡Bien! Ya tenemos el proyecto creado y también los VR Samples descargados e importados así que vamos a empezar con un ejemplo sencillo: Interacción en VR

Interacción en realidad virtual

Una de las primeras dudas que surgen al comenzar a trabajar con realidad virtual es como interactuamos con los objetos que tenemos en la escena. Para ellos vamos a utilizar los siguientes scripts que encontraremos dentro del proyecto VR Samples > VRStandardAssets: VREyeRayCaster, VRInput y VRInteractiveItem.

Asignamos a nuestra cámara principal el script VREyeRaycaster y a continuación asignamos el script VRInteractiveItem a cada uno de los objetos de la escena con los que queramos interactuar.

Lo que hace VREyeRaycaster es emitir un rayo hacia adelante en cada Update() a través de Physics.Raycast y comprobar si colisiona con algún collider. En caso de colisionar comprobará si el GameObject alcanzado contiene el componente VRInteractiveItem.

De esta forma podemos suscribirnos a los eventos de VRInteractiveItem y conocer cuando el usuario está mirando uno de estos objetos, pulsándolo, etc.

Acabemos de configurar antes la escena, arrastramos el script VRInput a nuestra cámara principal. VRInput es un script que vamos a utilizar para saber cuando el usuario hace swipe, clics, doble clics, etc en nuestro Samsung Gear VR, o por el contrario si estamos utilizando un DK2 o CV1 de Oculus podremos saber cuando el usuario hace los mismos gestos con la configuración equivalente en el PC. Del mismo modo que antes también podríamos suscribirnos a los eventos de VRInput para saber cuando se suceden las interacciones del usuario.

1
2
3
4
5
6
public event Action OnSwipe; // Called every frame passing in the swipe, including if there is no swipe.
public event Action OnClick; // Called when Fire1 is released and it's not a double click.
public event Action OnDown; // Called when Fire1 is pressed.
public event Action OnUp; // Called when Fire1 is released.
public event Action OnDoubleClick; // Called when a double click is detected.
public event Action OnCancel; // Called when Cancel is pressed.

Asignamos nuestra cámara principal a la propiedad VRInput del componente VREyeRaycaster y también a la propiedad Camera.

Después de todo esto nuestra cámara principal debería de quedar así:

02

Como puede resultar un poco confuso intentar clicar en un objeto sin tener un puntero vamos a crearnos uno rápidamente. Creamos una esfera y la asignamos como hija de nuestra cámara principal.Captura de pantalla 2016-05-16 a las 14.21.11

Lo situamos en las coordenadas 0,0,0 de modo que quede centrado respecto a su padre (la cámara) y lo alejamos unas 3 unidades en la Z. Lo escalamos a (0.2,0.2,0.2) y por último le desactivamos el collider para que no interfiera con nuestro VREyeRaycaster.

03

A continuación colocamos dos GameObjects cualesquiera en la escena, con el fin de hacerlos interactuables con el puntero.

En mi caso un cubo y una momia van a hacer de conejillos de indias.

cap

A cada uno de estos GameObjects tenemos que asignarles el script VRInteractiveItem y asegurarnos de que cada unos de ellos tiene collider para que nuestro VREyeRaycaster pueda colisionar con ellos cuando hagamos clic con nuestro dispositivo de realidad virtual.

Lo siguiente será añadir este script a estos dos objetos que queremos que sean interactuables:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using UnityEngine;
using System.Collections;
using VRStandardAssets.Utils;

public class Test : MonoBehaviour {

[SerializeField] private VRInteractiveItem interactiveItem;

void OnEnable(){
interactiveItem.OnClick += Paint;
}

void OnDisable(){
interactiveItem.OnClick -= Paint;
}

private void Paint(){
Debug.Log ("Painting!");
GetComponent().material.color = new Color(255,0,0);
}
}

Lo que estamos haciendo es suscribirnos al evento OnClick del VRInteractiveItem que arrastremos a esta propiedad. Es importante desuscribirse también del evento para evitar bugs en nuestra aplicación. Una buena práctica es tener en cuenta que por cada suscripción que hagamos tenemos que hacer otra desuscripción.

Como puedes ver nos suscribimos en el evento OnEnable (al activar o crear el GameObject) y nos desuscribimos en el evento OnDisable (al desactivar o eliminar el GameObject).

A continuación nos falta arrastrar cada GameObject a la propiedad Interactive Item de su componente Test.

item

Ahora ya podemos pulsar Play y apuntar con nuestro dispositivo de realidad virtual a uno de los dos GameObjects, al hacer clic lo pintaremos de rojo.

scr

VRInteractiveItems presenta todos estos eventos a los que nos podemos suscribir:

1
2
3
4
5
6
public event Action OnOver; // Called when the gaze moves over this object
public event Action OnOut; // Called when the gaze leaves this object
public event Action OnClick; // Called when click input is detected whilst the gaze is over this object.
public event Action OnDoubleClick; // Called when double click input is detected whilst the gaze is over this object.
public event Action OnUp; // Called when Fire1 is released whilst the gaze is over this object.
public event Action OnDown; // Called when Fire1 is pressed whilst the gaze is over this object.

En la siguiente entrada veremos más utilidades de Unity para realidad virtual.

 

About Pablo Marcos

Soy ingeniero informático y apasionado de la programación y la tecnología. Actualmente viviendo en Alemania y trabajando como desarrollador interactivo en Stoll Von Gáti GmbH. Mi twitter @pablo_marcos