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.
Tantangan
MudahBuat setiap warga desa mendengarkan lonceng hanya saat mereka aktif.
- Di
Villager.cs, pindahkanbell.OnRing += Hop;dariStart()kevoid OnEnable()yang baru, lalu hapusStart(). - Tambahkan
void OnDisable()denganbell.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
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja BersamaRangkuman: Turret ModularRangkuman: Meriam Kembar4Data yang Diserialisasi
Class yang Dapat DiserialisasiList di InspectorEnum di InspectorRangkuman: Tabel LootRangkuman: Acak Loot2Antarmuka di Unity
IDamageableAntarmuka dan TryGetComponentGetComponentsRingkasan: Tombol InteractRingkasan: Terdekat dalam Jangkauan5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaSelamatkan AnginGelombang sebagai DataRekap: database ItemBeli dari Toko8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearest3Event
Event C# di UnityBerlangganan di OnEnableField UnityEventEvent Menggerakkan UIRangkuman: Popup PencapaianRangkuman: Timer Popup6Menyimpan dengan JSON
JsonUtilitySimpan GameMuat dan Nilai DefaultRingkasan: Slot SimpananPilih dan Hapus SlotLatihan sendiri: Playground Unity