Räum die Arena
Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 55 von 64.
Ein als static gekennzeichnetes Ereignis gehört zur Klasse, nicht zu einem einzelnen Objekt. Es gibt genau ein Enemy.Died für alle Gegner, die es jemals geben wird. Daher kann sich der Spawner mit Enemy.Died += OnEnemyDied; anmelden, bevor irgendein Gegner existiert, und jeder Gegner löst es mit sich selbst als Argument aus. Dieselbe Idee in einfachem C#:
public class Coin
{
public static event Action<Coin> Picked;
public void Pick()
{
Picked?.Invoke(this);
}
}
public class Purse
{
private int coins;
public Purse()
{
Coin.Picked += OnPicked; // noch kein Coin erforderlich
}
void OnPicked(Coin coin)
{
coins++;
}
}Auf ein Instanzereignis greifst du über ein Objekt zu, wie bei hero.Died; auf ein statisches über den Klassennamen, wie bei Coin.Picked. Ein statisches Ereignis überlebt jedes Objekt. Melde dich daher in OnDisable ab, sonst bleibt ein zerstörter Spawner in seiner Liste.
Aufgabe
MittelLass jede Welle warten, bis die Arena leer ist.
- Füge in
Enemypublic static event Action<Enemy> Died;hinzu und rufeDied?.Invoke(this);direkt vorDestroy(gameObject);auf. - Zähle in
WaveSpawneralive: Erhöhe den Wert bei jedem Spawn um 1 und verringere ihn in einer Methode um 1, dieOnEnablezuEnemy.Diedhinzufügt und dieOnDisableentfernt. - Warte nach dem Spawn einer Welle, solange
alive > 0gilt.
Drücke „Spielen“ und besiege Welle 1: Welle 2 kommt 2 Sekunden später. Drücke dann „Prüfen“.
Probier es selbst
using System.Collections;
using UnityEngine;
public class WaveSpawner : MonoBehaviour
{
[SerializeField] private WaveSet waveSet;
[SerializeField] private Transform[] spawnPoints;
public int Wave { get; private set; }
void Start()
{
StartCoroutine(RunWaves());
}
IEnumerator RunWaves()
{
while (true)
{
foreach (Wave wave in waveSet.waves)
{
Wave++;
Debug.Log("Wave " + Wave);
for (int i = 0; i < wave.count; i++)
{
Transform point = spawnPoints[i % spawnPoints.Length];
Instantiate(wave.enemy, point.position, Quaternion.identity);
yield return new WaitForSeconds(wave.spacing);
}
yield return new WaitForSeconds(waveSet.restBetweenWaves);
}
}
}
}
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ürfeln7Zustandsautomaten
Zustände als KlassenDer AlarmzustandEin ZustandsautomatÜbergängeGegner-KIDer Ritter greift anRückblick: Türzustände10Projekt: Überleben in der Arena
Der HeldGegnertypen2Schnittstellen 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