Las Coroutines son funciones que pueden ejecutarse de manera concurrente con el ciclo principal de ejecución del juego...


La versión en video de este tutorial no está disponible actualmente en este idioma.


Transcripción del video

¡Hola a todos!

Bienvenidos a este tutorial básico sobre el uso de Coroutines en Unity.

Las Coroutines son funciones que pueden ejecutarse de manera concurrente con el ciclo principal de ejecución del juego.

En este tutorial utilizaré un ejemplo práctico para explicar el concepto y también introducir la función WaitForSeconds, que permite esperar la ejecución de una operación durante un número determinado de segundos.

Este tutorial asume que tienes una comprensión básica de programación en C# en Unity. Fue grabado utilizando la versión 2022 de Unity, pero las Coroutines están disponibles en muchos lenguajes de programación y en versiones anteriores de Unity.

Nuestro objetivo es hacer que el cañón dispare automáticamente una cannonball Prefab, que es una simple esfera negra, cada 3 segundos hasta que ocurra un evento externo que interrumpa esta rutina.

En este caso, el evento externo será que el usuario presione la tecla S, que significa Stop.

Para comenzar, necesitamos crear un script para el cañón y llamarlo "autoshoot".

Dentro de la clase principal, defino tres variables para especificar el punto de inicio de la bola con respecto al cañón:

public GameObject spawnPrefab;

Enlazaré el prefab de la cannonball en el Unity Editor a esta variable pública.

Vector3 spawnPosition;

Quaternion spawnRotation;

He calculado este punto y la orientación inicial, así que inicializo estos dos valores dentro de la función Start:

spawnPosition = transform.position + new Vector3(-1.2f, 1.8f, 0f);

spawnRotation = Quaternion.Euler(-10f, -90f, 0f);

Es evidente que necesitamos implementar un bucle que se repita indefinidamente, a menos que un evento externo lo interrumpa, e incluya una instrucción de espera de 3 segundos antes de pasar a la siguiente iteración.

NOTA: el prefab de la cannonball incluye un script que, al iniciarse, aplica un impulso inicial hacia adelante a la bola y configura el objeto para autodestruirse después de 3 segundos, para no llenar ni el universo virtual ni la memoria del sistema con cannonballs.

La instrucción WaitForSeconds nos permite pausar durante una cantidad de tiempo específica, que en nuestro caso es 3 segundos.

Ahora necesitamos crear un bloque WHILE para ejecutar el bucle principal, que por ahora estoy escribiendo en un espacio vacío del script:

while(true) {

GameObject cannonBall = Instantiate(spawnPrefab, spawnPosition, spawnRotation, null);

yield return new WaitForSeconds(3);

}

Entonces, ¿dónde debemos colocar este bloque WHILE?

No puede colocarse en Start, ya que allí no podemos usar yield WaitForSeconds. Además, si lo ponemos en Update no produciría el retraso deseado, porque Update se llama en cada frame del juego.

Por lo tanto, debemos crear una función llamada "shoot" que devuelva el tipo IEnumerator e incluya el bloque WHILE.

Esta función nos permitirá iniciar una Coroutine utilizando la instrucción StartCoroutine con el nombre de la función como parámetro entre comillas dobles.

Como el cañón debe comenzar a disparar inmediatamente, escribimos:

StartCoroutine("shoot");

dentro de Start, inmediatamente después de inicializar spawnPosition y spawnRotation.

Guardemos el script y vayamos al editor para probar el script definido hasta este punto.

Para poder detener o reiniciar la Coroutine, volvamos al script y agreguemos dos instrucciones.

Podemos detener la Coroutine verificando si se presiona la tecla S y luego llamando a la función StopCoroutine con la Coroutine "shoot" como parámetro.

De manera similar, podemos reiniciar la Coroutine verificando si se presiona la tecla R y llamando a la función StartCoroutine con "shoot" como parámetro.

Entonces escribimos en Update:

if(Input.GetKeyDown(KeyCode.S)) StopCoroutine("shoot");

if(Input.GetKeyDown(KeyCode.R)) StartCoroutine("shoot");

Después de agregar estas instrucciones, guardemos el script y volvamos al Unity Editor para probarlo.

Eso es todo por este breve tutorial. ¡Espero que les haya sido útil! ¡Hasta pronto!

Este sitio web tiene como único propósito mostrar algunos de mis trabajos, sin ninguna intención promocional. Ten en cuenta que actualmente no estoy buscando - ni responderé a - solicitudes de trabajos personalizados, consultorías u otro tipo de colaboraciones profesionales.


POLÍTICA EXTENDIDA DE PRIVACIDAD Y UTILIZACIÓN DE COOKIES