Arrêter les coroutines
Fait partie de la section Physique et gameplay du Journey Unity de Coddy. Leçon 26 sur 71.
StartCoroutine renvoie une Coroutine, une référence vers la coroutine qu’elle a démarrée. Stocke-la dans un champ, et StopCoroutine(handle) arrête cette coroutine à l’endroit 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 remet donc à null, et au prochain appui 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 arrête celle-ci : l’alarme continue donc de biper. Et enabled = false désactive le Update() du script, mais ses coroutines continuent. Une coroutine se termine lorsqu’elle est arrêtée à l’aide de sa référence 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
FacileFais en sorte qu’un clic désamorce la bombe sans désactiver le script.
- Ajoute un champ
Coroutine fuse;. À l’appui sur Espace, définisfuse = StartCoroutine(Fuse());. - Au clic, remplace
enabled = false;: lorsquefuse != null, appelleStopCoroutine(fuse);, définisfuse = null;et consigneDefused.
Appuie sur « Jouer », appuie sur Espace, puis clique : la Console affiche Defused et la bombe reste en place. Puis clique sur « 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);
}
}
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