Menu
CoddyTech

Schleifen in Coroutinen

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

Eine Schleife mit einem yield return darin läuft über viele Frames, da jeder Durchlauf pausiert, bevor der nächste beginnt. Mit WaitForSeconds wiederholt die Schleife etwas im Takt. Diese Sirene blinkt 3-mal:

IEnumerator Flash()
{
    for (int i = 0; i < 3; i++)
    {
        lamp.enabled = true;
        yield return new WaitForSeconds(0.2f);
        lamp.enabled = false;
        yield return new WaitForSeconds(0.2f);
    }
}

Mit yield return null führt die Schleife in jedem Frame ein wenig aus, bis ihre Bedingung erfüllt ist. So animiert eine Coroutine etwas. Dieser Ballon wächst bei einem Maßstab von 1 um 0.5 pro Sekunde, bis sein Maßstab 2 erreicht, und gibt dann Folgendes aus:

IEnumerator Inflate()
{
    while (transform.localScale.x < 2f)
    {
        transform.localScale += Vector3.one * 0.5f * Time.deltaTime;
        yield return null;
    }
    Debug.Log("Full");
}

Time.deltaTime funktioniert hier wie in Update(): Die Coroutine wird einmal pro Frame fortgesetzt, und die Zeile nach der Schleife wird erst ausgeführt, wenn die Schleife beendet ist. Ohne das yield läuft die gesamte Schleife innerhalb eines Frames, und der Ballon ist sofort voll. Eine while (true)-Schleife ist in einer Coroutine in Ordnung, solange sie bei jedem Durchlauf yield ausführt; ohne ein yield gibt sie den Frame niemals zurück, und der Unity-Editor friert ein.

challenge icon

Aufgabe

Einfach

Die Leertaste startet die Coroutine Ride des Portcullis des Schlosses. Schreibe Ride, sodass das Tor eine vollständige Fahrt macht:

  • Es fährt height (3) Einheiten mit speed (1.5) Einheiten pro Sekunde nach oben, hält genau oben an und gibt Open aus.
  • Es bleibt 1 Sekunde geöffnet.
  • Es fährt mit derselben Geschwindigkeit wieder nach unten zu seinem Ausgangspunkt (down) und gibt Closed aus.

Drücke Play und dann die Leertaste, anschließend Check.

Probier es selbst

using System.Collections;
using UnityEngine;

public class Portcullis : MonoBehaviour
{
    public float speed = 1.5f;
    public float height = 3f;
    Vector3 down;

    void Start()
    {
        down = transform.position;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(Ride());
        }
    }

    IEnumerator Ride()
    {
        // Fahre um height Einheiten mit speed nach oben und protokolliere Open, bleibe 1 Sekunde, fahre wieder nach unten und protokolliere Closed
        yield return null;
    }
}
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