ACTUALIZACIÓN IMPORTANTE
Este artículo pertenece a una serie antigua del canal, actualmente hay disponible un vídeo en el que se explica mejor cómo utilizar la función Invoke para hacer que una función se llame con delay. Si deseas ver el artículo antiguo lo encontrarás más abajo.
Tengo el vídeo perfecto para esta ocasión
Este es el vídeo vemos cómo llamar funciones con DELAY en Unity.
AQUÍ CONTINÚA EL ARTÍCULO ANTIGUO
Introducción
En este artículo vamos a ver cómo utilizar el método Invoke de la clase MonoBehaviour de Unity para ejecutar una acción con un retraso determinado. Esto nos permite por ejemplo crear mecanismos que funcionan durante un tiempo.
Ir a la página principal del proyecto
En el siguiente video puedes ver la información resumida de este artículo.
Procedimiento
Para analizar el método Invoke utilizaremos la estación «Invoke a Method» del GameDevLab, la cual consiste en una máquina expendedora de la nueva y refrescante GameDevCola que no sólo calma la sed sino que también cura tus heridas.
Al acercarnos a la máquina podremos interactuar con ella usando la tecla E. Al pulsarla la máquina se volverá inactiva, es decir no podremos interactuar con ella por un tiempo. Luego de unos segundos la máquina expulsará una lata de GameDevCola y segundos más tarde volverá a estar habilitada para la interacción.
En el Script para completar tenemos los métodos «DeliverACola» y «PrepareMachine» que entregarán la bebida y habilitarán la máquina respectivamente.
Luego tenemos redefinido el método OnTriggerStay que nos permite chequear si el personaje se encuentra parado frente a la máquina.
Aquí dejo el artículo en el que se analiza el método OnTriggerStay.
Dentro de este método chequeamos si el Tag del GameObject es el del jugador, luego si la máquina está lista (boolean machineReady), le decimos al objeto UIManager que se puede interactuar y este se encarga de mostrar el mensaje en pantalla.
Luego chequeamos si se presiona la tecla E. En este punto es en el que la máquina recibe la petición de una GameDevCola. Lo primero que se hace es desactivar la máquina y luego en la región con comentarios es donde debemos completar el código que falta.
Análisis de eventos en el tiempo
Quiero hacer énfasis en esta parte porque es importante que se entienda la idea.
Cuando llamamos a un método en C# la ejecución del mismo se realiza en ese preciso instante, se resuelven todas las instrucciones incluso antes de refrescar la imagen de la pantalla.
Entonces si llamáramos directamente a los métodos en la región marcada con comentarios, lo que pasaría es que la lata sería expulsada y la máquina habilitada nuevamente en el mismo instante en el que se pulsa la tecla E. Como se ilustra en la línea de tiempo de la figura 3.
En la figura 3 se observa una línea de tiempo en la que hay dos puntos distintos en el tiempo, el primer punto es el comienzo del juego. En algún momento más adelante en el tiempo se encuentra el segundo punto, en el que el jugador pide una lata, la máquina la entrega y se vuelve a habilitar, estas tres acciones en el mismo instante.
Observemos ahora la figura 4, se observan cuatro puntos distintos de tiempo.
Punto 1: Inicio del juego.
Punto 2: El jugador hace el pedido de la GameDevCola.
Punto 3: Luego de X milisegundos de que se hace el pedido la máquina entrega la lata.
Punto 4: Luego de Y milisegundos de que se hace la entrega de la lata la máquina se vuelve a habilitar.
Esto es lo que vamos a hacer utilizando el método Invoke de la clase MonoBehaviour.
Resolución
El método Invoke lo podemos llamar directamente sin hacer referencia a una clase.
Debemos indicar dos parámetros, el primero es un String con el nombre del método que queremos invocar, el segundo parámetro es un float para indicar la cantidad de segundos que van a pasar hasta que el método finalmente sea ejecutado.
Se debe respetar las mayúsculas y minúsculas. Si nos confundimos en este punto, puede surgir un bug difícil de rastrear. Si el método se llama «DeliverACola» y nosotros invocamos el método «DeliveraCola» lo que va a ocurrir es que se va a intentar llamar a ese método pero como no se encuentra definido, el programa seguirá adelante sin ejecutar esas instrucciones.
En la figura 5 se muestra la resolución del ejercicio. La lata será entregada dos segundos después de que el jugador presiona la tecla E y la máquina se vuelve a habilitar cuatro segundos después.
Conclusión
El método Invoke nos sirve para posponer en el tiempo la ejecución de un método. Si bien no es la única forma de lograr esto, se trata de un recurso simple, fácil de recordar y fácil de implementar.