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.
Aufgabe
EinfachLass die Stachelfalle mit einer Coroutine aufspringen, wenn du die Leertaste drückst.
- Schreibe
IEnumerator Spring(): GibClickim Protokoll aus, schreibeyield return new WaitForSeconds(0.5f);und danachtransform.position += Vector3.up;. - Warte dann auf dieselbe Weise 2 Sekunden und ziehe
Vector3.upwieder ab. - Starte sie im
iffür die Leertaste mitStartCoroutine(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
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: Countdown10Projekt: Arena-Flucht
Die ArenaJäger2Kollisionen
OnCollisionEnterWas habe ich getroffen?Beim Aufprall zerbrechenAuf dem Boden stehenAbprallen und ReibungCollider-FormenRückblick: Zerstörbare Wand5Projekt: Münzrausch
Der rollende BallMünzen zum Einsammeln11Abschließende Herausforderungen
KanonenreichweiteBewegliche ZieleMurmelgolfIns LochEscape RoomDie TürÜbe selbstständig: Unity-Playground