Nächste Welle
Lektion 17 von 18 im Kurs Unity-Spiel: Tower Defense von Coddy.
Zwischen den Wellen baut der Spieler, und ein Countdown zeigt an, wie viel Zeit noch bleibt. Ein bereiter Spieler kann die nächste Welle mit einer Schaltfläche vorzeitig starten. Die Pause ist eine Schleife in einer Coroutine, die null zurückgibt, sodass sie einmal pro Frame ausgeführt wird: Sie zählt die verbleibende Zeit herunter, zeigt sie an und endet, wenn die Zeit abgelaufen ist oder die Schaltfläche die Welle angefordert hat. Die Schaltfläche setzt lediglich einen booleschen Wert, und die Schleife liest ihn aus:
while (left > 0f && !skipRequested)
{
// zeige die verbleibenden Sekunden an, zähle herunter, warte einen Frame
}
skipRequested = false;Der boolesche Wert wird nach seiner Verwendung wieder auf false gesetzt, sonst würde jede Pause nach der ersten sofort enden. Mathf.CeilToInt rundet auf, sodass bei 2.3 verbleibenden Sekunden 3 angezeigt wird und der Countdown während der gesamten letzten Sekunde 1 statt 0 anzeigt. Der Countdown ist eine eigene Coroutine, und yield return StartCoroutine(Countdown()); führt sie aus und wartet, bis sie beendet ist, bevor die Wellenschleife fortgesetzt wird.
Das HUD zeigt auch die Wellennummer an. Der Spawner kennt sie und der GameManager zeigt sie an, daher löst der Spawner ein C#-Ereignis namens WaveStarted mit der Welle und der Anzahl der Wellen aus. Anders als die statischen Ereignisse der Gegner gehört es zu dem einen Spawner, und der GameManager abonniert es über sein Feld spawner.
Aufgabe
Schwer- Füge in
WaveSpawnerdie serialisierten FeldercountdownText(ein TMP_Text) undnextWaveButton(ein GameObject) sowiepublic void CallNextWave()hinzu, das die Schaltfläche aufruft, um die Welle jetzt anzufordern. - Ersetze die Wartezeit vor jeder Welle durch einen Countdown, der mit
yield return StartCoroutine(Countdown());ausgeführt wird. Währenddessen wird die Schaltfläche angezeigt und der Text lautetNext wave in 8; die verbleibenden Sekunden werden aufgerundet. Der Countdown endet, wenn die Zeit abgelaufen ist oder die Schaltfläche angeklickt wurde; danach ist der Text leer und die Schaltfläche ausgeblendet. - Füge
public event Action<int, int> WaveStartedhinzu, das beim Start einer Welle mit deren Nummer (beginnend bei 1) und der Anzahl der Wellen ausgelöst wird. - Füge in
GameManagerdie serialisierten Felderspawner(ein WaveSpawner) undwaveText(ein TMP_Text) hinzu, abonniere WaveStarted und zeigeWave 1/8an.
Das HUD enthält WaveText, CountdownText und NextWaveButton. Drücke Play, baue und starte die erste Welle vorzeitig, dann Check.
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 = 5f;
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");
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.