Campi UnityEvent
Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 14 di 64.
Il metodo On Click () di un pulsante è un campo UnityEvent, e anche i tuoi script possono averne uno. Un campo UnityEvent pubblico viene mostrato nell’Inspector come un elenco dello stesso tipo, e lo script lo attiva con Invoke() senza sapere cosa è collegato. Questo conto alla rovescia avanza una volta al secondo:
using UnityEngine;
using UnityEngine.Events;
public class Countdown : MonoBehaviour
{
public int seconds = 3;
public UnityEvent<int> onTick;
public UnityEvent onFinished;
void Start()
{
InvokeRepeating("Tick", 1f, 1f);
}
void Tick()
{
seconds--;
onTick.Invoke(seconds);
if (seconds == 0)
{
CancelInvoke("Tick");
onFinished.Invoke();
}
}
}Nell’Inspector, On Finished () accetta righe come quelle di un pulsante: una riga lancia il razzo, un’altra apre il cancello. Un altro livello riutilizza lo stesso Countdown con righe diverse, e nessuno scrive un nuovo script. UnityEvent<int> passa un valore. Nel menu a discesa, un metodo che accetta un int compare sotto Dynamic int, e quella riga riceve il valore fornito a Invoke, in questo caso i secondi rimanenti. Lo stesso metodo, sotto Static Parameters, riceve invece un numero digitato nella riga; si possono collegare anche metodi senza parametri.
Unity crea un campo UnityEvent quando carica lo script, quindi onTick non è mai null e non ha bisogno di ?.; il codice può anche aggiungere listener con onTick.AddListener(ShowSeconds). Scegli un UnityEvent quando la reazione varia da un oggetto all’altro ed è configurata nell’Inspector, da te o da un progettista che non apre mai lo script. Scegli un evento C# quando è il codice ad ascoltare: il compilatore controlla i nomi dei metodi, quindi rinominarne uno interrompe la compilazione invece di lasciare una riga <Missing> senza alcun avviso; inoltre, un evento C# non viene mai mostrato nell’Inspector.
Sfida
FacileAssegna a FinishLine gli eventi a cui sono collegate le righe della scena.
- Aggiungi
using UnityEngine.Events;,public UnityEvent<int> onLap;,public UnityEvent onRaceOver;e un int privato per i giri completati. - In
OnTriggerEnter, quandootherha il tagPlayer, conta il giro e chiamaonLap.Invokecon i giri completati. - Quando raggiungono
laps, chiamaonRaceOver.Invoke(); dopo, attraversare il traguardo non fa nulla.
Premi «Gioca» e guida per tre giri. Poi premi «Verifica».
Provalo tu
using UnityEngine;
public class FinishLine : MonoBehaviour
{
public int laps = 3;
void OnTriggerEnter(Collider other)
{
// l'auto ha tagliato il traguardo: un altro giro completato
}
}
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 bottino2Interfacce 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