Observer Design Pattern

Sosyal medyada paylaşın

Observer Design Pattern’i oyun programlamada çok kullanılan ve neredeyse en popüler tasarım desenlerinden biridir. Bu desenin amacı bir sistemin farklı amaçla çalışan bölümlerinin birbirini engellemeden ve bağımlı hale gelmeden bir nesnenin (öznenin) durumu değiştikçe bağımlı nesnelere (gözlemciler) bildirim gönderen bir yapı sağlama çalışmasıdır. Birden fazla gözlemci olabilir. Oyun programlamada bildirim, achievements, oyuncunun rankı durumu gibi yerlerde kullanılır. Observer Desing Pattern’de bir özne(subject) ve bir veya verden fazla gözlemci(observer) bulunur. Gözlemci özneye abone olarak herhangi bir durumun gerçekleşmesinden sonra kendisinin hangi işlemi yapacağını belirler. Bu abone olma işlemi action, delegate veya eventler ile yapılabilir, şahsen ben event kullanmayı tercih ediyorum.

Kod örneklerine geçelim. UıManager adında gözlemci sınıfım var ve PlayerController sınıfında bulunan onLevelFinished eventine AddListener ile abone oluyorum ve bu event tetiklendiğinde hangi fonksiyonun çalışacağını parantez içerisinde belirtiyorum.

using UnityEngine;
//Gözlemci (observer)
public class UıManager : MonoBehaviour
{
    private void Awake()
    {
        PlayerController.onLevelFinished.AddListener(ChangeText);
    }
    private void ChangeText()
    {
        ////To do
    }
}

PlayerController sınıfım ise özne(subject) sınıfı konumunda. onLevelFinished eventine ev sahipliği yapmakta ve collision durumunda eventi tetiklemek ile görevli.
using UnityEngine;
using UnityEngine.Events;

//özne(subject)
public class PlayerController1 : MonoBehaviour
{
    public static UnityEvent onLevelFinished=new UnityEvent();
   
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.transform.CompareTag("Finish"))
        {
            onLevelFinished?.Invoke();
        }
    }
}

NOT!: Unity’de bir evente ?.Invoke() şeklinde kod yazarsanız, bu kod eventin null olup olmadığını kontrol eder ve null değilse eventi tetikler. Null olan bir evente invoke yapmak, herhangi bir hata veya istenmeyen duruma neden olmaz. Yani, event null ise invoke işlemi basitçe hiçbir şey yapmaz ve herhangi bir hata fırlatmaz.

Observer Design Pattern’i bu şekildeydi, umarım anlatabilmişimdir iyi çalışmalar…