Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Verwandle den Rhythmus des Droppers in ein Song-Asset.

  1. Schreibe in DropPattern.cs eine [System.Serializable]-Klasse Drop mit den öffentlichen Feldern int lane und float delay.
  2. Schreibe darunter DropPattern : ScriptableObject mit [CreateAssetMenu] und den öffentlichen Feldern GameObject blockPrefab, float laneWidth, List<Drop> drops.
  3. Verwende in Dropper public DropPattern pattern;: Warte bei jedem Drop drop.delay und lasse dann den Block fallen, der entlang der x-Achse um drop.lane * pattern.laneWidth verschoben 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

Übe selbstständig: Unity-Playground