Menu
CoddyTech

Fale jako dane

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

Fale na danym poziomie to lista: trzech szeregowych, potem dwóch osiłków, a następnie bossa. Jeśli zapiszesz je w kodzie generatora, każdy poziom będzie wymagał własnego kodu. Jeśli zapiszesz je jako dane, lista trafi do zasobu — po jednym zasobie na poziom — a jeden skrypt generatora odczyta dowolny przekazany mu zasób. Każdy wpis to klasa [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 tej samej nazwie, a zwykła klasa Wave może znajdować się obok. Zaznacz zasób WaveSet, a okno Inspector pokaże fale wraz z polem Size i wierszami Element 0, Element 1, z których każdy zawiera pola Enemy, Count i Spacing; przycisk + dodaje falę. Generator 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 szeregowych pojawiających się co 0.5 sekundy, a następnie 2 osiłków, szeregowi pojawią się w 0, 0.5 i 1 sekundzie, po czym nastąpi przerwa między ostatnim szeregowym a kolejną falą oraz 3-sekundowy odpoczynek, a pierwszy osiłek pojawi się po 4.5 sekundy. Generator na Level2 otrzyma zasób Level2 z trudniejszymi falami, a skrypt pozostanie bez zmian.

challenge icon

Wyzwanie

Średni

Zamień rytm Dropper na zasób utworu.

  1. W pliku DropPattern.cs napisz klasę [System.Serializable] Drop z publicznymi polami int lane i float delay.
  2. Poniżej napisz DropPattern : ScriptableObject z [CreateAssetMenu] oraz publicznymi polami GameObject blockPrefab, float laneWidth i List<Drop> drops.
  3. W klasie Dropper użyj public DropPattern pattern;: dla każdego elementu odczekaj drop.delay, a następnie upuść blok przesunięty wzdłuż osi x o drop.lane * pattern.laneWidth.

Naciśnij „Graj”: spadną cztery bloki. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

using System.Collections.Generic;
using UnityEngine;

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

Wszystkie lekcje w sekcji Architektura gier w Unity

Poćwicz samodzielnie: Edytor online Unity