Wellen als Daten
Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 27 von 64.
Die Wellen eines Levels sind eine Liste: drei Grunts, dann zwei Brutes, dann ein Boss. Wenn sie im Code eines Spawners festgelegt sind, braucht jedes Level seinen eigenen Code. Werden sie als Daten festgelegt, kommt die Liste in ein Asset, ein Asset pro Level, und ein Spawner-Skript liest das Asset, das ihm übergeben wird. Jeder Eintrag ist eine [System.Serializable]-Klasse, sodass der Inspector des Assets die Liste 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 in einer 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 der Größe und den Zeilen Element 0, Element 1, jeweils mit Enemy, Count und Spacing; die Schaltfläche + fügt eine Welle hinzu. 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
MittelVerwandle den Rhythmus des Droppers in ein Song-Asset.
- Schreibe in
DropPattern.cseine[System.Serializable]-KlasseDropmit den öffentlichen Feldernint laneundfloat delay. - Schreibe darunter
DropPattern : ScriptableObjectmit[CreateAssetMenu]und den öffentlichen FeldernGameObject blockPrefab,float laneWidth,List<Drop> drops. - Verwende in
Dropperpublic DropPattern pattern;: Warte bei jedem Dropdrop.delayund lasse dann den Block fallen, der entlang der x-Achse umdrop.lane * pattern.laneWidthverschoben wurde.
Drücke auf „Spielen“: Vier Blöcke fallen. Drücke dann auf „Prü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
Alle Lektionen in Spielarchitektur in Unity
1Komponenten statt Hierarchien
Kleine KomponentenEin Basis-GegnerskriptAbstrakte KomponentenZusammenwirkende KomponentenRückblick: Modulares GeschützRückblick: Zwillingskanone4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-TabelleRückblick: Beute auswürfeln2Schnittstellen in Unity
IDamageableSchnittstellen und TryGetComponentGetComponentsZusammenfassung: InteraktionstasteZusammenfassung: Nächstes in Reichweite5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenDen Wind speichernWellen als DatenRückblick: Item-DatenbankRückblick: Im Shop einkaufen8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearestÜbe selbstständig: Unity-Playground