Menu
CoddyTech

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.

challenge icon

Görev

Orta

Her dalganın, arenada düşman kalmayana kadar beklemesini sağla.

  1. Enemy içinde public static event Action<Enemy> Died; ekle ve Destroy(gameObject); çağrısından hemen önce Died?.Invoke(this); çağır.
  2. WaveSpawner içinde alive değerini say: her düşman oluşturulduğunda 1 ekle; OnEnable yönteminin Enemy.Died etkinliğine eklediği ve OnDisable yönteminin çıkardığı bir yöntemde 1 azalt.
  3. Bir dalga oluşturulduktan sonra alive > 0 olduğ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

Kendi başına pratik yap: Unity playground