Interrompere le coroutine
Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 25 di 63.
StartCoroutine restituisce una Coroutine, un riferimento alla coroutine avviata. Conservalo in un campo e StopCoroutine(handle) interrompe quella coroutine nel punto in cui è in pausa: le righe dopo il suo yield non vengono mai eseguite. StopAllCoroutines() interrompe tutte le coroutine avviate dallo script. La barra spaziatrice attiva e disattiva questo allarme:
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);
}
}Il campo non si svuota da solo quando la coroutine si interrompe, quindi l'allarme lo reimposta a null e la pressione successiva della barra spaziatrice sa che non è in esecuzione nulla. Due modi che sembrano corretti non funzionano. StopCoroutine(Beep()) richiama Beep(), creando una nuova coroutine non avviata, e interrompe quella; così l'allarme continua a suonare. Inoltre, enabled = false disattiva Update() dello script, ma le sue coroutine continuano. Una coroutine termina quando viene interrotta tramite il suo riferimento o con StopAllCoroutines(), quando raggiunge l'ultima riga oppure quando il suo GameObject viene disattivato con SetActive(false) o distrutto.
Sfida
FacileLa barra spaziatrice accende la miccia della Bomb: la coroutine Fuse registra Fuse lit, attende fuseTime (3) secondi, registra Boom e distrugge la bomba. Un clic dovrebbe disinnescarla, ma disattiva lo script e la bomba esplode comunque. Correggi il disinnesco:
- Un clic mentre la miccia brucia la ferma e registra
Defused. La bomba resta. - In seguito, la barra spaziatrice può riaccendere la miccia e, questa volta, senza clic, la bomba esplode 3 secondi dopo.
Premi Play, accendi la miccia, fai clic e osserva la Console, poi premi Check.
Provalo tu
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);
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fisica e gameplay
1Corpo rigido
Gravità e massaSpingi con AddForceSalta con un impulsoFixedUpdate per la fisicaVelocitàCorpi cinematiciRiepilogo: piattaforma di lancio4Coroutine
InvokeInvokeRepeating, CancelInvokeLa tua prima coroutineCicli nelle coroutineInterrompere le coroutineRiepilogo: conto alla rovescia2Collisioni
OnCollisionEnterCosa ho colpito?Rompersi all'impattoRestare a terraRimbalzo e attritoForme dei ColliderRiepilogo: muro distruttibile5Progetto: Corsa alle monete
La palla rotolanteMonete da raccogliere