Menu
CoddyTech

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.

challenge icon

Görev

Kolay

Kö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 Hop yöntemini çanın olayına abone et ve köylü devre dışı bırakıldığında veya yok edildiğinde aboneliği kaldır. Hop ve Update yö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);
        }
    }
}
quiz iconKendini test et

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