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.
Sfida
MedioFai in modo che ogni ondata attenda finché l'arena non è libera.
- In
Enemy, aggiungipublic static event Action<Enemy> Died;e chiamaDied?.Invoke(this);subito prima diDestroy(gameObject);. - In
WaveSpawner, tieni il conto dialive: aggiungi 1 per ogni nemico generato e sottrai 1 in un metodo cheOnEnableaggiunge aEnemy.Diede cheOnDisablerimuove. - 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
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRipasso: torretta modulareRipasso: cannone doppio4Dati serializzati
Classi serializzabiliElenchi nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottinoRiepilogo: tira il bottino7Macchine a stati
Gli stati come classiLo stato di allertaUna macchina a statiTransizioniIntelligenza dei nemiciIl cavaliere attaccaRiepilogo: stati delle porte10Progetto: Sopravvissuto nell'arena
L'eroeTipi di nemici2Interfacce in Unity
IDamageableInterfacce e TryGetComponentGetComponentsRiepilogo: tasto InteragisciRiepilogo: il più vicino a portata5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseSalva il ventoOnde come datiRiepilogo: database degli oggettiRiepilogo: comprare dal negozioEsercitati da solo: Playground Unity