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.
Wyzwanie
ŚredniBlock 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.csnapisz klasę[System.Serializable]Dropz publicznymi polamilane(typ int: -1 — lewy, 0 — środkowy, 1 — prawy) orazdelay(typ float: liczba sekund oczekiwania przed tym zrzutem). Poniżej napiszDropPattern— ScriptableObject z[CreateAssetMenu]i publicznymi polamiblockPrefab(GameObject),laneWidth(typ float) orazdrops(typList<Drop>). - W
Dropperzastąp oba pola publicznym polempatterntypu DropPattern. Dla każdego zrzutu, w kolejności, odczekaj czasdelay, a następnie zrzuć blok z wzorca w pozycji Droppera przesuniętej wzdłuż osi x o wartośćlanepomnożoną przezlaneWidth. Po ostatnim zrzucie wypisz w loguPattern 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
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
1Komponenty, nie hierarchie
Małe komponentyPodstawowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPodsumowanie: modułowa wieżyczka4Dane serializowane
Klasy serializowalneListy w InspectorzeWyliczenia w InspectorzePodsumowanie: tabela łupów10Projekt: Arena przetrwania
BohaterTypy wrogów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPodsumowanie: klawisz interakcji5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaFale jako danePowtórka: baza danych przedmiotów8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearest