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 -=.
Sfida
FacileLa 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
Hopall'evento della campana ogni volta che l'abitante viene attivato e annulla l'iscrizione quando viene disattivato o distrutto. LasciaHopeUpdatecosì 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);
}
}
}
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