Menu
CoddyTech

OnEnable e OnDisable

Fa parte della sezione Fondamenti di scripting in Unity del percorso Unity di Coddy. Lezione 57 di 67.

OnEnable() viene eseguito ogni volta che uno script diventa attivo: quando il suo oggetto appare per la prima volta (subito dopo Awake()) e di nuovo ogni volta che l'oggetto viene mostrato con SetActive(true) o lo script viene riattivato con enabled = true. OnDisable() viene eseguito ogni volta che l'oggetto viene nascosto, lo script viene disattivato o l'oggetto viene distrutto.

Un portale che un altro script apre e chiude con SetActive può segnalare il proprio stato:

void OnEnable()
{
    Debug.Log("Portal open");
}

void OnDisable()
{
    Debug.Log("Portal closed");
}

Il portale registra Portal open quando la scena inizia. Nasconderlo e mostrarlo di nuovo registra Portal closed, poi Portal open, mentre Awake() e Start() non vengono eseguiti una seconda volta. Quindi, il codice che deve essere eseguito a ogni apparizione, come azzerare un timer o contare le visite, va inserito in OnEnable(). Quando il portale è nascosto, il suo Update() non viene eseguito, ed è per questo che l'apertura e la chiusura vengono gestite da uno script su un altro oggetto.

challenge icon

Sfida

Medio

Lo script Switchable è sul Player e sul suo scudo, la Bubble, che inizialmente è nascosto. Sul Player, target è la Bubble e la barra spaziatrice attiva e disattiva la Bubble; questa parte è già stata scritta.

Fai in modo che ogni Switchable segnali le proprie attivazioni:

  • ogni volta che viene attivato, aggiungi 1 a un conteggio e registra il suo nome, on e il conteggio tra parentesi, ad esempio Bubble on (2);
  • ogni volta che viene disattivato, registra il suo nome e off: Bubble off.

Quando il gioco inizia, il Player registra Player on (1): anche lui viene attivato. Premi Play, premi la barra spaziatrice alcune volte, poi Check.

Provalo tu

using UnityEngine;

public class Switchable : MonoBehaviour
{
    public GameObject target;

    void Update()
    {
        if (target != null && Input.GetKeyDown(KeyCode.Space))
        {
            target.SetActive(!target.activeSelf);
        }
    }

    // Ogni volta che questo oggetto viene attivato: conta l'attivazione e registra "<name> on (<count>)"
    // Ogni volta che viene disattivato: registra "<name> off"
}
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 Fondamenti di scripting in Unity