Arrêter les coroutines
Fait partie de la section Physique et gameplay du Journey Unity de Coddy. Leçon 25 sur 63.
StartCoroutine renvoie une Coroutine, un handle vers la coroutine qu’elle a démarrée. Conserve-le dans un champ, et StopCoroutine(handle) arrête cette coroutine là où elle est en pause : les lignes qui suivent son yield ne s’exécutent jamais. StopAllCoroutines() arrête toutes les coroutines démarrées par le script. La barre d’espace active et désactive cette alarme :
Coroutine beeping;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
if (beeping == null)
{
beeping = StartCoroutine(Beep());
}
else
{
StopCoroutine(beeping);
beeping = null;
}
}
}
IEnumerator Beep()
{
while (true)
{
Debug.Log("Beep");
yield return new WaitForSeconds(1f);
}
}Le champ ne se vide pas de lui-même lorsque la coroutine s’arrête ; l’alarme le réinitialise donc à null, et à la prochaine pression sur la barre d’espace, elle sait qu’aucune coroutine n’est en cours. Deux méthodes qui semblent correctes ne fonctionnent pas. StopCoroutine(Beep()) appelle de nouveau Beep(), ce qui crée une nouvelle coroutine qui n’a pas été démarrée, puis l’arrête : l’alarme continue donc de sonner. Et enabled = false désactive Update() du script, mais ses coroutines continuent. Une coroutine se termine lorsqu’elle est arrêtée via son handle ou par StopAllCoroutines(), lorsqu’elle atteint sa dernière ligne, ou lorsque son GameObject est désactivé avec SetActive(false) ou détruit.
Défi
FacileEspace allume la mèche de la Bomb : la coroutine Fuse journalise Fuse lit, attend fuseTime (3) secondes, journalise Boom et détruit la bombe. Un clic est censé la désamorcer, mais il désactive le script, et la bombe explose quand même. Corrige le désamorçage :
- Un clic pendant que la mèche brûle l'arrête et journalise
Defused. La bombe reste. - Ensuite, Espace peut rallumer la mèche et, cette fois, sans clic, la bombe explose 3 secondes plus tard.
Appuie sur Jouer, allume la mèche, clique et observe la Console, puis Vérifier.
Essayez vous-même
using System.Collections;
using UnityEngine;
public class Bomb : MonoBehaviour
{
public float fuseTime = 3f;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
StartCoroutine(Fuse());
}
if (Input.GetMouseButtonDown(0))
{
enabled = false;
Debug.Log("Defused");
}
}
IEnumerator Fuse()
{
Debug.Log("Fuse lit");
yield return new WaitForSeconds(fuseTime);
Debug.Log("Boom");
Destroy(gameObject);
}
}
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