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

Unity'de OnGUI() ile Hızlı Arayüz Geliştirme (Legacy UI)

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

Unity'de OnGUI() ile Hızlı Arayüz Geliştirme (Legacy UI)

Unity oyun motorunda arayüz (UI) geliştirme denince akla genellikle UGUI (Unity UI) sistemi gelir. Ancak Unity'nin daha eski ve hala oldukça kullanışlı bir arayüz çizim sistemi daha bulunmaktadır: OnGUI(). Bu fonksiyon, özellikle hızlı prototipleme, hata ayıklama (debugging) arayüzleri ve özel editör araçları geliştirmek için eşsiz bir esneklik sunar. Bu makalede, OnGUI kullanımının temellerini, pratik ipuçlarını ve dikkat edilmesi gereken noktaları detaylıca inceleyeceğiz.

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

OnGUI(), MonoBehaviour'dan türetilmiş her script'te tanımlanabilen özel bir geri çağırım (callback) fonksiyonudur. Oyun çalıştığı sürece veya editörde seçili nesneler için her karede birden fazla kez çağrılır. Adından da anlaşılacağı gibi, Unity'nin eski (legacy) arayüz sisteminin bir parçasıdır. UGUI'nin aksine, OnGUI() ile çizilen öğeler genellikle doğrudan kod üzerinden yönetilir ve Canvas gibi bir Render sistemi gerektirmezler. Bu da onu bazı özel durumlar için ideal kılar:

  • Hata Ayıklama Arayüzleri: Oyun içindeki değişken değerlerini hızlıca görmek veya test amaçlı butonlar eklemek.
  • Editör Araçları: Unity editöründe özel pencereler veya Inspector düzenleyicileri oluşturmak.
  • Hızlı Prototipleme: Karmaşık bir UI sistemi kurmadan önce temel arayüz işlevlerini test etmek.

OnGUI()'nin her karede birden fazla çağrılmasının temel nedeni, farklı 'event' tiplerini (fare tıklamaları, klavye girdileri, çizim olayları vb.) işleyebilmesidir. Bu etkinlikleri Event.current.type ile kontrol edebiliriz.

OnGUI() ile Temel Arayüz Elemanları

OnGUI() içinde kullanabileceğimiz birçok hazır UI elemanı bulunmaktadır. Bunlar genellikle GUI sınıfı altında toplanmıştır. İşte bazı yaygın örnekler:

1. Etiketler (Labels)

Ekrana metin yazdırmak için kullanılır.


void OnGUI()
{
    GUI.Label(new Rect(10, 10, 100, 20), "Merhaba OnGUI!");
}

2. Butonlar (Buttons)

Tıklanabilir butonlar oluşturur ve tıklandığında true döner.


void OnGUI()
{
    if (GUI.Button(new Rect(10, 40, 100, 30), "Tıkla Bana"))
    {
        UnityEngine.Debug.Log("Butona tıklandı!");
    }
}

3. Metin Alanları (Text Fields)

Kullanıcıdan metin girişi almak için kullanılır.


string playerName = "Oyuncu";
void OnGUI()
{
    playerName = GUI.TextField(new Rect(10, 80, 150, 25), playerName);
    GUI.Label(new Rect(10, 110, 200, 20), "Oyuncu Adı: " + playerName);
}

4. Açma/Kapama Düğmeleri (Toggles)

Boole değerlerini kontrol etmek için kullanılır.


bool isSoundOn = true;
void OnGUI()
{
    isSoundOn = GUI.Toggle(new Rect(10, 140, 150, 25), isSoundOn, "Ses Açık");
    if (isSoundOn)
    {
        // Ses açıkken yapılacaklar
    }
}

GUILayout ile Otomatik Düzen

Yukarıdaki örneklerde fark ettiğiniz gibi, elemanların konumlarını (Rect) manuel olarak belirlemek oldukça zahmetli olabilir. İşte bu noktada GUILayout devreye girer. GUILayout, elemanları otomatik olarak dikey veya yatay olarak hizalayarak daha esnek bir OnGUI kullanımı sağlar.


void OnGUI()
{
    GUILayout.BeginArea(new Rect(UnityEngine.Screen.width / 2 - 100, UnityEngine.Screen.height / 2 - 100, 200, 200));
    GUILayout.BeginVertical();

    GUILayout.Label("Ayarlar Menüsü");

    if (GUILayout.Button("Başlat"))
    {
        UnityEngine.Debug.Log("Oyun Başlatıldı!");
    }

    GUILayout.Toggle(true, "Müzik Açık");
    GUILayout.HorizontalSlider(0.5f, 0f, 1f);

    GUILayout.EndVertical();
    GUILayout.EndArea();
}

GUILayout.BeginArea ile belirli bir alanda, GUILayout.BeginVertical ve GUILayout.BeginHorizontal ile de elemanların dikey veya yatay olarak sıralanmasını sağlayabiliriz.

Arayüz Stilini Özelleştirme (GUIStyle ve GUISkin)

Varsayılan OnGUI() elemanları genellikle sade bir görünüme sahiptir. Ancak GUIStyle ve GUISkin kullanarak arayüzünüzü özelleştirebilirsiniz. GUIStyle tek bir elemanın görünümünü (font, renk, arka plan resmi vb.) tanımlarken, GUISkin birden fazla GUIStyle'ı bir araya getiren bir asset'tir.


public GUIStyle customButtonStyle;

void OnGUI()
{
    if (customButtonStyle == null)
    {
        customButtonStyle = new GUIStyle(GUI.skin.button);
        customButtonStyle.fontSize = 20;
        customButtonStyle.normal.textColor = UnityEngine.Color.yellow;
        customButtonStyle.hover.textColor = UnityEngine.Color.green;
    }

    if (GUI.Button(new Rect(10, 170, 150, 40), "Özel Buton", customButtonStyle))
    {
        UnityEngine.Debug.Log("Özel butona tıklandı!");
    }
}

Pratik İpuçları

1. Etkinlik Tiplerini Anlamak (`Event.current.type`)

OnGUI() her çağrıldığında, Event.current.type bize o anki olayın ne olduğunu söyler. Bu, özellikle fare etkileşimleri veya klavye girdilerini daha hassas kontrol etmek istediğimizde çok önemlidir.


void OnGUI()
{
    UnityEngine.Event currentEvent = UnityEngine.Event.current;
    if (currentEvent.type == UnityEngine.EventType.MouseDown && currentEvent.button == 0)
    {
        UnityEngine.Debug.Log("Fare sol tuşuna tıklandı: " + currentEvent.mousePosition);
    }
    else if (currentEvent.type == UnityEngine.EventType.KeyDown && currentEvent.keyCode == UnityEngine.KeyCode.Space)
    {
        UnityEngine.Debug.Log("Boşluk tuşuna basıldı!");
    }
}

2. Editör Araçları Geliştirme

OnGUI(), Unity editöründe özel pencereler veya Inspector düzenleyicileri oluşturmak için harikadır. Bunun için EditorWindow sınıfından türetilen script'ler kullanılır. Bu, oyun geliştirme sürecinizi hızlandıracak güçlü bir OnGUI kullanımı alanıdır.

3. Hata Ayıklama ve Geliştirme Zamanı Arayüzleri

Oyununuzun karmaşık mekaniklerini test ederken, belirli değişkenlerin değerlerini gerçek zamanlı olarak görmek veya bazı fonksiyonları anında tetiklemek için OnGUI()'yi kullanabilirsiniz. Örneğin, karakterinizin hızını, canını veya envanterindeki öğeleri ekranda gösterebilirsiniz.


public float playerHealth = 100f;

void OnGUI()
{
    GUI.Label(new Rect(10, UnityEngine.Screen.height - 30, 150, 20), "Can: " + playerHealth.ToString("F0"));
    if (GUI.Button(new Rect(170, UnityEngine.Screen.height - 30, 80, 20), "Can Ver"))
    {
        playerHealth += 10;
    }
}

Yaygın Hatalar ve Çözümleri

1. Performans Düşüşü

OnGUI() fonksiyonu her karede birden fazla kez çağrıldığı için, içinde yoğun hesaplamalar yapmak veya gereksiz yere new anahtar kelimesiyle yeni nesneler oluşturmak ciddi performans sorunlarına yol açabilir. Çözüm olarak, pahalı işlemleri Update() veya Start() gibi başka fonksiyonlara taşımalı, GUIStyle gibi nesneleri önbelleğe almalısınız.

2. `GUI` ve `GUILayout` Karışımı

GUI elemanları sabit pozisyonlar (Rect) kullanırken, GUILayout elemanları otomatik düzenleme yapar. Bu ikisini aynı anda karıştırmak düzen sorunlarına yol açabilir. Eğer hem sabit konumlu hem de otomatik düzenli elemanlar kullanmanız gerekiyorsa, GUILayout.BeginArea() ile GUILayout elemanlarını ayrı bir alanda tutarak çakışmaları önleyebilirsiniz.

3. `EventType`'ı Göz Ardı Etmek

OnGUI()'nin her karede birden çok kez çağrıldığını anlamamak, butonların birden fazla kez tetiklenmesi gibi beklenmedik davranışlara yol açabilir. Örneğin, bir butonun tıklanma olayını sadece EventType.MouseDown olduğunda işlemek, istenmeyen tekrarlamaları engeller. Çoğu GUI ve GUILayout fonksiyonu, tıklama gibi olayları otomatik olarak doğru EventType ile işler, ancak özel durumlar için Event.current.type kontrolü önemlidir.

Performans ve Optimizasyon Notları

OnGUI kullanımı, modern oyun arayüzleri için önerilen bir yöntem değildir. Özellikle mobil platformlarda performans sorunlarına yol açabilir. Bunun ana nedeni, her karede tekrar tekrar çizim komutlarının CPU üzerinde çalıştırılması ve batarya tüketimini artırmasıdır. Eğer kapsamlı ve dinamik bir oyun içi arayüze ihtiyacınız varsa, UGUI (Unity UI) veya başka bir modern UI sistemi kullanmanız şiddetle tavsiye edilir. OnGUI()'yi yalnızca editör araçları, hata ayıklama arayüzleri veya çok basit, statik ekranlar için kullanmak en doğrusudur. Performansı artırmak için GUIStyle nesnelerini önceden oluşturup önbelleğe alın ve OnGUI() içinde gereksiz bellek tahsisinden (new anahtar kelimesi) kaçının.

Sonuç

OnGUI(), Unity'nin eski bir arayüz sistemi olmasına rağmen, hala özellikle geliştirme ve hata ayıklama süreçlerinde büyük kolaylık sağlayan güçlü bir araçtır. Doğru OnGUI kullanımı ile hızlı prototipler oluşturabilir, editörde verimli özel araçlar geliştirebilir ve oyun içi değerleri kolayca takip edebilirsiniz. Ancak karmaşık ve performans odaklı oyun içi arayüzler için UGUI gibi modern sistemleri tercih etmek daha akıllıca olacaktır. Bu makaledeki bilgilerle OnGUI()'nin potansiyelini keşfederek Unity geliştirme deneyiminizi zenginleştirebilir ve OnGUI kullanımı hakkında derinlemesine bilgi edinebilirsiniz.

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