Countdown
Lektion 23 von 25 im Kurs Unity-Spiel: Tower Defense von Coddy.
Zwischen den Wellen baut der Spieler, und ein Countdown zeigt an, wie viel Zeit noch übrig ist. Ein bereiter Spieler kann die nächste Welle frühzeitig mit einer Schaltfläche starten. Die Pause ist eine Schleife in einer Coroutine, die null zurückgibt, sodass sie einmal pro Frame läuft: Sie zählt die Zeit herunter, zeigt sie an und endet, wenn die Zeit abgelaufen ist oder die Schaltfläche die Welle angefordert hat. Die Schaltfläche setzt nur einen booleschen Wert, und die Schleife liest ihn aus:
while (left > 0f && !skipRequested)
{
// Zeige die verbleibenden Sekunden an, zähle herunter und warte einen Frame
}
skipRequested = false;Der boolesche Wert wird nach seiner Verwendung wieder auf false gesetzt, andernfalls würde jede Pause nach der ersten sofort enden. Mathf.CeilToInt rundet auf, daher werden bei 2.3 Sekunden Restzeit 3 angezeigt. yield return StartCoroutine(Countdown()); führt den Countdown aus und wartet, bis er abgeschlossen ist.
Aufgabe
SchwerZähle bis zu jeder Welle herunter; mit einer Schaltfläche kannst du sie früher starten.
- Füge in
WaveSpawnerdie serialisierten FeldercountdownText(TMP_Text) undnextWaveButton(GameObject),private bool callNow;sowiepublic void CallNextWave() { callNow = true; }hinzu. - Ersetze die Unterbrechung durch
yield return StartCoroutine(Countdown());: Zeige die Schaltfläche an und zeige, solange noch Zeit übrig ist undcallNownicht gesetzt ist, in jedem Frame aufgerundetNext wave in 8an. - Setze dann
callNowwieder auf false, leere den Text und blende die Schaltfläche aus.
Drücke „Spielen“: Mit „Next Wave“ wird die Wartezeit übersprungen. Drücke dann „Prüfen“.
Probier es selbst
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WaveSpawner : MonoBehaviour
{
[SerializeField] private List<Wave> waves = new List<Wave>();
[SerializeField] private Transform[] waypoints;
[SerializeField] private float timeBetweenWaves = 8f;
void Start()
{
StartCoroutine(RunWaves());
}
IEnumerator RunWaves()
{
for (int i = 0; i < waves.Count; i++)
{
yield return new WaitForSeconds(timeBetweenWaves);
Debug.Log("Wave " + (i + 1));
Wave wave = waves[i];
for (int n = 0; n < wave.count; n++)
{
Enemy enemy = Instantiate(wave.enemy, waypoints[0].position, Quaternion.identity);
enemy.waypoints = waypoints;
yield return new WaitForSeconds(wave.spacing);
}
}
Debug.Log("All waves sent");
}
}
Alle Lektionen in Unity-Spiel: Tower Defense
Übe selbstständig: Unity-Playground