Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Block 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.cs eine [System.Serializable]-Klasse Drop mit den öffentlichen Feldern lane (ein int: -1 links, 0 Mitte, 1 rechts) und delay (ein float: die Sekunden, die vor diesem Drop gewartet werden sollen). Schreibe darunter DropPattern, ein ScriptableObject mit [CreateAssetMenu] und den öffentlichen Feldern blockPrefab (ein GameObject), laneWidth (ein float) und drops (eine List<Drop>).
  • Ersetze in Dropper beide Felder durch ein öffentliches Feld pattern vom Typ DropPattern. Warte für jeden Drop der Reihe nach dessen delay und lass dann den Block des Patterns an der Position des Droppers fallen, versetzt um lane mal laneWidth entlang der x-Achse. Gib nach dem letzten Drop Pattern done aus.

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
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 Spielarchitektur in Unity