Menu
CoddyTech

Interrompendo corrotinas

Parte da seção Física e jogabilidade do Journey de Unity da Coddy. Lição 25 de 63.

StartCoroutine retorna um Coroutine, uma referência à coroutine que iniciou. Guarde-o em um campo, e StopCoroutine(handle) interrompe essa coroutine no ponto em que está pausada: as linhas após o yield nunca são executadas. StopAllCoroutines() interrompe todas as coroutines iniciadas pelo script. A tecla Espaço liga e desliga este 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);
    }
}

O campo não se limpa sozinho quando a coroutine para, então o alarme o define novamente como null, e, na próxima vez que você pressionar Espaço, ele saberá que nada está em execução. Duas maneiras que parecem corretas não funcionam. StopCoroutine(Beep()) chama Beep() novamente, o que cria uma nova coroutine que ainda não foi iniciada, e a interrompe; assim, o alarme continua apitando. Já enabled = false desativa o Update() do script, mas as coroutines continuam em execução. Uma coroutine termina quando é interrompida por meio de sua referência ou por StopAllCoroutines(), quando chega à última linha ou quando seu GameObject é desativado com SetActive(false) ou destruído.

challenge icon

Desafio

Fácil

A tecla Space acende o pavio da Bomb: a coroutine Fuse registra Fuse lit, espera fuseTime (3) segundos, registra Boom e destrói a bomba. Um clique deveria desarmá-la, mas desativa o script, e a bomba ainda explode. Corrija o desarme:

  • Um clique enquanto o pavio está queimando o interrompe e registra Defused. A bomba permanece.
  • Depois, Space pode acender o pavio novamente e, dessa vez, sem nenhum clique, a bomba explode 3 segundos depois.

Pressione Play, acenda o pavio, clique e observe o Console; depois, Check.

Experimente você mesmo

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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Física e jogabilidade