Deine erste Coroutine
Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 23 von 63.
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 fortfährt, 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# gibt yield return eine Methode, die ihre Werte einzeln ausgibt; Unity fragt nach dem nächsten Wert, wenn 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 schaltet auf Grün, 3 Sekunden später auf Gelb und nach einer weiteren Sekunde auf 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 läuft Start() weiter; Unity setzt sie nach jeder Wartezeit fort, wobei ihre lokalen Variablen unverändert bleiben. Ein einfaches 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.
Aufgabe
EinfachDie Stacheln warten unter dem Boden. Lass die Leertaste die Falle mit einer Coroutine namens Spring auslösen:
- Sofort:
Clickprotokollieren. - Eine halbe Sekunde später: Die Stacheln springen 1 Einheit nach oben.
- 2 Sekunden danach: Sie sinken wieder 1 Einheit nach unten.
Drücke Wiedergabe, drücke die Leertaste und beobachte, dann 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
}
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