Cardboard en Android con Unity 5.5 (parte 2)

Introducción

En el anterior artículo os explicaba como tener una aplicación básica para utilizar con las gafas de cartón Google Cardboard (aunque también valdría para modelos más avanzados como las Samsung Gear VR). Sin embargo, esto sólo nos valdría para visualizar una simulación sin tener ninguna interacción con el entorno. En el artículo de hoy vamos a ver cómo podemos incluir un puntero con el que podremos interactuar con nuestros objetos.

Interacción en Cardboard

Lo primero que tenemos que hacer es conseguir que en pantalla se vea un puntero que nos indique a qué objeto estamos mirando. Esto es muy sencillo de hacer utilizando los prefabs que nos ofrece el SDK de Google VR, concretamente, dentro de la carpeta Prefabs / UI existe un componente que se llama GvrReticlePointer. Arrastramos este objeto como hijo de nuestra cámara principal y al pulsar Play ya veremos un pequeño círculo en el centro de la pantalla.

Ahora necesitamos que este círculo detecte si estamos mirando a algún objeto o no. Lo primero es asegurarnos que el objeto con el que queremos interactuar tenga asociado un Collider. En la primera parte de este tutorial añadimos un cubo que por defecto trae un Box Collider pero si utilizamos algún otro objeto debemos de comprobar que tiene un collider entre sus componentes. Lo segundo, tenemos que añadir a nuestra cámara el script GvrPoiniterPhysicsRaycaster que lo que hace es lanzar un rayo virtual desde nuestra cámara hacia adelante para colisionar con objetos de nuestro entorno. Por supuesto en este script podemos indicar sobre qué capas de nuestro mundo queremos que se detecte esa colisión.

Cardboar en Unity

El siguiente paso será arrastrar a la ventana principal de nuestra escena el objeto GvrEventSystem. La escena debería de quedar como en la captura anterior.

Por último, tenemos que decirle al objeto sobre el que interactuaremos que queremos que esté preparado para detectar eventos sobre él. Esto lo haremos incluyendo un componente en el cubo del tipo EventTrigger.

Si ahora pulsamos Play en nuestra simulación veremos como el puntero cambia a un círculo mayor cuando movemos la cabeza y lo situamos sobre el cubo. Eso quiere decir que está detectando la colisión sobre el objeto. Ahora tenemos que decirle qué es lo que queremos hacer y para ello necesitaremos un poco de scripting. Vamos a desarrollar un script que haga algo cuando miramos al cubo durante 3 segundos.

Creamos un script C# llamado SeleccionarCubo y ponemos en él las funciones EntrarEnCubo y SalirDeCubo. Asociamos el script a un GameObject de nuestra escena (yo suelo crear un GameObject vacío llamado Programacion y asociar a él el script principal de la simulación). Nos vamos al cubo, y en el componente EventTrigger pulsamos el botón Add New Event Type y seleccionamos PointerEnter.

Seleccionar tipo de evento

Pulsamos el botón + que se encuentra en el componente Event Trigger y arrastramos a el nuestro objeto Programacion.

Evento cardboard

En el desplegable donde ahora pone No Function seleccionamos SeleccionarCubo / EntrarEnCubo.

Pulsamos de nuevo el botón Add New Event Type y seleccionamos Pointer Exit. Ya nos debería de crear un evento con el objeto Programación asignado así que sólo tenemos que cambiar la función SeleccionarCubo.EntrarEnCubo por SeleccionarCubo / SalirDeCubo. Así debería de quedar asignados los eventos a nuestro cubo:

Eventos cardboard

Para probarlo, vamos a nuestro script y colocamos instrucciones de debug en nuestras funciones EntrarEnCubo y SalirDeCubo para comprobar que está funcionando correctamente.

Vamos ahora a detectar que el usuario mira durante 3 segundos al cubo para seleccionar alguna acción. Para ello utilizamos creamos una variable dentro que inicializamos a false en la función Start de nuestro script. En la función EntrarEnCubo indicamos que dentro = true y en SalirDeCubo que dentro = false. Para el contador de tiempo utilizamos una variable de tipo float llamada tiempo que incializamos cada vez que entremos en la función EntrarEnCubo. En la función Update de nuestro script comprobamos si el tiempo que hemos pasado mirando al cubo es superior a 3 segundos y en caso afirmativo lanzamos la interacción que consideremos.

El script resultado es el siguiente:

[csharp]
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DeteccionCubo : MonoBehaviour {

private bool dentro;
private float tiempo;

public void EntrarEnCubo () {

dentro = true;
tiempo = Time.time;
// Debug.Log (“Entro en el cubo”);
}

public void SalirDelCubo() {

dentro = false;
// Debug.Log (“Salir del cubo”);
}

// Use this for initialization
void Start () {

dentro = false;
}

// Update is called once per frame
void Update () {

ComprobarSeleccionCubo ();
}

void ComprobarSeleccionCubo() {

if (dentro) {

if (Time.time > tiempo + 3) {

Debug.Log (“Cubo seleccionado”);
}
}
}
}
[/csharp]