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.
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.
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).
Tanto HealthStation como DamageStation tienen asignado el mismo script, «OnTriggerStayAction«.
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.
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.
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.
¿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.
En la figura 9 se muestra la resolución del ejercicio.
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.
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.
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