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.
Desafío
FácilHaz clic para desactivar la bomba sin apagar el script.
- Añade un campo
Coroutine fuse;. Al pulsar la barra espaciadora, establecefuse = StartCoroutine(Fuse());. - Al hacer clic, reemplaza
enabled = false;: cuandofuse != null, llama aStopCoroutine(fuse);, establecefuse = null;y registraDefused.
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
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 regresiva10Proyecto: Escape de la arena
La arenaCazadores2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de Monedas
La pelota rodanteMonedas para recoger3Disparadores
Colisionadores de tipo triggerOnTriggerEnterObjetos coleccionablesLas cajas guardan el restoZonas letalesEntrada y salidaRepaso: llave y puertaPractica por tu cuenta: Playground de Unity