Interrompere le coroutine
Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 26 di 71.
StartCoroutine restituisce un Coroutine, un riferimento alla coroutine avviata. Conservalo in un campo e StopCoroutine(handle) interrompe quella coroutine nel punto in cui è in pausa: le righe successive al 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 alla pressione successiva della barra spaziatrice sa che non è in esecuzione nulla. Due soluzioni che sembrano corrette 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
FacileFai in modo che un clic disinneschi la bomba senza disattivare lo script.
- Aggiungi un campo
Coroutine fuse;. Quando premi Spazio, impostafuse = StartCoroutine(Fuse());. - Quando fai clic, sostituisci
enabled = false;: quandofuse != null, chiamaStopCoroutine(fuse);, impostafuse = null;e registraDefused.
Premi «Gioca», premi Spazio e poi fai clic: nella Console viene visualizzato Defused e la bomba rimane. Poi premi «Verifica».
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);
}
}
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 rovescia7Rotazione
Angoli di EuleroQuaternioniGuarda nella direzione in cui ti muoviRuota in modo fluidoRiepilogo: Torretta10Progetto: Fuga dall'arena
L'arenaCacciatori2Collisioni
OnCollisionEnterCosa ho colpito?Rompersi all'impattoRestare a terraRimbalzo e attritoForme dei ColliderRiepilogo: muro distruttibile5Progetto: Corsa alle monete
La palla rotolanteMonete da raccogliereEsercitati da solo: Playground Unity