Singleton Design Pattern Nedir?
Unity'de Singleton Design Pattern Kullanımı
Singleton design pattern (tasarım deseni), bir sınıfın sadece bir kez örneklenmesini sağlamak ve bu örneğe global olarak erişim sağlamak için kullanılan yaygın bir tasarım desenidir. Unity gibi oyun motorlarında, genellikle oyun yöneticileri (Game Manager), ses yöneticileri (Audio Manager) veya veri yükleme sistemleri gibi bilesenler için kullanılır. Bu yazıda, Unity'de Singleton design pattern'in nasıl uygulanabileceğini örneklerle inceleyeceğiz.
Singleton Nedir?
Singleton tasarım deseni, temel olarak iki özellik sağlar:
- Bir sınıfın yalnızca tek bir örneği olur.
- Bu örneğe global bir erişim noktasi sunar.
Unity projelerinde, Singleton kullanarak belirli bir sınıfın tekrar tekrar örneklenmesini engelleyebilir ve bu sınıfın özelliklerine ya da metotlarına kolayca erişim sağlayabilirsiniz.
Singleton Tasarım Deseninin Avantajları Global Erişim:
- Singleton: tek bir nesneye global erişim sağlayarak kodunuzu daha okunabilir hale getirir.
- Performans: Aynı nesnenin tekrar tekrar örneklenmesini engelleyerek bellek kullanımını optimize eder.
- Kolay Yönetim: Merkezi bir yönetim sağlar, bu nedenle örneğin ayarlarınızı veya global durumunuzu tek bir noktadan kontrol edebilirsiniz.
Unity'de Singleton Nasıl Uygulanır?
Unity'de Singleton'lar genellikle bir MonoBehaviour sınıfı olarak uygulanır. Bunun nedeni, Singleton'ların sahneye eklendiğinde GameObject'ler üzerinde çalışmasıdır.
Basit Singleton Örneği
using UnityEngine; public class GameManager : MonoBehaviour { public static GameManager Instance { get; private set; } private void Awake() { if (Instance != null && Instance != this) { Destroy(gameObject); return; } Instance = this; DontDestroyOnLoad(gameObject); } public void SomeFunction() { Debug.Log("GameManager Singleton çalışıyor!"); } }
Bu Kodda Neler Oluyor?
- Instance Değişkeni: public static GameManager Instance { get; private set; } ile Singleton'ı global olarak erişilebilir hale getiriyoruz.
- Awake Metodu: Awake metodu, Singleton'ın tek bir örnek olarak kalmasını sağlıyor. Eğer zaten bir örnek varsa, yeni oluşturulan GameObject'i yok ediyoruz.
- DontDestroyOnLoad: Bu metot, nesnenin sahne değişiklikleri sırasında yok edilmemesini sağlar.
Kullanımı
Artık başka bir sınıfta şu şekilde GameManager'ı kullanabilirsiniz:
GameManager.Instance.SomeFunction();
İleri Seviye Singleton Uygulaması
using UnityEngine; public class Singleton: MonoBehaviour where T : MonoBehaviour { private static T _instance; private static readonly object _lock = new object(); public static T Instance { get { lock (_lock) { if (_instance == null) { _instance = (T)FindObjectOfType(typeof(T)); if (_instance == null) { GameObject singletonObject = new GameObject(typeof(T).Name); _instance = singletonObject.AddComponent (); DontDestroyOnLoad(singletonObject); } } return _instance; } } } }
Bu Generic Singleton, farklı sınıflar için tekrar tekrar kod yazma ihtiyacını ortadan kaldırır. Sadece sınıfızı Singleton'dan türetmeniz yeterlidir:
public class AudioManager : Singleton{ public void PlaySound() { Debug.Log("Ses çalıyor!"); } }
Singleton Kullanırken Dikkat Edilmesi Gerekenler
- Test Edilebilirlik: Singleton'lar global erişim sağladığı için test edilmesi zor olabilir. Bu nedenle, bazı durumlarda Dependency Injection gibi alternatifler tercih edilebilir.
- Memory Leak Riski: Singleton'lar sahneler arasında yaşayabildiği için doğru yönetilmezse bellek sızıntılarına neden olabilir.
- Karmaşıklık: Singleton tasarım deseni basit projelerde kullanılabilir, ancak büyük projelerde aşırı kullanımı kod karmaşıklığına yol açabilir.
Yorum Gönder