Wellen
Lektion 4 von 18 im Kurs Unity-Spiel: Tower Defense von Coddy.
Die Gegner kommen in Wellen: eine Gruppe derselben Art, mit Abständen entlang des Pfads, dann eine Pause vor der nächsten Gruppe. Eine Welle besteht aus einigen Zahlen und ist daher eine [System.Serializable]-Klasse, und der Spawner verwaltet eine List<Wave>, die der Inspector als auszufüllende Zeilen anzeigt. Ohne [System.Serializable] kann Unity keine Wave speichern, der Inspector zeigt die Liste nicht an und sie bleibt leer.
Das Timing wird mit einer Coroutine umgesetzt: einer Schleife, die Gegner spawnt und dann new WaitForSeconds(...) zurückgibt, um zu warten, ohne den Rest des Spiels anzuhalten. Eine Feuerwerksshow funktioniert mit ihren Salven genauso, mit einer Pause nach jeder Salve:
IEnumerator Show()
{
foreach (Salvo salvo in salvos)
{
for (int i = 0; i < salvo.rockets; i++)
{
Instantiate(rocketPrefab, launcher.position, Quaternion.identity);
yield return new WaitForSeconds(salvo.gap);
}
yield return new WaitForSeconds(pause);
}
}Die Gegner sind jetzt Prefabs. Die Felder eines Prefabs können nur auf Assets und auf Objekte innerhalb des Prefabs verweisen, daher ist das waypoints-Array eines neuen Gegners leer. Der Spawner verwaltet den Pfad und übergibt ihn jedem Gegner direkt nach Instantiate. Instantiate gibt den Typ zurück, der ihm übergeben wird. Bei einem Prefab-Feld vom Typ Enemy gibt es also den neuen Enemy zurück, bereit zum Konfigurieren.
Aufgabe
EinfachDer Grunt und der Runner sind jetzt Prefabs, zusammen mit einem Tank und einem Boss mit ihren eigenen EnemyData. Das Spawner-Objekt steht auf WP0. Schicke die Gegner in Wellen:
- Erstelle in
Wave.cseine serialisierbare Klasse namens Wave mit den öffentlichen Feldernenemy(ein Enemy: das Prefab),count(ein int) undspacing(ein float, die Sekunden zwischen zwei Gegnern). - Füge in
WaveSpawnerdrei serialisierte private Felder hinzu:waves(eineList<Wave>),waypoints(ein Transform-Array) undtimeBetweenWaves(ein float). - Starte von
Startaus eine Coroutine, die die Wellen der Reihe nach durchläuft. Warte für jede WelletimeBetweenWaves, gib die Nummer der Welle ab 1 alsWave 1aus, erzeuge dann ihrecountGegner am ersten Wegpunkt, weise jedem diewaypointszu und warte nach jedem Gegnerspacing. - Gib nach der letzten Welle
All waves sentaus.
Im Inspector werden die acht Wellen des Spiels und eine Pause von 8 Sekunden eingetragen. Drücke Play und beobachte, wie die ersten Wellen kommen, dann Check.
Probier es selbst
using UnityEngine;
// Kommt später: Schickt die Gegner in Wellen den Pfad entlang.
public class WaveSpawner : MonoBehaviour
{
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.