Menu
CoddyTech

Bersihkan Arena

Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 55 dari 64.

Peristiwa bertanda static dimiliki oleh class, bukan oleh satu object. Hanya ada satu Enemy.Died untuk semua enemy yang pernah ada, jadi spawner dapat berlangganan dengan Enemy.Died += OnEnemyDied; sebelum ada enemy, dan setiap enemy memicunya dengan dirinya sendiri sebagai argumen. Gagasan yang sama dalam C# biasa:

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;   // belum perlu Coin
    }

    void OnPicked(Coin coin)
    {
        coins++;
    }
}

Peristiwa instance diakses melalui object, seperti hero.Died; peristiwa static melalui nama class, seperti Coin.Picked. Peristiwa static bertahan lebih lama daripada semua object, jadi berhentilah berlangganan di OnDisable, atau spawner yang sudah dihancurkan akan tetap ada di daftarnya.

challenge icon

Tantangan

Sedang

Buat setiap wave menunggu hingga arena kosong.

  1. Di Enemy, tambahkan public static event Action<Enemy> Died; dan panggil Died?.Invoke(this); tepat sebelum Destroy(gameObject);.
  2. Di WaveSpawner, hitung alive: tambahkan 1 setiap kali melakukan spawn, kurangi 1 dalam method yang dihubungkan ke Enemy.Died oleh OnEnable dan dilepas oleh OnDisable.
  3. Setelah wave selesai melakukan spawn, tunggu selama alive > 0.

Tekan tombol “Main” dan kalahkan wave 1: wave 2 muncul 2 detik kemudian. Lalu tekan tombol “Periksa”.

Coba sendiri

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);
            }
        }
    }
}

Semua pelajaran di Arsitektur Game di Unity

Latihan sendiri: Playground Unity