Menu
CoddyTech

Iscriviti in OnEnable

Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 11 di 50.

Un listener che viene distrutto non lascia l'evento da solo. L'evento conserva il suo metodo e la successiva chiamata a Invoke lo esegue sul componente distrutto. Il primo uso di transform in quel metodo genera MissingReferenceException e, poiché un'eccezione termina Invoke, vengono saltati anche i listener successivi. Quindi a ogni += deve corrispondere un -=, e la coppia di metodi di Unity per farlo è OnEnable e OnDisable:

public class Guard : MonoBehaviour
{
    public Alarm alarm;

    void OnEnable()
    {
        alarm.OnTriggered += RunTo;
    }

    void OnDisable()
    {
        alarm.OnTriggered -= RunTo;
    }

    void RunTo(Vector3 spot)
    {
        transform.LookAt(spot);
    }
}

Unity chiama OnDisable quando l'oggetto viene disattivato con SetActive(false), quando lo script viene disabilitato e quando l'oggetto viene distrutto, prima di OnDestroy. OnEnable viene eseguito ogni volta che viene riattivato. Con questa coppia, una guardia ascolta esattamente mentre è attiva: una guardia distrutta non fa più parte dell'evento, una guardia disattivata per una scena d'intermezzo ignora l'allarme e, quando viene riattivata, torna ad ascoltare.

Altre due combinazioni non funzionano. Con += in Start e -= in OnDisable, una guardia disattivata e poi riattivata non ascolta più, perché Start viene eseguito una sola volta. Con += in OnEnable e senza -=, ogni riattivazione aggiunge di nuovo RunTo e una chiamata dell'allarme lo esegue due volte. Rimuovere un metodo a cui non si è iscritti non fa nulla, quindi in OnDisable non serve mai verificare prima di usare -=.

challenge icon

Sfida

Facile

La campana del villaggio suona ogni volta che premi Spazio (Bell.cs, già pronto) e il suo evento OnRing avvisa gli abitanti. Un abitante fa un saltello a ogni rintocco e torna a casa dopo ringsToLeave rintocchi: Hop lo distrugge. Ana torna a casa dopo 2 rintocchi. Suona una terza volta e nella Console compare una MissingReferenceException.

Correggi Villager.cs in modo che un abitante ascolti la campana esattamente mentre è attivo:

  • Iscrivi Hop all'evento della campana ogni volta che l'abitante viene attivato e annulla l'iscrizione quando viene disattivato o distrutto. Lascia Hop e Update così come sono.
  • Un abitante disattivato con SetActive(false) non fa saltelli. Quando viene riattivato, fa un saltello per ogni rintocco.

Premi Play, suona la campana quattro volte e osserva la Console, poi premi Check.

Provalo tu

using UnityEngine;

public class Villager : MonoBehaviour
{
    public Bell bell;
    public int ringsToLeave = 3;
    public int hops;

    void Start()
    {
        bell.OnRing += Hop;
    }

    void Update()
    {
        // ricadi a terra dopo un salto
        Vector3 p = transform.position;
        transform.position = new Vector3(p.x, Mathf.MoveTowards(p.y, 0.5f, 4f * Time.deltaTime), p.z);
    }

    void Hop(int ring)
    {
        hops++;
        transform.position += Vector3.up * 0.8f;
        if (hops == ringsToLeave)
        {
            Debug.Log(name + " goes home");
            Destroy(gameObject);
        }
    }
}
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