Menu
CoddyTech

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.

challenge icon

Görev

Kolay

Her bir köylünün zili yalnızca etkin olduğu sırada dinlemesini sağla.

  1. Villager.cs içinde bell.OnRing += Hop; satırını Start() içinden yeni bir void OnEnable() içine taşı ve Start() metodunu sil.
  2. bell.OnRing -= Hop; içeren bir void 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

Kendi başına pratik yap: Unity playground