Veri Olarak Dalgalar
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 22 / 50.
Bir seviyenin dalgaları bir listedir: üç er, ardından iki iri düşman, sonra bir bölüm sonu canavarı. Bir dalga oluşturucunun kodunda yazıldığında her seviyenin kendine ait kodu gerekir. Veri olarak yazıldığında liste bir varlığa konur; her seviye için bir varlık olur ve tek bir dalga oluşturucu betiği kendisine verilen varlığı okur. Her girdi bir [System.Serializable] sınıfıdır, böylece varlığın Inspector'ı listeyi gösterir:
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;
}Bunların tümü tek bir dosyadadır: WaveSet.cs: ScriptableObject kendi adıyla bir dosyada bulunmalıdır ve sıradan Wave sınıfı onun yanında yer alabilir. Bir WaveSet varlığı seçtiğinde Inspector, Boyutuyla birlikte Waves'i ve her biri Enemy, Count ve Spacing içeren Element 0, Element 1 satırlarını gösterir; + düğmesi bir dalga ekler. Dalga oluşturucu, coroutine içinde listede ilerler:
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");
}
}Level1'de aralarında 0.5 saniye olacak şekilde 3 er ve ardından 2 iri düşman bulunduğunda, erler 0, 0.5 ve 1. saniyelerde gelir; son erden sonraki bekleme aralığı ve 3 saniyelik dinlenme süresi geçer, ilk iri düşman ise 4.5 saniyede gelir. Level 2'nin dalga oluşturucusu, daha zorlu dalgaların bulunduğu bir Level2 varlığı alır ve betik aynı kalır.
Görev
OrtaBlok Yağmuru: bloklar gökyüzünden ritim eşliğinde düşer ve sen oklara basarak onlardan kaçarsın. Dropper, lanes dizisinin her şeridine bir blok bırakır; her seferinde 1 saniye bekler. Ritmi veriye dönüştür, böylece her şarkı bir varlık olabilir:
DropPattern.csdosyasında,[System.Serializable]sınıfıDrop'u yaz;lane(bir int: -1 sol, 0 orta, 1 sağ) vedelay(bir float: bu düşüşten önce beklenecek saniye sayısı) adlı public alanları olsun. Altına,[CreateAssetMenu]özelliğine veblockPrefab(bir GameObject),laneWidth(bir float) vedrops(birList<Drop>) adlı public alanlara sahip bir ScriptableObject olanDropPattern'ı yaz.Dropperiçinde, her iki alanı da DropPattern türünde bir public alan olanpatternile değiştir. Her düşüşü sırayla ele al:delaysüresi kadar bekle, ardından desenin bloğunu Dropper'ın konumundan x boyuncalaneçarpılaneWidthkadar kaydırılmış konuma bırak. Son düşüşten sonraPattern donemesajını günlüğe yaz.
Projede bir Song1 varlığı bulunuyor: şerit genişliği 2 ve dört düşüş. Inspector bunu Dropper'ın pattern alanına yerleştiriyor. Oynat'a basıp kaçın, ardından Kontrol Et'e bas.
Kendin dene
using System.Collections.Generic;
using UnityEngine;
// Drop (tek bir blok: bulunduğu şerit ve öncesindeki bekleme süresi) ile DropPattern (varlık) buraya gelir
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Unity'de Oyun Mimarisi bölümündeki tüm dersler
1Hiyerarşiler Değil, Bileşenler
Küçük BileşenlerTemel Bir Düşman BetiğiSoyut BileşenlerBirlikte Çalışan BileşenlerÖzet: Modüler Taret4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larÖzet: Ganimet Tablosu7Durum Makineleri
Sınıflar Olarak DurumlarBir Durum MakinesiGeçişlerDüşmanların Yapay ZekâsıTekrar: Kapı Durumları10Proje: Arena Hayatta Kalma
KahramanDüşman Türleri5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriPaylaşılan AyarlarVeri Olarak DalgalarTekrar: Eşya Veritabanı8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearest