Unity Eğitim
Dersler
Forum Sınav Merkezi Premium 💎
C# Dersleri

Unity'de Debug.Log() ile Hata Ayıklama Sanatı: Temelden İleri Seviyeye

Paylaşan: Unity Eğitim 07 October 2025 7 dakika okuma 94 görüntülenme

Oyun geliştirme sürecinde hatalar kaçınılmazdır. Kodunuz beklediğiniz gibi çalışmadığında veya bir değişkenin değerini merak ettiğinizde, sorunun kaynağını bulmak için etkili bir araca ihtiyacınız olur. Unity'de bu aracın adı Debug.Log()'dur. Bu fonksiyon, geliştiricilerin kodlarının akışını izlemelerine, değişken değerlerini kontrol etmelerine ve potansiyel sorunları tespit etmelerine olanak tanır. Bu makalede, Debug.Log kullanımı'nın temellerinden ileri seviye ipuçlarına, yaygın hatalardan performans optimizasyonlarına kadar her şeyi detaylıca inceleyeceğiz.

Debug.Log() Nedir ve Neden Önemlidir?

Debug.Log(), Unity'nin Debug sınıfına ait bir metottur ve genellikle bir mesajı Unity'nin Console penceresine yazdırmak için kullanılır. Bu mesajlar, kodunuz çalışırken ne olduğunu anlamanıza yardımcı olur. Örneğin, bir fonksiyonun çağrılıp çağrılmadığını, bir koşulun sağlanıp sağlanmadığını veya bir değişkenin belirli bir anda hangi değeri aldığını görmek için Debug.Log() kullanabilirsiniz. Hata ayıklama sürecinin bel kemiğidir ve doğru Debug.Log kullanımı, geliştirme süresini önemli ölçüde kısaltabilir.

Temel Debug.Log() Kullanımı

Debug.Log()'un en basit kullanımı, konsola bir metin mesajı yazdırmaktır:

void Start()
{
    Debug.Log("Oyun başladı!");
}

Bu kod, oyun başladığında "Oyun başladı!" mesajını konsola yazdıracaktır.

Değişkenleri ve Nesneleri Log'lama

Sadece sabit metinler değil, değişkenlerin değerlerini ve hatta Unity objelerini de log'layabilirsiniz:

public int oyuncuCan = 100;
public GameObject hedefObje;

void Update()
{
    Debug.Log("Oyuncu Canı: " + oyuncuCan);
    Debug.Log("Hedef Obje: " + hedefObje);
}

Yukarıdaki örnekte, oyuncuCan değişkeninin anlık değeri ve hedefObje'nin adı (veya bir referans yoksa "null") konsola yazdırılır. Bir GameObject'i doğrudan log'ladığınızda, Unity konsolda o objeye tıklayarak Hierarchy penceresinde hızlıca seçmenizi sağlayan bir bağlantı oluşturur. Bu, Debug.Log kullanımı'nı çok daha pratik hale getirir.

Farklı Log Tipleri: Warning ve Error

Debug.Log() varsayılan olarak bilgilendirici mesajlar gösterirken, Unity ayrıca uyarı ve hata mesajları için özel fonksiyonlar sunar:

  • Debug.LogWarning("Bu bir uyarı mesajıdır.");: Sarı renkte bir mesaj gösterir ve potansiyel bir sorunu işaret eder. Oyunun çalışmasını durdurmaz.
  • Debug.LogError("Bu bir hata mesajıdır!");: Kırmızı renkte bir mesaj gösterir ve ciddi bir sorunu işaret eder. Genellikle bir istisna (exception) veya uygulamanın beklenmedik bir şekilde durmasına neden olabilecek durumlar için kullanılır.

Bu ayrım, konsolunuzda farklı önem derecesindeki mesajları kolayca filtrelemenizi ve önceliklendirmenizi sağlar.

Bağlam (Context) Parametresi

Debug.Log() fonksiyonunun bir diğer faydalı özelliği, log mesajına bir bağlam objesi ekleyebilmenizdir:

void OnTriggerEnter(Collider other)
{
    Debug.Log("Çarpışma algılandı! Çarpan obje: " + other.name, this);
}

Bu örnekte, log mesajına ek olarak this (yani bu scriptin kendisi) bağlam olarak verilmiştir. Konsoldaki log mesajına tıkladığınızda, sadece log'un yapıldığı satıra gitmekle kalmaz, aynı zamanda Unity Inspector'da bu scriptin bulunduğu GameObject'i de vurgular. Bu, karmaşık sahnelerde log'un hangi objeden geldiğini hızlıca anlamak için harikadır.

İleri Seviye Debug.Log Kullanımı İpuçları

1. Renkli Log Mesajları ile Görselleştirme

Konsolunuzu daha okunur hale getirmek için log mesajlarınıza renk katabilirsiniz. HTML etiketlerini kullanarak metni biçimlendirebilirsiniz:

void DurumKontrol()
{
    bool herSeyYolunda = false;
    if (herSeyYolunda)
    {
        Debug.Log("Her şey yolunda!");
    }
    else
    {
        Debug.Log("Hata: Bir sorun oluştu!");
    }
}

Bu, kritik uyarıları veya önemli bilgileri diğer log'lardan ayırmak için harika bir yoldur.

2. Log Formatlama ve String Interpolation

Birden fazla değişkeni veya karmaşık metinleri log'larken, string birleştirme yerine Debug.LogFormat() veya C# 6.0 ve üzeri ile string interpolation kullanmak daha temiz bir kod sağlar:

// Debug.LogFormat kullanımı
Debug.LogFormat("Oyuncu {0} hasar aldı. Kalan can: {1}", "Kahraman", 25);

// String Interpolation kullanımı (önerilir)
string oyuncuAdi = "Kahraman";
int kalanCan = 25;
Debug.Log($"Oyuncu {oyuncuAdi} hasar aldı. Kalan can: {kalanCan}");

Debug.LogFormat(), format string'leri ve argümanları kullanarak daha düzenli loglar oluşturur. String interpolation ise daha modern ve okunması kolay bir yaklaşımdır.

3. Koşullu Loglama ve Log'ları Kapatma

Üretim aşamasında (production build) tüm Debug.Log() çağrılarının çalışmasını istemezsiniz, çünkü performansı etkileyebilirler. Bunun için çeşitli yöntemler vardır:

  • #if UNITY_EDITOR Direktifi: Bu direktif, kod bloğunun sadece Unity Editor'da derlenmesini sağlar. Build aldığınızda bu kodlar derlenmez.
  • #if UNITY_EDITOR
    Debug.Log("Bu mesaj sadece editörde görünür.");
    #endif
    
  • Debug.isDebugBuild: Bu, mevcut build'in bir geliştirme build'i olup olmadığını kontrol eden bir boolean değeridir.
  • if (Debug.isDebugBuild)
    {
        Debug.Log("Bu mesaj sadece development build'lerde görünür.");
    }
    
  • Debug.unityLogger.logEnabled: Tüm Debug.Log çağrılarını çalışma zamanında (runtime) global olarak etkinleştirmek veya devre dışı bırakmak için kullanılabilir.
  • // Tüm logları kapat
    Debug.unityLogger.logEnabled = false;
    
    // Tüm logları aç
    Debug.unityLogger.logEnabled = true;
    

Bu yöntemler, gereksiz logların üretim build'lerine sızmasını engelleyerek performansı korur ve Debug.Log kullanımı'nı daha akıllı hale getirir.

Yaygın Hatalar ve Çözümleri

  • Gereksiz Yere Çok Fazla Log Kullanımı: Özellikle Update() fonksiyonu içinde sürekli log atmak konsolu doldurur ve performansı düşürür. Sadece gerektiğinde veya belirli koşullar altında log atın.
    // Kötü:
    void Update() { Debug.Log("Sürekli log"); } 
    
    // İyi:
    float timer = 0f;
    void Update()
    {
        timer += Time.deltaTime;
        if (timer >= 1f)
        {
            Debug.Log("Her saniye log");
            timer = 0f;
        }
    }
    
  • Null Referans Kontrolü Yapmadan Loglama: Logladığınız bir obje null ise, bir NullReferenceException hatası alabilirsiniz. Loglamadan önce kontrol edin.
    // Kötü:
    public GameObject hedef;
    void Start() { Debug.Log(hedef.name); } // Hedef atanmadıysa hata verir.
    
    // İyi:
    public GameObject hedef;
    void Start()
    {
        if (hedef != null)
        {
            Debug.Log(hedef.name);
        }
        else
        {
            Debug.LogWarning("Hedef objesi atanmamış!");
        }
    }
    
  • Geçici Logları Unutmak: Hata ayıklama sırasında eklediğiniz geçici logları silmeyi veya kapatmayı unutmak, hem performansı etkiler hem de konsolu gereksiz bilgilerle doldurur. İşiniz bittiğinde bu logları temizleyin veya yukarıdaki koşullu loglama yöntemlerini kullanın.

Performans ve Optimizasyon Notları

Debug.Log() çağrıları, özellikle sıkça çağrıldıklarında (örneğin Update() içinde her karede), performansı olumsuz etkileyebilir. Mesaj oluşturma (string birleştirme) ve konsola yazma işlemleri CPU ve bellek kullanımı gerektirir. Bu nedenle, üretim build'lerinde bu logların tamamen kaldırılması veya en aza indirilmesi önemlidir.

  • Preprocessor Direktifleri: Daha önce bahsedilen #if UNITY_EDITOR en güvenli yoldur, çünkü kod build'e dahil edilmez.
  • [Conditional("UNITY_EDITOR")] Attribute'u: Kendi özel log fonksiyonlarınızı yazarken kullanışlıdır. Bu attribute ile işaretlenmiş bir metot, belirtilen sembol tanımlı değilse derleyici tarafından çağrılmayacaktır.
  • using System.Diagnostics;
    
    public static class CustomLogger
    {
        [Conditional("UNITY_EDITOR")]
        public static void LogEditorOnly(string message)
        {
            Debug.Log($"[EDITOR] {message}");
        }
    }
    
    // Kullanımı:
    CustomLogger.LogEditorOnly("Bu sadece editörde görünür.");
    

    Bu yöntem, Debug.Log kullanımı'nızı daha organize ve performansa duyarlı hale getirir.

Sonuç

Debug.Log(), Unity geliştiricileri için vazgeçilmez bir araçtır. Doğru ve bilinçli Debug.Log kullanımı, hata ayıklama sürecini hızlandırır, kodunuzun davranışını anlamanıza yardımcı olur ve geliştirme verimliliğinizi artırır. Bu makaledeki ipuçlarını ve en iyi uygulamaları takip ederek, Unity projelerinizde daha etkili bir şekilde hata ayıklayabilir ve daha sağlam oyunlar geliştirebilirsiniz.

🧠 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!