OnEnable'da Abone Ol
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 13 / 64.
Yok edilen bir dinleyici, olaydan kendi kendine ayrılmaz. Olay hâlâ yöntemini tutar ve sonraki Invoke, yöntemi yok edilmiş bileşen üzerinde çağırır. Bu yöntemdeki ilk transform kullanımı MissingReferenceException hatası verir ve bir özel durum Invoke işlemini sonlandırdığı için ondan sonraki dinleyiciler de atlanır. Bu yüzden her += için bir -= gerekir ve Unity bunun için bir çift yöntem sunar: OnEnable ve 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, 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 ikili sayesinde bir muhafız yalnızca etkin olduğu sürece dinler: yok edilen muhafız olaydan çıkar, bir ara sahne için kapatılan muhafız alarmı duymaz ve tekrar açıldığında yeniden 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 muhafız bir daha asla dinlemez; çünkü Start yalnızca bir kez çalışır. OnEnable içinde += kullanıp -= kullanmazsan her dönüşte RunTo yeniden eklenir ve tek bir alarm onu iki kez çağırır. Abone olmayan bir yöntemi kaldırmak hiçbir şey yapmaz, bu nedenle OnDisable içindeki -= için hiçbir zaman kontrol gerekmez.
Görev
KolayHer bir köylünün zili yalnızca etkin olduğu sırada dinlemesini sağla.
Villager.csiçindebell.OnRing += Hop;satırınıStart()içinden yeni birvoid OnEnable()içine taşı veStart()metodunu sil.bell.OnRing -= Hop;içeren birvoid OnDisable()ekle. “Kontrol et” bunu sınamak için Cleo’yu kapatıp açar.
“Oyna” düğmesine bas ve zili dört kez çal: Ana, zil 2. kez çaldıktan sonra eve gider ve hiçbir hata görünmez. Ardından “Kontrol et” düğmesine 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()
{
// bir sıçramadan sonra tekrar yere in
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);
}
}
}
Unity'de Oyun Mimarisi bölümündeki tüm dersler
1Kalıtım Değil, Bileşenler
Küçük BileşenlerTemel Düşman Script'iSoyut BileşenlerBirlikte Çalışan BileşenlerTekrar: Modüler TaretTekrar: Çift Namlulu Top4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larTekrar: Ganimet TablosuTekrar: Ganimeti At2Unity'de Arayüzler
IDamageableArayüzler ve TryGetComponentGetComponentsÖzet: Etkileşim TuşuÖzet: Erişim Mesafesindeki En Yakın5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriOrtak AyarlarRüzgârı KaydetVeri Olarak DalgalarTekrar: Eşya VeritabanıTekrar: Dükkândan Satın Al8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearestKendi başına pratik yap: Unity playground