Menu
CoddyTech

Coroutinen beenden

Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 25 von 63.

StartCoroutine gibt ein Coroutine-Objekt zurück, einen Verweis auf die Coroutine, die gestartet wurde. Speichere es in einem Feld, und StopCoroutine(handle) stoppt diese Coroutine an der Stelle, an der sie pausiert ist: Die Zeilen nach ihrem yield werden nie ausgeführt. StopAllCoroutines() stoppt alle Coroutinen, die das Skript gestartet hat. Mit der Leertaste schaltest du diesen Alarm ein und aus:

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

Das Feld wird nicht automatisch geleert, wenn die Coroutine stoppt. Deshalb setzt der Alarm es wieder auf null, und beim nächsten Drücken der Leertaste weiß das Skript, dass nichts läuft. Zwei scheinbar richtige Möglichkeiten funktionieren nicht. StopCoroutine(Beep()) ruft Beep() erneut auf, wodurch eine neue, noch nicht gestartete Coroutine erstellt wird, und stoppt diese. Deshalb piept der Alarm weiter. Und enabled = false schaltet zwar das Update() des Skripts aus, aber die Coroutinen laufen weiter. Eine Coroutine endet, wenn sie über ihren Verweis oder durch StopAllCoroutines() gestoppt wird, wenn sie ihre letzte Zeile erreicht oder wenn ihr GameObject mit SetActive(false) deaktiviert oder zerstört wird.

challenge icon

Aufgabe

Einfach

Die Leertaste zündet die Lunte der Bomb: Die Coroutine Fuse protokolliert Fuse lit, wartet fuseTime (3) Sekunden, protokolliert Boom und zerstört die Bombe. Ein Klick soll sie entschärfen, schaltet aber das Skript aus, und die Bombe geht trotzdem hoch. Behebe das Entschärfen:

  • Ein Klick, während die Lunte brennt, stoppt sie und protokolliert Defused. Die Bombe bleibt bestehen.
  • Danach kann die Leertaste die Lunte erneut zünden, und diesmal geht die Bombe ohne Klick 3 Sekunden später hoch.

Drücke Play, zünde die Lunte, klicke und beobachte die Console, dann Check.

Probier es selbst

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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Physik und Gameplay