Menu
CoddyTech

Berlangganan di OnEnable

Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 11 dari 50.

Listener yang dihancurkan tidak keluar dari event dengan sendirinya. Event tetap menyimpan method-nya, dan pemanggilan Invoke berikutnya memanggilnya pada komponen yang telah dihancurkan. Penggunaan pertama transform dalam method tersebut memunculkan MissingReferenceException, dan karena exception mengakhiri Invoke, listener setelahnya juga dilewati. Jadi, setiap += memerlukan -=, dan Unity menggunakan pasangan method OnEnable dan OnDisable untuk itu:

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 object dinonaktifkan dengan SetActive(false), saat script dinonaktifkan, dan saat object dihancurkan, sebelum OnDestroy. OnEnable dijalankan setiap kali object kembali aktif. Dengan pasangan ini, guard mendengarkan tepat selama aktif: guard yang dihancurkan dihapus dari event, guard yang dinonaktifkan selama cutscene mengabaikan alarm, dan setelah diaktifkan kembali, guard mendengarkan lagi.

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

challenge icon

Tantangan

Mudah

Lonceng desa berbunyi setiap kali kamu menekan Space (Bell.cs, sudah siap), dan event-nya OnRing memberi tahu para penduduk desa. Seorang penduduk desa melompat setiap kali lonceng berbunyi dan pulang setelah lonceng berbunyi sebanyak ringsToLeave kali: Hop menghancurkannya. Ana pulang setelah lonceng berbunyi 2 kali. Bunyikan lonceng untuk ketiga kalinya, lalu Console menampilkan MissingReferenceException.

Perbaiki Villager.cs agar penduduk desa mendengarkan lonceng hanya saat aktif:

  • Pasangkan Hop ke event lonceng setiap kali penduduk desa diaktifkan, lalu lepaskan pasangannya saat penduduk desa dinonaktifkan atau dihancurkan. Biarkan Hop dan Update seperti semula.
  • Penduduk desa yang dinonaktifkan dengan SetActive(false) tidak melompat. Setelah diaktifkan kembali, ia melompat sekali setiap lonceng berbunyi.

Tekan Play, bunyikan lonceng empat kali dan amati Console, lalu tekan 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()
    {
        // turun kembali 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);
        }
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Arsitektur Game di Unity