Menu
CoddyTech

Svuota l'arena

Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 55 di 64.

Un evento contrassegnato come static appartiene alla classe, non a un singolo oggetto. Esiste un solo Enemy.Died per tutti i nemici che ci saranno mai, quindi lo spawner può iscriversi con Enemy.Died += OnEnemyDied; prima che esista qualsiasi nemico, e ogni nemico lo attiva passando sé stesso come argomento. La stessa idea in C# semplice:

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;   // non serve ancora alcun Coin
    }

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

Si accede a un evento di istanza tramite un oggetto, come hero.Died; a uno statico tramite il nome della classe, come Coin.Picked. Un evento statico sopravvive a tutti gli oggetti, quindi annulla l'iscrizione in OnDisable, altrimenti uno spawner distrutto rimane nella sua lista.

challenge icon

Sfida

Medio

Fai in modo che ogni ondata attenda finché l'arena non è libera.

  1. In Enemy, aggiungi public static event Action<Enemy> Died; e chiama Died?.Invoke(this); subito prima di Destroy(gameObject);.
  2. In WaveSpawner, tieni il conto di alive: aggiungi 1 per ogni nemico generato e sottrai 1 in un metodo che OnEnable aggiunge a Enemy.Died e che OnDisable rimuove.
  3. Dopo aver generato un'ondata, attendi mentre alive > 0.

Premi «Gioca» e sconfiggi l'ondata 1: l'ondata 2 arriva 2 secondi dopo. Poi premi «Verifica».

Provalo tu

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

Tutte le lezioni di Architettura dei giochi in Unity

Esercitati da solo: Playground Unity