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.
Défi
FacileÉcris Ride pour que la herse effectue un trajet complet.
- Définis
Vector3 up = down + Vector3.up * height;. Tant quewhile (transform.position != up), déplace-la avecVector3.MoveTowards(transform.position, up, speed * Time.deltaTime)etyield return null;. - Affiche
Open, puisyield return new WaitForSeconds(1f);. - Fais-la redescendre jusqu’à
downde la même manière, puis afficheClosed.
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
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 à rebours7Rotation
Angles d’EulerQuaternionsRegardez dans la direction où vous vous déplacezTourner en douceurRécapitulatif : tourelle10Projet : Évasion de l’arène
L’arèneLes chasseurs2Collisions
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 à ramasser3Déclencheurs
Colliders déclencheursOnTriggerEnterObjets à ramasserLes caisses gardent le resteZones mortellesEntrée et sortieRécapitulatif : clé et porteEntraînez-vous par vous-même : Playground Unity