Menu
CoddyTech

Fale jako dane

Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 22 z 50.

Fale gry składające się na poziom to lista: trzech żołnierzy, potem dwóch osiłków, a na końcu boss. Jeśli zapiszesz je w kodzie obiektu generującego przeciwników, każdy poziom będzie potrzebował własnego kodu. Jeśli zapiszesz je jako dane, lista trafi do zasobu — po jednym zasobie na poziom — a jeden skrypt obiektu generującego przeciwników odczyta wskazany zasób. Każdy wpis jest klasą [System.Serializable], dzięki czemu lista jest widoczna w oknie Inspector zasobu:

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;
}

Całość znajduje się w jednym pliku, WaveSet.cs: ScriptableObject wymaga pliku o takiej samej nazwie, a zwykła klasa Wave może znajdować się obok. Wybierz zasób WaveSet, a w oknie Inspector zobaczysz Waves z polem Size i wierszami Element 0, Element 1, z których każdy zawiera Enemy, Count i Spacing; przycisk + dodaje falę. Obiekt generujący przeciwników przechodzi przez listę w korutynie:

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");
    }
}

Jeśli Level1 zawiera 3 żołnierzy pojawiających się w odstępach 0,5 sekundy, a następnie 2 osiłków, żołnierze pojawią się w 0, 0,5 i 1 sekundzie; po ostatnim żołnierzu nastąpi odstęp, a potem 3-sekundowa przerwa. Pierwszy osiłek pojawi się w 4,5 sekundy. Obiekt generujący przeciwników na poziomie 2 otrzymuje zasób Level2 z trudniejszymi falami, a skrypt pozostaje ten sam.

challenge icon

Wyzwanie

Średni

Block Rain: bloki spadają z nieba w rytm muzyki, a ty unikasz ich, używając strzałek. Dropper zrzuca blok na każdy pas swojej tablicy lanes, zawsze w odstępie 1 sekundy. Zamień rytm na dane, aby każda piosenka mogła być zasobem:

  • W pliku DropPattern.cs napisz klasę [System.Serializable] Drop z publicznymi polami lane (typ int: -1 — lewy, 0 — środkowy, 1 — prawy) oraz delay (typ float: liczba sekund oczekiwania przed tym zrzutem). Poniżej napisz DropPattern — ScriptableObject z [CreateAssetMenu] i publicznymi polami blockPrefab (GameObject), laneWidth (typ float) oraz drops (typ List<Drop>).
  • W Dropper zastąp oba pola publicznym polem pattern typu DropPattern. Dla każdego zrzutu, w kolejności, odczekaj czas delay, a następnie zrzuć blok z wzorca w pozycji Droppera przesuniętej wzdłuż osi x o wartość lane pomnożoną przez laneWidth. Po ostatnim zrzucie wypisz w logu Pattern done.

Projekt zawiera zasób Song1: szerokość pasa wynosi 2, a zrzutów są cztery. W Inspectorze jest on przypisany do pola pattern obiektu Dropper. Naciśnij Play i unikaj bloków, a następnie naciśnij Check.

Spróbuj swoich sił

using System.Collections.Generic;
using UnityEngine;

// Drop (jeden blok: jego tor i czas oczekiwania przed nim) oraz DropPattern (zasób) znajdują się tutaj
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Architektura gier w Unity