#5 Método OnTriggerStay. [Serie Fundamental de Unity]

Introducción

En este artículo vamos a estudiar cómo utilizar el método OnTriggerStay para detectar al personaje en una determinada región y aplicar acciones cuando eso ocurra. Concretamente vamos a hacer que las estaciones de daño y regeneración de salud afecten al personaje.

Página principal del proyecto

Antes de empezar te invito a ver el video que hice para resumir este artículo.

Procedimiento

Vamos a utilizar la estación “OnTriggerStay“, la cual consiste en dos aparatos con forma de detector de metal, uno rojo y otro verde y cuya función es afectar nuestro sistema de salud. Al entrar en la estación roja nuestra salud debe disminuir y con la estación verde debe aumentar.

modelos 3d similares a detector de metal. En el centro un cartel que dice "OnTriggerStay Station".
Fig. 1: Estación OnTriggerStay del GameDevLab.

Todos estos objetos se encuentran dentro del empty GameObject#5 OnTriggerStay“. Tenemos una estación de regeneración (HealthStation) y otra de daño (DamageStation).

la jerarquía de la escena "GameDevLab" de un proyecto en Unity3D.
Fig. 2: Jerarquía de la escena. Todos los elementos de la estación están en el GameObject #5 OnTriggerStay.

Tanto HealthStation como DamageStation tienen asignado el mismo script, “OnTriggerStayAction“.

componente script "OnTriggerStay Action" visualizado en inspector en Unity3D
Fig. 3: Script asignado a los GameObjects “HealthStation” y “DamageStation”.

En el inspector podemos modificar la cantidad de salud que nos dá o nos quita a través del float “amountHealth” y podemos elegir el tipo de estación que es.

componente script "OnTriggerStay Action" visualizado en inspector en Unity3D. Menu desplegable con opciones health y damage
Fig. 4: El script nos permite elegir si la estación hace daño o regenera.

Para que las estaciones puedan hacer su trabajo es necesario que el jugador tenga algún tipo de sistema de salud al cual afectar. Esto ya viene resuelto en el GameDevLab. El GameObject FirstPersonPlayer tiene asignado un script llamado “HealthSimple” que cuenta con las variables y métodos necesarios para proporcionarle al jugador un sistema de salud simple.

componente script "HealthSimple" visualizado en inspector en Unity3D
Fig. 5: Script asignado al GameObject FirstPersonPlayer.

Resolución

Al abrir el script OnTriggerStayAction por primera vez nos encontramos con lo que se ve en la figura 6. Hay una región definida entre comentarios donde se sugiere redefinir el método OnTriggerStay.

script c# en unity
Fig. 6: Script OnTriggerStayAction sin completar.

¿Cómo funciona el método OnTriggerStay?

Este método está definido en la clase MonoBehaviour, por lo tanto estará presente por defecto en cualquier script nuevo que hagamos.

Se ejecuta automáticamente si un GameObject con Collider entra en la región definida por otro Collider que está en Modo Trigger. Además al menos uno de los dos GameObjects debe tener un componente RigidBody asignado.

Fig. 7: Mientras los colliders no se toquen, el método OnTriggerStay no se ejecuta.

Fig. 8: Los colliders se están tocando, por lo tanto el método OnTriggerStay se ejecuta.

En la figura 9 se muestra la resolución del ejercicio.

Fig. 9: Resolución del script OnTriggerStayAction.

Redefinimos el método OnTriggerStay que recibe como parámetro el Collider que ha entrado en contacto con el trigger. Le damos el nombre “col” a la referencia de este Collider.

Lo que tenemos que hacer es en primer lugar determinar si el GameObject cuyo Collider entró en contacto tiene un sistema de salud al cual afectar, esto lo hacemos obteniendo la referencia de la componente HealthSimple que puede estar asignada a este GameObject.

Si el GameObject tiene sistema de salud, tendremos una componente HealthSimple, en caso contrario nuestra variable va a tener el valor null. Usamos esto como condición en la sentencia if.

Si la condición es verdadera ejecutamos el método playerIsUnderTheStation y pasamos como parámetro la referencia de HealthSimple que se encuentra en health.

Con esto ya tenemos resuelto el problema del video, a partir de ese punto la componente HealthSimple se encargará de manejar el tema de la salud.

habitación con varios modelos 3d, máquina expendedora, engranajes, en el centro se observa un cartel que dice "no olvides suscribirte"
Fig. 10: Valor de salud luego de unos segundos en la estación de daño.

Al entrar en la estación de daño nuestra salud comienza a mermar, si llega al valor cero la escena se reinicia.

Al entrar en la estación de regeneración, la salud comienza a aumentar hasta llegar al valor máximo.

habitación con varios modelos 3d en el centro se observa un cartel que dice "no olvides suscribirte"
Fig. 11: Valor de salud luego de unos segundos en la estación de regeneración.

Conclusión

El objetivo de este artículo y video correspondiente es estudiar una aplicación del método OnTriggerStay, para entender cómo funciona y posteriormente poder aplicarlo a cualquier situación en la que pueda ser útil.

Existen muchas situaciones en las que este método podría servir, por ejemplo modelar el comportamiento de una placa de presión, hacer que nos afecte una fuerza opuesta a la gravedad que nos haga levitar si estamos en determinada región. En definitiva este método es una herramienta útil que tenemos que entender.

No es el punto de este artículo estudiar el sistema de salud, pero es interesante observar que las estaciones van a actuar sobre cualquier GameObject que cuente con el script HealthSimple, independientemente de que se trate del jugador. Esto nos sugiere que en nuestro juego podríamos tener un solo script que administre la salud de cualquier ser viviente de nuestro juego y tenga propiedades comunes para todos, así como propiedades únicas para cada ser. Crear este tipo de soluciones es lo que me resulta más interesante

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *