Menu
CoddyTech

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.

challenge icon

Sfida

Facile

Una 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, e onRaceOver, che non passa nulla.
  • Ogni volta che l’auto (con tag Player) attraversa la linea, viene completato un giro: richiama onLap con 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), richiama onRaceOver. 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
    }
}
quiz iconMettiti alla prova

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