Menu
CoddyTech

Detener corrutinas

Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 25 de 63.

StartCoroutine devuelve un Coroutine, un identificador de la corrutina que inició. Guárdalo en un campo y StopCoroutine(handle) detiene esa corrutina donde está pausada: las líneas que siguen a su yield nunca se ejecutan. StopAllCoroutines() detiene todas las corrutinas que inició el script. La barra espaciadora activa y desactiva esta alarma:

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);
    }
}

El campo no se vacía por sí solo cuando la corrutina se detiene, así que la alarma vuelve a asignarle null, y la siguiente vez que pulses la barra espaciadora no habrá ninguna corrutina en ejecución. Hay dos formas que parecen correctas, pero no funcionan. StopCoroutine(Beep()) vuelve a llamar a Beep(), lo que crea una corrutina nueva que no se ha iniciado, y la detiene; así que la alarma sigue sonando. Y enabled = false desactiva el Update() del script, pero sus corrutinas siguen ejecutándose. Una corrutina termina cuando se detiene mediante su identificador o mediante StopAllCoroutines(), cuando llega a su última línea o cuando su GameObject se desactiva con SetActive(false) o se destruye.

challenge icon

Desafío

Fácil

La barra espaciadora enciende la mecha de Bomb: la corrutina Fuse registra Fuse lit, espera fuseTime (3) segundos, registra Boom y destruye la bomba. Se supone que un clic la desactiva, pero apaga el script y la bomba explota de todos modos. Corrige la desactivación:

  • Un clic mientras la mecha está encendida la detiene y registra Defused. La bomba se queda.
  • Después, la barra espaciadora puede volver a encender la mecha y, esa vez, si no haces clic, la bomba explota 3 segundos después.

Pulsa Jugar, enciende la mecha, haz clic y observa la Consola; después, pulsa Comprobar.

Pruébalo tú mismo

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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Física y jugabilidad