Menu
CoddyTech

Deine erste Coroutine

Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 24 von 71.

Update() muss in jedem Frame fertig werden und kann daher nicht warten. Eine Coroutine kann das: Sie ist eine Methode, die pausiert und später genau dort weitermacht, wo sie aufgehört hat. Sie gibt IEnumerator zurück, wofür using System.Collections; benötigt wird, und jedes yield return darin ist eine Pause. In C# erzeugt yield return eine Methode, die ihre Werte einzeln ausgibt; Unity fragt nach dem nächsten Wert, sobald die Wartezeit vorbei ist. yield return null wartet einen Frame, und yield return new WaitForSeconds(3f) wartet 3 Sekunden.

StartCoroutine(Cycle()) startet eine Coroutine. Diese Ampel wird grün, 3 Sekunden später gelb und nach einer weiteren Sekunde rot:

using System.Collections;
using UnityEngine;

public class TrafficLight : MonoBehaviour
{
    Renderer lamp;

    void Start()
    {
        lamp = GetComponent<Renderer>();
        StartCoroutine(Cycle());
    }

    IEnumerator Cycle()
    {
        lamp.material.color = Color.green;
        yield return new WaitForSeconds(3f);
        lamp.material.color = Color.yellow;
        yield return new WaitForSeconds(1f);
        lamp.material.color = Color.red;
    }
}

StartCoroutine führt die Coroutine sofort bis zu ihrem ersten yield aus, dann macht Start() weiter; Unity setzt sie nach jeder Wartezeit mit ihren lokalen Variablen in ihrem bisherigen Zustand fort. Ein bloßes Cycle(); ohne StartCoroutine bewirkt nichts: Es erstellt die pausierte Methode und verwirft sie, ohne dass auch nur eine Zeile davon ausgeführt wird. Und yield return 3f; ist keine Wartezeit von 3 Sekunden: Unity kennt nur Warteobjekte wie WaitForSeconds und behandelt jeden anderen Wert als einen Frame.

challenge icon

Aufgabe

Einfach

Lass die Stachelfalle mit einer Coroutine aufspringen, wenn du die Leertaste drückst.

  1. Schreibe IEnumerator Spring(): Gib Click im Protokoll aus, schreibe yield return new WaitForSeconds(0.5f); und danach transform.position += Vector3.up;.
  2. Warte dann auf dieselbe Weise 2 Sekunden und ziehe Vector3.up wieder ab.
  3. Starte sie im if für die Leertaste mit StartCoroutine(Spring());.

Drücke auf „Spielen“ und dann die Leertaste: Die Stacheln springen hoch und sinken dann wieder. Drücke anschließend auf „Prüfen“.

Probier es selbst

using System.Collections;
using UnityEngine;

public class SpikeTrap : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // Löse die Falle mit einer Coroutine aus
        }
    }

    // IEnumerator Spring(): Klicken, 0.5 s warten, 1 Einheit nach oben, 2 s warten, 1 Einheit nach unten
}

Alle Lektionen in Physik und Gameplay

Übe selbstständig: Unity-Playground