Campi UnityEvent
Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 12 di 50.
Il campo On Click () di un pulsante è un campo UnityEvent e anche i tuoi script possono averne uno. Un campo UnityEvent pubblico viene visualizzato nell’Inspector come lo stesso tipo di elenco e lo script lo attiva con Invoke() senza sapere cosa vi è collegato. Questo conto alla rovescia scatta 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 altre righe 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 passato a Invoke, in questo caso i secondi rimanenti. Lo stesso metodo, sotto Static Parameters, riceve invece un numero inserito 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ò aggiungere listener con onTick.AddListener(ShowSeconds). Scegli un UnityEvent quando la reazione varia da un oggetto all’altro e viene configurata nell’Inspector da te o da un designer che non apre mai lo script. Scegli un evento C# quando è il codice ad ascoltare: il compilatore controlla i nomi dei metodi, quindi una rinomina interrompe la compilazione invece di lasciare una riga <Missing> senza che nessuno se ne accorga, e un evento C# non viene mai visualizzato nell’Inspector.
Sfida
FacileUna gara di tre giri intorno all’isola. Le frecce guidano l’auto (Car.cs) e la scena è configurata come farebbe un designer nell’Inspector: l’elenco On Lap (Int32) di FinishLine chiama LapBoard.ShowLaps (Dynamic int) su LapText e Crowd.Cheer su Crowd, mentre l’elenco On Race Over () chiama LapBoard.ShowFinished e Car.Stop. Quegli script sono pronti, ma non c’è nulla a cui collegare le righe finché FinishLine non contiene gli eventi.
Scrivi FinishLine.cs:
- Due campi UnityEvent:
onLap, che passa un int, eonRaceOver, che non passa nulla. - Ogni volta che l’auto (con tag
Player) attraversa la linea, viene completato un giro: richiamaonLapcon il numero di giri completati (1, poi 2, poi 3). Tutto il resto che attraversa la linea non conta. - Quando i giri completati raggiungono
laps(3), richiamaonRaceOver. Dopodiché, attraversare la linea non produce alcun effetto.
Premi Play, guida per tre giri intorno all’isola, poi premi Check.
Provalo tu
using UnityEngine;
public class FinishLine : MonoBehaviour
{
public int laps = 3;
void OnTriggerEnter(Collider other)
{
// l'auto ha attraversato il traguardo: un altro giro completato
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Architettura dei giochi in Unity
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRiepilogo: torretta modulare4Dati serializzati
Classi serializzabiliListe nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottino7Macchine a stati
Gli stati come classiUna macchina a statiTransizioniIntelligenze dei nemiciRiepilogo: stati della porta10Progetto: Sopravvissuto nell’arena
L’eroeTipi di nemici5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseOndate come datiRiepilogo: database degli oggetti