Menu
CoddyTech

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.

challenge icon

Sfida

Facile

Assegna a FinishLine gli eventi a cui sono collegate le righe della scena.

  1. Aggiungi using UnityEngine.Events;, public UnityEvent<int> onLap;, public UnityEvent onRaceOver; e un int privato per i giri completati.
  2. In OnTriggerEnter, quando other ha il tag Player, conta il giro e chiama onLap.Invoke con i giri completati.
  3. Quando raggiungono laps, chiama onRaceOver.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

Esercitati da solo: Playground Unity