OnEnable'da Abone Olma
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 11 / 50.
Yok edilen bir dinleyici, olaydan kendiliğinden ayrılmaz. Olay, metodunu hâlâ tutar ve sonraki Invoke, bu metodu yok edilmiş bileşen üzerinde çağırır. Bu metottaki transform öğesinin ilk kullanımı MissingReferenceException hatası verir ve bir istisna Invoke işlemini sonlandırdığı için ondan sonraki dinleyiciler de atlanır. Bu nedenle her += için bir -= gerekir; Unity'de bunun için kullanılan metot çifti OnEnable ve OnDisable'dır:
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, nesne SetActive(false) ile kapatıldığında, betik devre dışı bırakıldığında ve nesne yok edildiğinde, OnDestroy'dan önce OnDisable'ı çağırır. Nesne her yeniden etkinleştirildiğinde OnEnable çalışır. Bu ikiliyle bir koruma yalnızca etkin olduğu sürece dinler: yok edilen bir koruma olaydan çıkar, ara sahne için kapatılan bir koruma alarmı duymaz ve yeniden etkinleştirildiğinde tekrar dinlemeye başlar.
Diğer iki eşleştirme sorun çıkarır. Start içinde += ve OnDisable içinde -= kullanılırsa, kapatılıp yeniden açılan bir koruma bir daha asla dinlemez; çünkü Start yalnızca bir kez çalışır. OnEnable içinde += kullanıp -= kullanmazsanız, her yeniden etkinleştirmede RunTo bir kez daha eklenir ve tek bir alarm onu iki kez çağırır. Abone olmayan bir metodu kaldırmak hiçbir şey yapmaz; bu nedenle OnDisable içindeki -= için hiçbir zaman kontrol gerekmez.
Görev
KolayKöy çanı, Space tuşuna her bastığında çalar (Bell.cs, hazır) ve OnRing olayı köylülere haber verir. Bir köylü her çan sesinde zıplar ve ringsToLeave kadar kez çaldıktan sonra eve gider: Hop onu yok eder. Ana 2 kez çaldıktan sonra eve gider. Üçüncü kez çalınca Konsol'da bir MissingReferenceException görünür.
Villager.cs dosyasını, köylünün çanı yalnızca etkin olduğu sürece dinlemesini sağlayacak şekilde düzelt:
- Köylü her etkinleştirildiğinde
Hopyöntemini çanın olayına abone et ve köylü devre dışı bırakıldığında veya yok edildiğinde aboneliği kaldır.HopveUpdateyöntemlerini olduğu gibi bırak. SetActive(false)ile devre dışı bırakılan bir köylü zıplamaz. Yeniden etkinleştirildiğinde her çan sesinde bir kez zıplar.
Play'e bas, çanı dört kez çal ve Konsol'u izle, ardından Check'e bas.
Kendin dene
using UnityEngine;
public class Villager : MonoBehaviour
{
public Bell bell;
public int ringsToLeave = 3;
public int hops;
void Start()
{
bell.OnRing += Hop;
}
void Update()
{
// zıpladıktan sonra tekrar yere düş
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);
}
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Unity'de Oyun Mimarisi bölümündeki tüm dersler
1Hiyerarşiler Değil, Bileşenler
Küçük BileşenlerTemel Bir Düşman BetiğiSoyut BileşenlerBirlikte Çalışan BileşenlerÖzet: Modüler Taret4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larÖzet: Ganimet Tablosu7Durum Makineleri
Sınıflar Olarak DurumlarBir Durum MakinesiGeçişlerDüşmanların Yapay ZekâsıTekrar: Kapı Durumları10Proje: Arena Hayatta Kalma
KahramanDüşman Türleri5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriPaylaşılan AyarlarVeri Olarak DalgalarTekrar: Eşya Veritabanı8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearest3Olaylar
Unity'de C# OlaylarıOnEnable'da Abone OlmaUnityEvent AlanlarıOlaylar Arayüzü YönlendirirTekrar: Başarım Açılır Penceresi