Arenayı Temizle
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 55 / 64.
static olarak işaretlenmiş bir olay tek bir nesneye değil, sınıfa aittir. Var olmuş ve olacak her düşman için tek bir Enemy.Died olayı vardır; bu nedenle oluşturulmuş bir düşman olmasa bile oluşturucu Enemy.Died += OnEnemyDied; ile abone olabilir ve her düşman bu olayı kendisini bağımsız değişken olarak kullanarak tetikler. Aynı fikir, sade C# ile:
public class Coin
{
public static event Action<Coin> Picked;
public void Pick()
{
Picked?.Invoke(this);
}
}
public class Purse
{
private int coins;
public Purse()
{
Coin.Picked += OnPicked; // Henüz Coin gerekli değil
}
void OnPicked(Coin coin)
{
coins++;
}
}Örnek olayına hero.Died şeklinde bir nesne üzerinden, statik olaya ise Coin.Picked şeklinde sınıf adı üzerinden erişilir. Statik bir olay tüm nesnelerden daha uzun süre yaşar; bu nedenle OnDisable içinde abonelikten çıkın, yoksa yok edilmiş bir oluşturucu listesinde kalır.
Görev
OrtaHer dalganın, arenada düşman kalmayana kadar beklemesini sağla.
Enemyiçindepublic static event Action<Enemy> Died;ekle veDestroy(gameObject);çağrısından hemen önceDied?.Invoke(this);çağır.WaveSpawneriçindealivedeğerini say: her düşman oluşturulduğunda 1 ekle;OnEnableyöntemininEnemy.Diedetkinliğine eklediği veOnDisableyönteminin çıkardığı bir yöntemde 1 azalt.- Bir dalga oluşturulduktan sonra
alive > 0olduğu sürece bekle.
“Oyna” düğmesine bas ve 1. dalgayı yen: 2. dalga 2 saniye sonra gelir. Ardından “Kontrol et” düğmesine bas.
Kendin dene
using System.Collections;
using UnityEngine;
public class WaveSpawner : MonoBehaviour
{
[SerializeField] private WaveSet waveSet;
[SerializeField] private Transform[] spawnPoints;
public int Wave { get; private set; }
void Start()
{
StartCoroutine(RunWaves());
}
IEnumerator RunWaves()
{
while (true)
{
foreach (Wave wave in waveSet.waves)
{
Wave++;
Debug.Log("Wave " + Wave);
for (int i = 0; i < wave.count; i++)
{
Transform point = spawnPoints[i % spawnPoints.Length];
Instantiate(wave.enemy, point.position, Quaternion.identity);
yield return new WaitForSeconds(wave.spacing);
}
yield return new WaitForSeconds(waveSet.restBetweenWaves);
}
}
}
}
Unity'de Oyun Mimarisi bölümündeki tüm dersler
1Kalıtım Değil, Bileşenler
Küçük BileşenlerTemel Düşman Script'iSoyut BileşenlerBirlikte Çalışan BileşenlerTekrar: Modüler TaretTekrar: Çift Namlulu Top4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larTekrar: Ganimet TablosuTekrar: Ganimeti At7Durum Makineleri
Sınıflar Olarak DurumlarAlarm DurumuBir Durum MakinesiGeçişlerDüşmanların Yapay ZekâsıŞövalye SaldırıyorÖzet: Kapı Durumları10Proje: Arena Hayatta Kalma
KahramanDüşman Türleri2Unity'de Arayüzler
IDamageableArayüzler ve TryGetComponentGetComponentsÖzet: Etkileşim TuşuÖzet: Erişim Mesafesindeki En Yakın5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriOrtak AyarlarRüzgârı KaydetVeri Olarak DalgalarTekrar: Eşya VeritabanıTekrar: Dükkândan Satın Al8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearestKendi başına pratik yap: Unity playground