Menu
CoddyTech

Boucles dans les coroutines

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

Une boucle contenant un yield return s’exécute sur plusieurs images, car chaque passage marque une pause avant le suivant. Avec WaitForSeconds, la boucle répète quelque chose à intervalles réguliers. Cette sirène clignote 3 fois :

IEnumerator Flash()
{
    for (int i = 0; i < 3; i++)
    {
        lamp.enabled = true;
        yield return new WaitForSeconds(0.2f);
        lamp.enabled = false;
        yield return new WaitForSeconds(0.2f);
    }
}

Avec yield return null, la boucle effectue une petite partie du travail à chaque image jusqu’à ce que sa condition soit remplie ; c’est ainsi qu’une coroutine anime quelque chose. Ce ballon, à une échelle de 1, grandit de 0.5 par seconde jusqu’à ce que son échelle atteigne 2, puis affiche :

IEnumerator Inflate()
{
    while (transform.localScale.x < 2f)
    {
        transform.localScale += Vector3.one * 0.5f * Time.deltaTime;
        yield return null;
    }
    Debug.Log("Full");
}

Time.deltaTime fonctionne ici comme dans Update() : la coroutine reprend une fois par image, et la ligne après la boucle ne s’exécute que lorsque la boucle est terminée. Sans le yield, toute la boucle s’exécute dans une seule image et le ballon est immédiatement gonflé. Une boucle while (true) convient dans une coroutine tant qu’elle cède la main à chaque passage ; sans yield, elle ne rend jamais la main à l’image, et l’éditeur Unity se fige.

challenge icon

Défi

Facile

Espace lance la coroutine Ride de la herse du château Portcullis. Écris Ride pour que la herse effectue un trajet complet :

  • Elle monte de height (3) unités à speed (1.5) unité par seconde, s’arrête exactement en haut et affiche Open.
  • Elle reste ouverte pendant 1 seconde.
  • Elle redescend à la même vitesse jusqu’à son point de départ (down) et affiche Closed.

Appuie sur Play, puis sur Espace, puis sur Check.

Essayez vous-même

using System.Collections;
using UnityEngine;

public class Portcullis : MonoBehaviour
{
    public float speed = 1.5f;
    public float height = 3f;
    Vector3 down;

    void Start()
    {
        down = transform.position;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(Ride());
        }
    }

    IEnumerator Ride()
    {
        // Monter de height unités à la vitesse speed et afficher Open dans le journal, rester 1 seconde, redescendre et afficher Closed dans le journal
        yield return null;
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Physique et gameplay