DontDestroyOnLoad
- Oyun Geliştirme kursu
- Orta seviye
- Ders 58/83
- 4 dk
DontDestroyOnLoad ile nesneleri sahne değişiminde korumayı öğrenirsin.
DontDestroyOnLoad nedir?
Varsayılan olarak Single modda yeni bir sahneye geçildiğinde önceki sahnedeki tüm GameObject'ler yok edilir. DontDestroyOnLoad(gameObject); fonksiyonu, çağrıldığı nesneyi bu temizlikten muaf tutarak sonraki sahnelerde yaşamasını (persist) sağlar.
void Awake() {
// Bu nesne sahne geçişlerinde hayatta kalır
DontDestroyOnLoad(gameObject);
}Müzik çalar nesneleri veya oyuncu profil verilerini tutan yöneticiler bu sayede sahne değiştikçe kesintiye uğramaz.
Singleton Deseni ve Kalıcı Yöneticiler
DontDestroyOnLoad kullanılan nesneler eski sahneye geri dönüldüğünde çift kopya (duplicate) oluşturabilir. Bunu engellemek için Singleton tasarım deseni kurularak nesneden yalnızca bir adet bulunması garanti altına alınır.
public static GameManager Instance;
void Awake() {
if (Instance == null) {
Instance = this;
DontDestroyOnLoad(gameObject);
} else {
Destroy(gameObject); // İkinci kopyayı yok et
}
}Böylece oyun verileri tüm sahnelerde merkezi ve hatasız olarak yönetilir.
Uygulama Yönetici ve kalıcılık durumunu yazdır
managerName değişkenine "GameManager", status değişkenine "DontDestroyOnLoad" ata. Ekrana Manager: GameManager | Status: DontDestroyOnLoad yazdır.
Başlangıç kodu
using System;
class Program
{
static void Main()
{
// managerName ve status değerlerini tanımlayıp yazdır
}
}Örnek çözüm
using System;
class Program
{
static void Main()
{
string managerName = "GameManager";
string status = "DontDestroyOnLoad";
Console.WriteLine("Manager: " + managerName + " | Status: " + status);
}
}Beklenen çıktı
Manager: GameManager | Status: DontDestroyOnLoad
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bir GameObject'in sahne geçişi yapıldığında silinmeyip bir sonraki sahnede de varlığını sürdürmesi için hangi fonksiyon çağrılır?
- DestroyImmediate(gameObject);
- SceneManager.KeepAlive(gameObject);
- DontDestroyOnLoad(gameObject); Doğru cevap
- Object.PersistForever(gameObject);
Açıklama: DontDestroyOnLoad(), belirtilen nesneyi sahne geçişlerindeki otomatik bellek temizliğinden koruyan yerleşik Unity metodudur.
2 Nesneyi sahne temizliğinden koru
____(gameObject);
DontDestroyOnLoad(gameObject);
Açıklama: Bir nesneyi sahne geçişlerinde korumak için DontDestroyOnLoad fonksiyonu çağrılır.
3 Kalıcılık kavramları
| Kavram | Anlamı |
|---|---|
DontDestroyOnLoad |
Nesneyi sahne geçişinde koruyan metot |
Singleton |
Tek örnek kalmasını sağlayan desen |
GameManager |
Oyun verisi ve akışını taşıyan yönetici |
Persist |
Nesnenin geçişlerde bellekte kalması |