🎮 UnityDocs

Corrutinas en Unity

Cómo hacer que algo ocurra a lo largo del tiempo (esperar, repetir, encadenar acciones) sin bloquear el juego, usando corrutinas y yield.

📄 ArtículoAvanzado✅ RevisadoUnity 6.0 LTSActualizado 2026-07-14
DificultadConceptual Código Matemáticas
Tiempo📖 Lectura 7 min · ⌨️ Práctica 20 min

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.

C#
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ónReanuda...
yield return nullEn 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
Cuidado al parar corrutinas

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/await con Task, que integra mejor con APIs modernas.
  • Para máquinas de estado complejas: una corrutina gigante con muchos yield se vuelve difícil de leer; considera una máquina de estados explícita.

Rendimiento#

Reutiliza los WaitForSeconds

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.

Fuentes y para profundizar