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.
Desafio
FácilA 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);
}
}
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
1Rigidbody
Gravidade e MassaEmpurrar com AddForcePular com um ImpulsoFixedUpdate para FísicaVelocidadeCorpos CinemáticosRevisão: Plataforma de Lançamento4Corrotinas
InvocarInvocar repetidamente, Cancelar invocaçãoSua primeira corrotinaLoops em corrotinasInterrompendo corrotinasRevisão: contagem regressiva2Colisões
OnCollisionEnterO que eu acertei?Quebre no impactoNo chãoQuique e atritoFormas dos collidersRevisão: Parede destrutível5Projeto: Corrida das Moedas
A Bola RolanteMoedas para Coletar