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.
Desafío
FácilLa 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);
}
}
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
1Cuerpo rígido
Gravedad y masaEmpujar con AddForceSaltar con un impulsoFixedUpdate para físicaVelocidadCuerpos cinemáticosRepaso: plataforma de lanzamiento4Corrutinas
InvocarInvokeRepeating y CancelInvokeTu primera corrutinaBucles en corrutinasDetener corrutinasRepaso: cuenta regresiva2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de monedas
La bola rodanteMonedas para recoger