¡Bienvenido! En este codelab, resumiremos todos los temas vistos en este módulo para modificar y crear nuevas funcionalidades del HuertoXR. Recuerda que todos los pasos están basados en los videos y tutoriales del módulo 4. Si necesitas profundizar en algún tema, puedes volver a ver el video correspondiente al paso específico.

Temas evaluados

Requisitos previos

  1. Haber finalizado Módulo 1, Módulo 2 y Módulo 3
  2. Descargar el paquete Modulo4: https://github.com/viverovirtualuniandes/proyectoXR-Base/releases/download/modulo04.v1/Modulo4.unitypackage
  3. Importar el paquete Modulo4 a tu proyecto local del HuertoVR

Objetivo

Con ayuda de este resumen, podrás recordar cómo crear interacciones en Unity para agarrar objetos en un entorno XR. También, reforzarás la implementación de funciones como OnTriggerEnter y OnTriggerExit para detectar colisiones, y cómo usar condicionales y operadores matemáticos para manejar la lógica de estas interacciones. A continuación, podrás ver una imagen de referencia que muestra cómo debería verse tu escena al finalizar este ejercicio.

A continuación, te presentaremos una serie de pasos que debes ir siguiendo para completar el ejercicio.

  1. Para agarrar un objeto desde el simulador. Primero, deberás ejecutar la escena. Recuerda que puedes desplazarte usando las teclas W, A, S, y D. Una vez que estés frente al objeto que deseas agarrar, presiona TAB para manipular un control individualmente. Esto te permitirá apuntar el rayo del control hacia el objeto, y manteniendo presionada la tecla G, podrás agarrarlo. A continuación veremos un ejemplo de esto con una calabaza.

Nota: Si cuentas con un casco VR, basta con usar el control y oprimir los botones "trigger" ubicados para el dedo índice y el dedo corazón.

  1. Para agregar la interacción de poder agarrar un objeto es importante tener tres componentes: un Collider, un RigidBody y el Script XR Grab Interactable. El Collider permitirá detectar colisiones en el objeto, el RigidBody agregara físicas a este y el Script nos permitirá agarrar los objetos.

  1. Ahora vamos a detectar cuando un vegetal está fuera o dentro de la caja.

Para ello, usaremos un componente Collider en el GameObject "CajaGrande" de la escena y activaremos la opción "Is Trigger para que nos informe una vez este objeto colisione con otro.

  1. Ahora, detectaremos cada vez que un objeto entre o salga de la caja, usando las funciones OnTriggerEnter y OnTriggerExit. Para ver esto en acción, vamos a crear un nuevo script que llamaremos "ContadorAlimentos" en la carpeta de Scripts.

Al final, así se vería nuestro Trigger funcionando:

  1. Ahora, vamos a filtrar la detección, para sólo realizar acciones si los objetos que entran a la caja son cultivos, usando un condicional "if".

Gracias a este condicional si agregamos un objeto perteneciente al tag "Cultivos", el nombre de este se imprimirá en la consola. Pero, si el objeto no pertenece a este tag, no se imprimirá nada, como vemos a continuación:

  1. Ahora, para mostrar un mensaje diferente cuando los objetos no tienen dicho tag, es decir, sino se cumple la condición, vamos a incluir un bloque "else", como se muestra a continuacón.

Y así se vería ejecutándose nuestro código:

  1. Podemos usar condicionales "else if" para mostrar casos intermedios. Por ejemplo, verificando los nombres de las frutas o vegetales.

  1. Ahora, vamos a emplear los operadores de suma y resta, para mostrar la cantidad de cada alimento disponible en la caja. Para empezar, se debe crear una variable para cada cantidad a contar, iniciándose en 0.

  1. Así, modificaremos los condicionales, de modo que al ingresar un alimento, ya no vamos a imprimir un mensaje, sino que vamos a sumar una unidad a cada variable con la que se lleva el conteo.

Y nuestro código funcionando se vería así (te invitamos a ejecutarlo y ver más de cerca la consola)

  1. Ahora, para llevar el numero correcto de cada alimento, debemos tener en cuenta también cuando se saca alguno de la caja. Para ello usaremos la función OnTriggerExit y disminuiremos una unidad a cada variable de conteo, cada vez que se detecte que un alimento sale.

Así se vería nuestra función OnTriggerExit() al final:

Y nuestro código funcionando se vería así (te invitamos a ejecutarlo y ver más de cerca la consola)

  1. Finalmente, para mostrar nuestras variables actualizadas en el cartel detrás de la CajaGrande, necesitamos crear variables de tipo TextMeshPro para cada uno de los textos que mostrarán la cantidad correspondiente de cada vegetal.

  1. Luego, inicializamos cada variable desde el inspecto, asociando los textos de los carteles disponibles en el GameObject LetreroAlimentos

  1. Por último, le asignaremos a cada una de estas variables el valor de las variables de conteo.

Nota: Como el tipo de dato que espera la propiedad text del Componente TextMeshPro es de tipo string, debemos convertir el valor actual (int) usando la función ToString()

txtCantidadCalabazas.text = cantidadCalabazas.ToString();

NOTA: No olvidemos hacer lo mismo para el método OnTriggerExit, para que el cartel también se actualize al momento de retirar un vegetal de nuestra caja

Finalmente ya tendremos nuestro contador funcionando y actualizando. Así se vería nuestra versión final funcionando:

¡Felicidades! Has completado el codelab de Resumen del Código Módulo 4. Ahora, tienes los conocimientos necesarios para detectar eventos en Unity, implementar interacciones para agarrar objetos en un entorno XR, y manejar la lógica de estas interacciones usando condicionales y operadores. Esperamos que esta guía te haya sido útil para reforzar todos los conceptos que hemos visto hasta ahora. Te animamos a seguir experimentando con Unity, y recuerda que puedes volver a revisar los videos del módulo si deseas practicar algún tema en particular.