Menu
CoddyTech

Votre première coroutine

Fait partie de la section Physique et gameplay du Journey Unity de Coddy. Leçon 24 sur 71.

Update() doit se terminer à chaque image, il ne peut donc pas attendre. Une coroutine le peut : c’est une méthode qui se met en pause et reprend plus tard là où elle s’était arrêtée. Elle renvoie IEnumerator, ce qui nécessite using System.Collections;, et chaque yield return qu’elle contient correspond à une pause. En C#, yield return permet à une méthode de fournir ses valeurs une par une ; Unity demande la suivante une fois l’attente terminée. yield return null attend une image, et yield return new WaitForSeconds(3f) attend 3 secondes.

StartCoroutine(Cycle()) en démarre une. Ce feu passe au vert, puis au jaune 3 secondes plus tard, et au rouge après une seconde supplémentaire :

using System.Collections;
using UnityEngine;

public class TrafficLight : MonoBehaviour
{
    Renderer lamp;

    void Start()
    {
        lamp = GetComponent<Renderer>();
        StartCoroutine(Cycle());
    }

    IEnumerator Cycle()
    {
        lamp.material.color = Color.green;
        yield return new WaitForSeconds(3f);
        lamp.material.color = Color.yellow;
        yield return new WaitForSeconds(1f);
        lamp.material.color = Color.red;
    }
}

StartCoroutine exécute immédiatement la coroutine jusqu’à son premier yield, puis Start() continue ; Unity la reprend après chaque attente, avec ses variables locales dans leur état précédent. Un simple Cycle(); sans StartCoroutine ne fait rien : il crée la méthode en pause, puis la supprime, sans qu’une seule ligne de celle-ci soit exécutée. Et yield return 3f; ne correspond pas à une attente de 3 secondes : Unity ne reconnaît que les objets d’attente tels que WaitForSeconds et traite toute autre valeur comme une image.

challenge icon

Défi

Facile

Fais bondir le piège à pointes avec une coroutine en appuyant sur Espace.

  1. Écris IEnumerator Spring() : consigne Click, yield return new WaitForSeconds(0.5f);, puis transform.position += Vector3.up;.
  2. Attends ensuite 2 secondes de la même façon, puis soustrais à nouveau Vector3.up.
  3. Dans le if associé à la touche Espace, démarre-la avec StartCoroutine(Spring());.

Appuie sur « Jouer » et sur Espace : les pointes bondissent, puis s’abaissent. Ensuite, clique sur « Vérifier ».

Essayez vous-même

using System.Collections;
using UnityEngine;

public class SpikeTrap : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // Déclencher le piège avec une coroutine
        }
    }

    // IEnumerator Spring(): cliquer, attendre 0.5 s, monter de 1 unité, attendre 2 s, descendre de 1 unité
}

Toutes les leçons de Physique et gameplay

Entraînez-vous par vous-même : Playground Unity