Menu
CoddyTech

Detener corrutinas

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

StartCoroutine devuelve un Coroutine, un identificador de la corrutina que inició. Guárdalo en un campo, y StopCoroutine(handle) detiene esa corrutina en el punto donde está pausada: las líneas posteriores 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 cuando se detiene la corrutina, así que la alarma vuelve a asignarle null, y la siguiente vez que pulses la barra espaciadora sabrá que no hay nada en ejecución. Hay dos formas que parecen correctas, pero no funcionan. StopCoroutine(Beep()) vuelve a llamar a Beep(), lo que crea una nueva corrutina que aún no se ha iniciado, y detiene esa, así que la alarma sigue pitando. Y enabled = false desactiva Update() del script, pero sus corrutinas siguen ejecutándose. Una corrutina termina cuando se detiene mediante su identificador o con 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

Haz clic para desactivar la bomba sin apagar el script.

  1. Añade un campo Coroutine fuse;. Al pulsar la barra espaciadora, establece fuse = StartCoroutine(Fuse());.
  2. Al hacer clic, reemplaza enabled = false;: cuando fuse != null, llama a StopCoroutine(fuse);, establece fuse = null; y registra Defused.

Pulsa «Jugar», pulsa la barra espaciadora y después haz clic: la consola muestra Defused y la bomba permanece. 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);
    }
}

Todas las lecciones de Física y jugabilidad

Practica por tu cuenta: Playground de Unity