Menu
CoddyTech

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.

challenge icon

Sfida

Facile

Fai in modo che un clic disinneschi la bomba senza disattivare lo script.

  1. Aggiungi un campo Coroutine fuse;. Quando premi Spazio, imposta fuse = StartCoroutine(Fuse());.
  2. Quando fai clic, sostituisci enabled = false;: quando fuse != null, chiama StopCoroutine(fuse);, imposta fuse = null; e registra Defused.

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

Esercitati da solo: Playground Unity