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.
Aufgabe
EinfachDie 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 mitspeed(1.5) Einheiten pro Sekunde nach oben, hält genau oben an und gibtOpenaus. - Es bleibt 1 Sekunde geöffnet.
- Es fährt mit derselben Geschwindigkeit wieder nach unten zu seinem Ausgangspunkt (
down) und gibtClosedaus.
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;
}
}
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
1Rigidbody
Schwerkraft und MasseMit AddForce schiebenMit einem Impuls springenFixedUpdate für PhysikGeschwindigkeitKinematische KörperRückblick: Startrampe4Coroutinen
AufrufenWiederholt aufrufen, Aufruf abbrechenDeine erste CoroutineSchleifen in CoroutinenCoroutinen beendenRückblick: Countdown2Kollisionen
OnCollisionEnterWas habe ich getroffen?Beim Aufprall zerbrechenAuf dem Boden stehenAbprallen und ReibungCollider-FormenRückblick: Zerstörbare Wand