#8 Método Invoke de la clase MonoBehaviour. [Serie Fundamental de Unity]

Por GameDevTraum

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.

crear juegos en unity, serie fundamental, método invoke, programar el funcionamiento de una máquina expendedora
Fig. 1: Estación “Invoke a Method” del GameDevLab. Máquina expendedora de GameDevCola.

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.

script unity, ontriggerstay, método invoke. Desarrollo de juegos en Unity.
Fig. 2: Script InvokeAMethod sin completar.

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.

línea temporal en la que se especifican cuatro puntos en el tiempo de ejecución de un videojuego
Fig. 3: Diagrama de eventos en el tiempo. Esto ocurriría si llamáramos directamente a los métodos.

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.

línea temporal en la que se especifican cuatro puntos en el tiempo de ejecución de un videojuego
Fig. 4: Diagrama de eventos en el tiempo. Esto queremos lograr.

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.

script unity, ontriggerstay, método invoke. Desarrollo de juegos en Unity.
Fig. 5: Script InvokeAMethod completo.

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.

crear juegos en unity, serie fundamental, método invoke, programar el funcionamiento de una máquina expendedora. Se muestra un cartel que indica que se puede interactuar con la máquina expendedora.
Fig. 6: Al acercarse a la máquina, nos aparece un cartel indicando que se puede interactuar.

crear juegos en unity, serie fundamental, método invoke, programar el funcionamiento de una máquina expendedora, la máquina entrega una lata.
Fig. 7: Luego de unos segundos de interactuar con la máquina, se nos entrega una lata.

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.