Menu
CoddyTech

Berlangganan di OnEnable

Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 13 dari 64.

Pendengar yang dihancurkan tidak keluar dari event dengan sendirinya. Event tetap menyimpan method-nya, dan pemanggilan Invoke berikutnya memanggilnya pada komponen yang sudah dihancurkan. Penggunaan pertama transform dalam method itu memunculkan MissingReferenceException, dan karena exception mengakhiri Invoke, pendengar setelahnya juga dilewati. Jadi, setiap += perlu memiliki pasangan -=, dan pasangan method Unity untuk itu adalah OnEnable dan 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 memanggil OnDisable saat objek dinonaktifkan dengan SetActive(false), saat script dinonaktifkan, dan saat objek dihancurkan, sebelum OnDestroy. OnEnable berjalan setiap kali objek diaktifkan kembali. Dengan pasangan ini, penjaga mendengarkan tepat selama ia aktif: penjaga yang dihancurkan dihapus dari event, penjaga yang dinonaktifkan untuk adegan sinematik mengabaikan alarm, dan setelah diaktifkan kembali, ia mendengarkan lagi.

Dua pasangan lainnya tidak berfungsi dengan baik. Dengan += di Start dan -= di OnDisable, penjaga yang dinonaktifkan lalu diaktifkan kembali tidak pernah mendengarkan lagi, karena Start hanya berjalan sekali. Dengan += di OnEnable tanpa -=, setiap kali diaktifkan kembali, RunTo ditambahkan lagi, dan satu alarm memanggilnya dua kali. Menghapus method yang tidak berlangganan tidak melakukan apa pun, jadi -= di OnDisable tidak perlu diperiksa.

challenge icon

Tantangan

Mudah

Buat setiap warga desa mendengarkan lonceng hanya saat mereka aktif.

  1. Di Villager.cs, pindahkan bell.OnRing += Hop; dari Start() ke void OnEnable() yang baru, lalu hapus Start().
  2. Tambahkan void OnDisable() dengan bell.OnRing -= Hop;. Tombol “Periksa” menonaktifkan dan mengaktifkan Cleo untuk menguji ini.

Tekan tombol “Main” dan bunyikan lonceng empat kali: Ana pulang setelah bunyi kedua, dan tidak ada error yang muncul. Lalu tekan tombol “Periksa”.

Coba sendiri

using UnityEngine;

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

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

    void Update()
    {
        // kembali turun ke tanah setelah melompat
        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);
        }
    }
}

Semua pelajaran di Arsitektur Game di Unity

Latihan sendiri: Playground Unity