Aller au contenu

Les coroutines

Contrairement à une fonction standard qui s'exécute intégralement en une seule frame, une Coroutine peut mettre son exécution en pause et la reprendre plus tard.

Structure de base

Pour créer une coroutine, on utilise le type de retour IEnumerator. Elle doit obligatoirement contenir au moins une instruction yield.

IEnumerator MaRoutine()
{
    Debug.Log("Début");

    // Pause de 2 secondes
    yield return new WaitForSeconds(2f);

    Debug.Log("Fin après 2 secondes");
}

Les types de pauses (yield)

C'est ici que réside la puissance des coroutines. Vous pouvez suspendre le code de plusieurs façons :

Syntaxe Effet
yield return null; Attend la frame suivante (équivalent à un Update).
yield return new WaitForSeconds(x); Attend X secondes (temps réel du jeu).
yield return new WaitForEndOfFrame(); Attend que le rendu de l'image soit fini.
yield break; Arrête définitivement la coroutine immédiatement.

Boucles et conditions

On utilise souvent des boucles while pour attendre qu'une action soit complétée sans bloquer le reste du jeu.

Exemple : Attendre qu'une variable change

IEnumerator AttendreChargement()
{
    while (!estCharge) // Tant que ce n'est pas chargé...
    {
        yield return null; // On attend la frame suivante et on re-vérifie
    }
    Debug.Log("Chargé !");
}

Contrôler la coroutine

Une coroutine ne se lance pas toute seule. Il faut utiliser les méthodes de gestion de Unity.

Démarrer

Coroutine maRef = StartCoroutine(MaRoutine());

Arrêter

Pour arrêter une coroutine spécifique, il est préférable d'utiliser la référence stockée lors du démarrage.

StopCoroutine(maRef); // Arrête la coroutine précise
StopAllCoroutines();  // Arrête TOUT sur ce script

Important

Si vous désactivez l'objet (gameObject.SetActive(false)), toutes ses coroutines s'arrêtent immédiatement. Cependant, désactiver simplement le script (enabled = false) ne les arrête pas.