Menu
CoddyTech

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.

challenge icon

Sfida

Facile

La 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);
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fisica e gameplay