Wellen als Daten
Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 22 von 50.
Die Wellen eines Levels sind eine Liste: drei Grunts, dann zwei Brutes, dann ein Boss. Wenn sie im Code eines Spawners festgeschrieben sind, braucht jedes Level einen eigenen Code. Als Daten gespeichert kommt die Liste in ein Asset, ein Asset pro Level, und ein Spawner-Skript liest das Asset ein, das ihm zugewiesen wurde. Jeder Eintrag ist eine [System.Serializable]-Klasse, sodass das Asset die Liste im Inspector anzeigt:
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class Wave
{
public GameObject enemy;
public int count = 1;
public float spacing = 1f;
}
[CreateAssetMenu(menuName = "Game/Wave Set")]
public class WaveSet : ScriptableObject
{
public List<Wave> waves;
public float restBetweenWaves = 3f;
}Das ist alles eine Datei, WaveSet.cs: Das ScriptableObject benötigt eine Datei mit seinem eigenen Namen, und die einfache Wave-Klasse kann danebenstehen. Wähle ein WaveSet-Asset aus, und der Inspector zeigt Waves mit seiner Größe und den Zeilen Element 0, Element 1, jeweils mit Enemy, Count und Spacing; über die Schaltfläche + wird eine Welle hinzugefügt. Der Spawner durchläuft die Liste in einer Coroutine:
public class WaveSpawner : MonoBehaviour
{
public WaveSet waveSet;
void Start()
{
StartCoroutine(SendWaves());
}
IEnumerator SendWaves()
{
foreach (Wave wave in waveSet.waves)
{
for (int i = 0; i < wave.count; i++)
{
Instantiate(wave.enemy, transform.position, Quaternion.identity);
yield return new WaitForSeconds(wave.spacing);
}
yield return new WaitForSeconds(waveSet.restBetweenWaves);
}
Debug.Log("Last wave sent");
}
}Wenn Level1 3 Grunts im Abstand von 0.5 Sekunden und danach 2 Brutes enthält, kommen die Grunts bei 0, 0.5 und 1 Sekunde, danach folgen der Abstand nach dem letzten Grunt und die 3 Sekunden Pause, und der erste Brute kommt bei 4.5 Sekunden. Der Spawner von Level 2 erhält ein Level2-Asset mit schwierigeren Wellen, und das Skript bleibt unverändert.
Aufgabe
MittelBlock Rain: Blöcke fallen im Rhythmus vom Himmel, und du weichst ihnen mit den Pfeiltasten aus. Der Dropper lässt in jede Spur seines lanes-Arrays einen Block fallen, immer im Abstand von 1 Sekunde. Verwandle den Rhythmus in Daten, damit jedes Lied ein Asset sein kann:
- Schreibe in
DropPattern.cseine[System.Serializable]-KlasseDropmit den öffentlichen Feldernlane(ein int: -1 links, 0 Mitte, 1 rechts) unddelay(ein float: die Sekunden, die vor diesem Drop gewartet werden sollen). Schreibe darunterDropPattern, ein ScriptableObject mit[CreateAssetMenu]und den öffentlichen FeldernblockPrefab(ein GameObject),laneWidth(ein float) unddrops(eineList<Drop>). - Ersetze in
Dropperbeide Felder durch ein öffentliches Feldpatternvom Typ DropPattern. Warte für jeden Drop der Reihe nach dessendelayund lass dann den Block des Patterns an der Position des Droppers fallen, versetzt umlanemallaneWidthentlang der x-Achse. Gib nach dem letzten DropPattern doneaus.
Das Projekt enthält ein Song1-Asset: Spurbreite 2 und vier Drops. Im Inspector ist es dem Feld pattern des Droppers zugewiesen. Drücke Spielen und weiche den Blöcken aus, dann klicke auf Überprüfen.
Probier es selbst
using System.Collections.Generic;
using UnityEngine;
// Drop (ein Block: seine Spur und die Wartezeit davor) und DropPattern (das Asset) kommen hierhin
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Spielarchitektur in Unity
1Komponenten statt Hierarchien
Kleine KomponentenEin Basisskript für GegnerAbstrakte KomponentenKomponenten im ZusammenspielRückblick: Modularer Geschützturm4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-Tabelle7Zustandsautomaten
Zustände als KlassenEin ZustandsautomatÜbergängeGegner-KIWiederholung: Türzustände10Projekt: Arena-Überlebenskampf
Der HeldGegnertypen2Interfaces in Unity
IDamageableInterfaces und TryGetComponentGetComponentsRückblick: Interaktionstaste5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenWellen als DatenRückblick: Item-Datenbank8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearest