Unity Eğitim
Dersler
Forum Sınav Merkezi Premium 💎
Oyun Geliştirme

Unity Sahne Geçişlerinde Nesneleri Korumak: DontDestroyOnLoad() Kullanımı

Paylaşan: Unity Eğitim 15 November 2025 7 dakika okuma 25 görüntülenme

Unity oyun geliştirirken, sahneler arası geçişler sıkça karşılaşılan bir durumdur. Bir sahneden diğerine geçtiğinizde, varsayılan olarak önceki sahnedeki tüm GameObject'ler ve üzerlerindeki bileşenler (component'ler) yok edilir. Ancak bazı durumlarda, belirli nesnelerin sahne geçişlerinden etkilenmeyip oyun boyunca varlığını sürdürmesini isteriz. İşte tam bu noktada Unity'nin sunduğu DontDestroyOnLoad() metodu devreye girer. Bu makalede, Unity DontDestroyOnLoad metodunun ne olduğunu, nasıl kullanıldığını, yaygın kullanım senaryolarını, pratik ipuçlarını ve kaçınılması gereken hataları detaylıca inceleyeceğiz.

DontDestroyOnLoad() Nedir ve Neden Kullanılır?

DontDestroyOnLoad(), Unity'de bir GameObject'in mevcut sahneden ayrılırken yok edilmesini engelleyen bir fonksiyondur. Bu fonksiyon, genellikle bir MonoBehaviour'ın Awake() veya Start() metotlarında çağrılır ve parametre olarak korunmak istenen GameObject'i alır. Bir nesneye DontDestroyOnLoad() uygulandığında, o nesne özel bir 'DontDestroyOnLoad' sahnesine taşınır ve yeni sahne yüklendiğinde yok edilmez.

Bu işlevsellik, özellikle oyunun genel ayarlarını, oyuncu verilerini, müzik veya ses efektlerini yöneten nesneler için hayati öneme sahiptir. Örneğin, oyununuzun arka plan müziği her sahne geçişinde baştan başlamamalı veya oyuncunuzun puanı ve canı her sahne değişiminde sıfırlanmamalıdır. Bu gibi durumlarda, ilgili GameObject'leri Unity DontDestroyOnLoad ile koruyarak tutarlı bir oyun deneyimi sunabiliriz.

Temel Kullanım Şekli

Bir GameObject'i sahne geçişlerinde korumak için, genellikle ilgili script'in Awake() veya Start() metodunda aşağıdaki gibi kullanılır:

using UnityEngine;

public class PersistentObject : MonoBehaviour
{
    void Awake()
    {
        DontDestroyOnLoad(this.gameObject);
    }
}

Yukarıdaki kod bloğu, bu script'in eklendiği GameObject'i 'DontDestroyOnLoad' sahnesine taşıyarak sahne geçişlerinde yok edilmesini engeller.

Yaygın Kullanım Senaryoları

DontDestroyOnLoad() metodunun en yaygın kullanıldığı senaryolar şunlardır:

1. Oyun Yöneticileri (Game Managers)

Oyunun genel durumunu, puanlamayı, seviye ilerlemesini, envanteri veya kaydetme/yükleme işlemlerini yöneten tekil (singleton) yöneticiler, sahne geçişlerinde varlıklarını sürdürmelidir. Bu sayede, oyunun her yerinden bu yöneticilere erişim sağlanabilir ve veriler kaybolmaz.

2. Kalıcı Ses ve Müzik Oynatıcıları

Arka plan müziği veya sürekli çalması gereken ses efektleri (örneğin, yağmur sesi), her sahne yüklendiğinde yeniden başlatılmamalıdır. Bir AudioSource içeren GameObject'i koruyarak, müzik kesintisiz devam edebilir.

3. Oyuncu Verileri ve İlerleme

Oyuncunun canı, skoru, envanteri, açtığı yetenekler gibi oyun boyunca korunması gereken veriler, genellikle bir yönetici nesnesi aracılığıyla Unity DontDestroyOnLoad kullanılarak saklanır.

4. Ayarlar Yöneticileri

Oyunun genel ayarları (ses düzeyi, grafik kalitesi, dil seçimi vb.) genellikle bir kez ayarlanır ve oyun boyunca geçerli kalır. Bu ayarları tutan bir yönetici nesnesi de bu yöntemle korunabilir.

Pratik İpuçları

İpucu 1: Singleton Deseni ile Yöneticileri Yönetmek

DontDestroyOnLoad() kullanımıyla birlikte en sık uygulanan desenlerden biri Singleton desenidir. Bu desen, belirli bir sınıfın yalnızca tek bir örneğinin olmasını sağlar ve bu örneğe global erişim imkanı sunar. Böylece, oyun yöneticisi gibi kritik nesnelerin tekrar tekrar oluşturulması engellenir.

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance { get; private set; }

    void Awake()
    {
        if (Instance != null && Instance != this)
        {
            Destroy(this.gameObject); // Zaten bir örnek var, bu nesneyi yok et
            return;
        }

        Instance = this;
        DontDestroyOnLoad(this.gameObject);

        // GameManager'a özgü başlangıç işlemleri
        Debug.Log("GameManager başlatıldı ve korunuyor.");
    }

    // Diğer GameManager metotları buraya gelir
    public void SaveGame() { /* Kaydetme mantığı */ }
    public void LoadGame() { /* Yükleme mantığı */ }
}

Bu yapı sayesinde, oyunun herhangi bir yerinden GameManager.Instance.SaveGame() gibi çağrılarla tekil yöneticiye güvenli bir şekilde erişilebilir.

İpucu 2: Tekrar Eden Nesneleri Engellemek

Bir sahneyi tekrar yüklediğinizde veya birden fazla sahneye aynı GameObject'i yerleştirdiğinizde, DontDestroyOnLoad() kullanılmış bir nesnenin birden fazla kopyası oluşabilir. Yukarıdaki Singleton örneğinde gösterildiği gibi, Awake() metodunda mevcut bir örneğin olup olmadığını kontrol etmek ve varsa yeni nesneyi yok etmek bu problemi çözer.

İpucu 3: Nesneleri Manuel Olarak Yok Etmek

Bir nesneyi DontDestroyOnLoad() ile korudunuz ancak artık ona ihtiyacınız kalmadıysa (örneğin, oyun bittiğinde veya ana menüye dönüldüğünde), bu nesneyi manuel olarak yok etmeniz gerekir. Aksi takdirde, gereksiz yere bellekte yer kaplamaya devam eder. Bu işlemi Destroy(gameObject) çağrısı ile yapabilirsiniz.

using UnityEngine;

public class PersistentMusicPlayer : MonoBehaviour
{
    void Awake()
    {
        // Singleton kontrolü...
        DontDestroyOnLoad(this.gameObject);
    }

    public void StopAndDestroy() // Örneğin, oyun bittiğinde çağrılabilir
    {
        AudioSource audioSource = GetComponent<AudioSource>();
        if (audioSource != null) audioSource.Stop();
        Destroy(this.gameObject);
        Debug.Log("Müzik oynatıcı durduruldu ve yok edildi.");
    }
}

Yaygın Hatalar ve Çözümleri

1. Alt Objeleri Korumaya Çalışmak

DontDestroyOnLoad() yalnızca hiyerarşideki kök (root) GameObject'ler üzerinde etkilidir. Eğer bir alt nesneyi korumaya çalışırsanız, bu işlem başarısız olur ve Unity bir uyarı mesajı verir. Çözüm, alt nesneyi ayrı bir kök GameObject haline getirmek veya tüm hiyerarşiyi tek bir kök nesne altında korumaktır.

2. Mevcut Örneği Kontrol Etmemek (Duplicate Problemi)

En yaygın hatalardan biri, bir yönetici nesnesini DontDestroyOnLoad() ile korurken, sahne yüklendiğinde bu nesnenin zaten var olup olmadığını kontrol etmemektir. Bu durum, oyununuzda birden fazla aynı yönetici nesnesinin oluşmasına ve beklenmedik davranışlara yol açar. Singleton deseni ve Awake() içindeki kontrol ile bu sorun kolayca çözülür.

3. Gereksiz Yere Kullanmak

Her nesneyi DontDestroyOnLoad() ile korumak, performansı olumsuz etkileyebilir ve bellek sızıntılarına yol açabilir. Sadece gerçekten oyun boyunca varlığını sürdürmesi gereken nesneler için bu metodu kullanın. Geçici veriler veya sahneye özgü nesneler için bu yöntem uygun değildir.

4. 'DontDestroyOnLoad' Sahnesini Yanlış Anlamak

Bir nesne DontDestroyOnLoad() ile korunduğunda, Unity Editor'da hiyerarşi penceresinde özel bir 'DontDestroyOnLoad' sahnesine taşınır. Bu sahne, diğer normal sahneler gibi görünmeyebilir ancak nesneleriniz oradadır. Bu durumu bilmek, hata ayıklama sırasında faydalı olabilir.

Performans ve Optimizasyon Notları

DontDestroyOnLoad() kullanırken performans ve bellek yönetimi önemlidir:

  • Bellek Tüketimi: Korunan her GameObject ve bileşenleri, oyunun tüm yaşam döngüsü boyunca bellekte kalır. Bu nedenle, sadece kritik ve küçük boyutlu nesneleri korumaya özen gösterin. Büyük dokulara veya modellere sahip nesneleri gereksiz yere korumak bellek kullanımını artırır.
  • Gereksiz Hesaplamalar: Korunan nesnelerdeki Update() veya FixedUpdate() gibi sürekli çalışan metotlar, her zaman etkin kalacağı için performans maliyeti oluşturabilir. Yalnızca ihtiyaç duyulduğunda etkinleştirip devre dışı bırakarak optimizasyon sağlayabilirsiniz.
  • Temizleme: Oyun bittiğinde veya artık ihtiyaç duyulmadığında, DontDestroyOnLoad() ile korunan nesneleri manuel olarak Destroy() etmek, bellek sızıntılarını önler ve kaynakları serbest bırakır.

Sonuç

Unity DontDestroyOnLoad metodu, Unity'de sahne geçişlerinde belirli GameObject'lerin kalıcı olmasını sağlamak için güçlü ve vazgeçilmez bir araçtır. Oyun yöneticileri, kalıcı sesler ve oyuncu verileri gibi temel bileşenlerin sorunsuz çalışmasını temin eder. Ancak, bu metodun doğru ve dikkatli kullanılması, özellikle Singleton deseni ile birlikte, oyununuzun performansını ve kararlılığını doğrudan etkiler. Yaygın hatalardan kaçınarak ve en iyi pratikleri uygulayarak, oyunlarınızda daha sağlam ve verimli bir yapı kurabilirsiniz.

🧠 Ders Sonu Değerlendirme Testi

Dersi tamamladıktan sonra bilgilerinizi test edin ve ekstra puanlar kazanın.

🔥 +50 XP Ödül
🔒

Sınava Katılmak İçin Giriş Yapın

Bu ders sonu testini çözebilmek, bilginizi test edip **+50 XP** kazanmak ve **Sınav Şampiyonu** rozetinin kilidini açmak için üye girişi yapmalısınız.

Yorumlar (0)

Yorum yazabilmek ve derslere katkıda bulunabilmek için giriş yapmalısınız.

İlk yorumu siz yapın!