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.
Défi
FacileEspace 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 afficheOpen. - Elle reste ouverte pendant 1 seconde.
- Elle redescend à la même vitesse jusqu’à son point de départ (
down) et afficheClosed.
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;
}
}
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
1Corps rigide
Gravité et massePousser avec AddForceSauter avec une impulsionFixedUpdate pour la physiqueVitesseCorps cinématiquesRécapitulatif : plateforme de lancement4Coroutines
InvoquerInvokeRepeating, CancelInvokeVotre première coroutineBoucles dans les coroutinesArrêter les coroutinesRécapitulatif : compte à rebours2Collisions
OnCollisionEnterQu’est-ce que j’ai touché ?Se briser à l’impactRester au solRebond et frictionFormes des collidersRécapitulatif : mur destructible5Projet : Course aux pièces
La balle roulanteDes pièces à ramasser