El problema que resuelven#
¿Cómo esperas 2 segundos y luego haces algo? No puedes usar un bucle que bloquee: congelarías el juego entero. Una corrutina es un método que puede pausar su ejecución y reanudarla más tarde, repartiendo el trabajo a lo largo de varios fotogramas.
Cómo se escribe#
Una corrutina devuelve IEnumerator y usa yield return para pausar. Se lanza con StartCoroutine.
using System.Collections;
using UnityEngine;
public class Secuencia : MonoBehaviour
{
void Start()
{
StartCoroutine(CuentaAtras());
}
IEnumerator CuentaAtras()
{
Debug.Log("3");
yield return new WaitForSeconds(1f); // pausa 1 segundo
Debug.Log("2");
yield return new WaitForSeconds(1f);
Debug.Log("1");
yield return new WaitForSeconds(1f);
Debug.Log("¡Ya!");
}
}Los distintos yield#
| Instrucción | Reanuda... |
|---|---|
yield return null | En el siguiente fotograma |
yield return new WaitForSeconds(t) | Tras t segundos (afectado por Time.timeScale) |
yield return new WaitForSecondsRealtime(t) | Tras t segundos reales (ignora pausa) |
yield return new WaitForFixedUpdate() | Tras el siguiente FixedUpdate |
yield return new WaitUntil(() => condicion) | Cuando la condición sea verdadera |
yield return StartCoroutine(Otra()) | Cuando termine otra corrutina |
Si desactivas el GameObject o el componente, sus corrutinas se detienen y no se reanudan al reactivar. Para pararlas manualmente, guarda la referencia: var c = StartCoroutine(...) y luego StopCoroutine(c). Evita StopAllCoroutines() salvo que sepas exactamente qué paras.
Cuándo NO usar corrutinas#
- Para lógica que corre siempre: eso es
Update. - Para operaciones asíncronas de verdad (red, carga de archivos): valora
async/awaitconTask, que integra mejor con APIs modernas. - Para máquinas de estado complejas: una corrutina gigante con muchos
yieldse vuelve difícil de leer; considera una máquina de estados explícita.
Rendimiento#
Cada new WaitForSeconds(1f) crea un objeto que genera basura para el recolector (GC). Si una corrutina se repite mucho, crea el WaitForSeconds una vez y reutilízalo: var espera = new WaitForSeconds(1f); fuera del bucle.
Resumen#
Las corrutinas reparten trabajo en el tiempo sin bloquear el juego: ideales para esperas, secuencias y efectos escalonados. Devuelven IEnumerator, pausan con yield y se lanzan con StartCoroutine. Para lógica continua usa Update; para esperas y secuencias, corrutinas.