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.
Wyzwanie
ŚredniZamień rytm Dropper na zasób utworu.
- W pliku
DropPattern.csnapisz klasę[System.Serializable]Dropz publicznymi polamiint laneifloat delay. - Poniżej napisz
DropPattern : ScriptableObjectz[CreateAssetMenu]oraz publicznymi polamiGameObject blockPrefab,float laneWidthiList<Drop> drops. - W klasie
Dropperużyjpublic DropPattern pattern;: dla każdego elementu odczekajdrop.delay, a następnie upuść blok przesunięty wzdłuż osi x odrop.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
1Komponenty, nie hierarchie
Małe komponentyBazowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPowtórka: modułowa wieżyczkaPowtórka: podwójne działo4Dane serializowane
Klasy serializowalneListy w InspectorzeEnumy w InspectorzePodsumowanie: tabela łupówPodsumowanie: losowanie łupów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPowtórka: klawisz interakcjiPowtórka: najbliższy w zasięgu5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaOcal wiatrFale jako danePowtórka: Baza przedmiotówPowtórka: Kupowanie w sklepie8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearestPoćwicz samodzielnie: Edytor online Unity