Menu
CoddyTech

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.

challenge icon

Aufgabe

Schwer
  1. Füge in WaveSpawner die serialisierten Felder countdownText (ein TMP_Text) und nextWaveButton (ein GameObject) sowie public void CallNextWave() hinzu, das die Schaltfläche aufruft, um die Welle jetzt anzufordern.
  2. 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 lautet Next 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.
  3. Füge public event Action<int, int> WaveStarted hinzu, das beim Start einer Welle mit deren Nummer (beginnend bei 1) und der Anzahl der Wellen ausgelöst wird.
  4. Füge in GameManager die serialisierten Felder spawner (ein WaveSpawner) und waveText (ein TMP_Text) hinzu, abonniere WaveStarted und zeige Wave 1/8 an.

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");
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Unity-Spiel: Tower Defense