Menu
CoddyTech

Boucles dans les coroutines

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

Une boucle contenant un yield return s’exécute sur plusieurs images, car chaque itération marque une pause avant la suivante. Avec WaitForSeconds, la boucle répète une action à 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 action à chaque image jusqu’à ce que sa condition soit remplie ; c’est ainsi qu’une coroutine anime quelque chose. Ce ballon, dont l’échelle est 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 pendant une seule image et le ballon est immédiatement gonflé. Une boucle while (true) convient dans une coroutine, à condition qu’elle cède la main à chaque itération ; sans cela, elle ne rend jamais la main à l’image en cours et l’éditeur Unity se fige.

challenge icon

Défi

Facile

Écris Ride pour que la herse effectue un trajet complet.

  1. Définis Vector3 up = down + Vector3.up * height;. Tant que while (transform.position != up), déplace-la avec Vector3.MoveTowards(transform.position, up, speed * Time.deltaTime) et yield return null;.
  2. Affiche Open, puis yield return new WaitForSeconds(1f);.
  3. Fais-la redescendre jusqu’à down de la même manière, puis affiche Closed.

Appuie sur « Jouer », puis sur Espace : la herse se lève, attend et se referme. Ensuite, clique sur « Vérifier ».

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 en haut pendant 1 seconde, redescendre et afficher Closed dans le journal
        yield return null;
    }
}

Toutes les leçons de Physique et gameplay

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