Menu
CoddyTech

OnEnable i OnDisable

Część sekcji Podstawy skryptów w Unity ścieżki Unity w Coddy. Lekcja 57 z 67.

OnEnable() uruchamia się za każdym razem, gdy skrypt staje się aktywny: gdy jego obiekt pojawia się po raz pierwszy (zaraz po Awake()) oraz ponownie za każdym razem, gdy obiekt zostaje pokazany za pomocą SetActive(true) lub skrypt zostaje ponownie włączony przez enabled = true. OnDisable() uruchamia się za każdym razem, gdy obiekt zostaje ukryty, skrypt zostaje wyłączony lub obiekt zostaje zniszczony.

Portal, który inny skrypt otwiera i zamyka za pomocą SetActive, może informować o swoim stanie:

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

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

Portal rejestruje Portal open po rozpoczęciu sceny. Ukrycie go i ponowne pokazanie powoduje zarejestrowanie kolejno Portal closed i Portal open, a Awake() i Start() nie uruchamiają się po raz drugi. Dlatego kod, który musi się wykonać przy każdym pojawieniu się obiektu, na przykład resetowanie licznika czasu lub zliczanie wizyt, umieszcza się w OnEnable(). Gdy portal jest ukryty, jego Update() się nie uruchamia, dlatego otwieraniem i zamykaniem zajmuje się skrypt przypisany do innego obiektu.

challenge icon

Wyzwanie

Średni

Skrypt Switchable znajduje się na obiekcie Player i na jego osłonie, Bubble, która na początku jest ukryta. W obiekcie Player target wskazuje na Bubble, a klawisz spacji włącza i wyłącza Bubble; ta część jest już napisana.

Spraw, aby każdy obiekt Switchable informował o swoim stanie:

  • za każdym razem, gdy zostanie włączony, zwiększ licznik o 1 i zapisz w logu jego nazwę, on oraz licznik w nawiasach, na przykład Bubble on (2);
  • za każdym razem, gdy zostanie wyłączony, zapisz w logu jego nazwę i off: Bubble off.

Gdy gra się rozpocznie, Player zapisze w logu Player on (1): on również zostaje włączony. Naciśnij Play, kilka razy naciśnij spację, a następnie Check.

Spróbuj swoich sił

using UnityEngine;

public class Switchable : MonoBehaviour
{
    public GameObject target;

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

    // Za każdym razem, gdy ten obiekt zostanie włączony: zlicz to i zapisz w dzienniku "<name> on (<count>)"
    // Za każdym razem, gdy zostanie wyłączony: zapisz w dzienniku "<name> off"
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy skryptów w Unity