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

Unity EnumPopup: Editörde Dinamik Enum Seçimleri Nasıl Yapılır?

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

Unity oyun geliştirme sürecinde, bazen editörde özel arayüz elementlerine ihtiyaç duyarız. Özellikle, belirli durumları veya seçenekleri temsil eden enum (numaralandırma) tiplerini kullanıcı dostu bir şekilde seçtirmek istediğimizde, EditorGUILayout.EnumPopup() metodu devreye girer. Bu makalede, Unity EnumPopup kullanımını en temelden gelişmiş seviyelere kadar inceleyecek, pratik ipuçları sunacak ve yaygın hatalara değineceğiz.

Giriş: Unity EnumPopup Neden Önemli?

enum'lar, kodunuzda okunabilirliği ve bakımı artıran güçlü araçlardır. Örneğin, bir karakterin durumlarını (Idle, Running, Jumping) veya bir öğenin nadirliğini (Common, Rare, Legendary) temsil etmek için kullanılabilirler. Ancak, bu enum değerlerini bir MonoBehaviour bileşeninde doğrudan göstermeye çalıştığınızda, Unity inspector'ı genellikle bunları basit bir açılır menü (dropdown) olarak sunar. Bu temel işlevsellik çoğu zaman yeterli olsa da, özel editörler geliştirirken daha fazla kontrol ve özelleştirme isteyebilirsiniz. İşte tam da bu noktada EditorGUILayout.EnumPopup() fonksiyonu, özel inspector'larınızda enum değerlerini dinamik olarak seçmek için mükemmel bir çözüm sunar.

Bu metot, geliştiricilere enum değerlerini düzenli ve anlaşılır bir açılır menü şeklinde sunma imkanı tanır. Böylece, tasarımcılar ve diğer ekip üyeleri, kodun derinliklerine inmeden kolayca ayarları yapılandırabilirler. Unity EnumPopup, özel editörlerinizin kullanıcı deneyimini önemli ölçüde iyileştirir.

Temel Kullanım: EditorGUILayout.EnumPopup()

EditorGUILayout.EnumPopup(), Unity'nin EditorGUILayout sınıfının bir parçasıdır ve yalnızca editör betiklerinde (Editor veya EditorWindow sınıfları içinde) kullanılabilir. Temel olarak, bir etiket ve mevcut enum değerini alır ve kullanıcının seçtiği yeni enum değerini döndürür.

Basit Bir Enum Örneği

Öncelikle, üzerinde çalışacağımız basit bir enum tanımlayalım:


public enum KarakterDurumu
{
    Beklemede,
    Kosuyor,
    Zipliyor,
    Saldiriyor
}

EditorGUILayout.EnumPopup() ile Kullanım

Şimdi bu enum'u bir MonoBehaviour sınıfında kullanalım ve ardından ona özel bir Editor betiği yazalım:


// KarakterKontrolcu.cs
using UnityEngine;

public class KarakterKontrolcu : MonoBehaviour
{
    public KarakterDurumu mevcutDurum;
    public float hiz;
    public string karakterAdi;
}

Ve şimdi de özel editor betiğimiz:


// KarakterKontrolcuEditor.cs
using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(KarakterKontrolcu))]
public class KarakterKontrolcuEditor : Editor
{
    public override void OnInspectorGUI()
    {
        // Hedef objemizi alıyoruz
        KarakterKontrolcu karakter = (KarakrolKontrolcu)target;

        // EnumPopup ile KarakterDurumu'nu gösteriyoruz
        karakter.mevcutDurum = (KarakterDurumu)EditorGUILayout.EnumPopup("Mevcut Durum", karakter.mevcutDurum);

        // Diğer alanları da gösterelim (örneğin varsayılan inspector gibi)
        karakter.hiz = EditorGUILayout.FloatField("Hız", karakter.hiz);
        karakter.karakterAdi = EditorGUILayout.TextField("Karakter Adı", karakter.karakterAdi);

        // Inspector'da bir değişiklik yapıldıysa kaydet
        if (GUI.changed)
        {
            EditorUtility.SetDirty(karakter);
        }
    }
}

Yukarıdaki örnekte, EditorGUILayout.EnumPopup("Mevcut Durum", karakter.mevcutDurum) satırı, inspector'da "Mevcut Durum" etiketli bir açılır menü oluşturur. Mevcut değeri karakter.mevcutDurum'dan alır ve kullanıcının yaptığı seçimi yine bu değişkene atar. Gördüğünüz gibi, Unity EnumPopup kullanımı oldukça basittir.

Gelişmiş Kullanım ve İpuçları

EditorGUILayout.EnumPopup()'ı daha verimli ve güçlü kullanmak için bazı gelişmiş teknikler ve ipuçları mevcuttur.

1. İpucu: SerializedProperty ile Güvenli Yönetim

Doğrudan bir field'a atama yapmak yerine SerializedProperty kullanmak, Unity'nin geri alma/yeniden yapma (Undo/Redo) sistemini otomatik olarak entegre etmenizi sağlar ve daha güvenli bir veri yönetimi sunar. Ayrıca, prefab override'ları gibi gelişmiş özellikleri de destekler.


// KarakterKontrolcuEditor.cs (SerializedProperty ile)
using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(KarakterKontrolcu))]
public class KarakterKontrolcuEditor : Editor
{
    SerializedProperty mevcutDurumProp;
    SerializedProperty hizProp;
    SerializedProperty karakterAdiProp;

    void OnEnable()
    {
        mevcutDurumProp = serializedObject.FindProperty("mevcutDurum");
        hizProp = serializedObject.FindProperty("hiz");
        karakterAdiProp = serializedObject.FindProperty("karakterAdi");
    }

    public override void OnInspectorGUI()
    {
        serializedObject.Update(); // Değişiklikleri güncelleyin

        // EnumPopup ile KarakterDurumu'nu gösteriyoruz
        mevcutDurumProp.enumValueIndex = (int)(KarakterDurumu)EditorGUILayout.EnumPopup(
            new GUIContent("Mevcut Durum", "Karakterin anlık durumunu belirler."), // İpucu 2'ye de bakın
            (KarakterDurumu)mevcutDurumProp.enumValueIndex
        );

        EditorGUILayout.PropertyField(hizProp);
        EditorGUILayout.PropertyField(karakterAdiProp);

        serializedObject.ApplyModifiedProperties(); // Değişiklikleri kaydedin
    }
}

Bu yaklaşım, Unity EnumPopup kullanımınızı çok daha sağlam hale getirir.

2. İpucu: Dinamik Etiketler ve GUIContent

EditorGUILayout.EnumPopup() metodu, ilk parametre olarak bir string etiket alabileceği gibi, daha zengin bilgiler içeren bir GUIContent objesi de alabilir. GUIContent, etiketin metnini, bir araç ipucunu (tooltip) ve hatta bir ikonu içerebilir. Bu, editör arayüzünüzü daha açıklayıcı hale getirmenizi sağlar.


// Örnek kullanım
KarakterDurumu yeniDurum = (KarakterDurumu)EditorGUILayout.EnumPopup(
    new GUIContent("Karakter Hali", "Karakterin şu anki aktif durumu.", EditorGUIUtility.IconContent("d_UnityLogo").image),
    karakter.mevcutDurum
);

3. İpucu: Koşullu Alanları Yönetme

Bazen bir enum seçimine bağlı olarak inspector'da farklı alanları göstermek veya gizlemek isteyebilirsiniz. EnumPopup'tan dönen değeri kontrol ederek bu dinamikliği sağlayabilirsiniz.


// KarakterKontrolcuEditor.cs (Koşullu alanlar ile)
using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(KarakterKontrolcu))]
public class KarakterKontrolcuEditor : Editor
{
    SerializedProperty mevcutDurumProp;
    SerializedProperty hizProp;
    SerializedProperty karakterAdiProp;

    void OnEnable()
    {
        mevcutDurumProp = serializedObject.FindProperty("mevcutDurum");
        hizProp = serializedObject.FindProperty("hiz");
        karakterAdiProp = serializedObject.FindProperty("karakterAdi");
    }

    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        EditorGUILayout.PropertyField(mevcutDurumProp); // Basit PropertyField kullanarak EnumPopup da gösterilebilir

        KarakterDurumu mevcutDurum = (KarakterDurumu)mevcutDurumProp.enumValueIndex;

        if (mevcutDurum == KarakterDurumu.Kosuyor)
        {
            EditorGUILayout.PropertyField(hizProp); // Sadece koşarken hız ayarı gösterilir
        }
        else if (mevcutDurum == KarakterDurumu.Saldiriyor)
        {
            EditorGUILayout.HelpBox("Saldırı animasyonunu kontrol edin.", MessageType.Info);
        }

        EditorGUILayout.PropertyField(karakterAdiProp);

        serializedObject.ApplyModifiedProperties();
    }
}

Bu, özel editörlerinizin etkileşimli olmasını sağlar ve kullanıcı deneyimini artırır.

Yaygın Hatalar ve Çözümleri

EditorGUILayout.EnumPopup() kullanırken karşılaşılabilecek bazı yaygın hatalar ve bunların çözümleri şunlardır:

Hata 1: Dönüş Değerini Atamayı Unutmak

EditorGUILayout.EnumPopup() bir değer döndürür ve bu değeri bir değişkene atamanız gerekir. Eğer atamazsanız, kullanıcının yaptığı seçim inspector'da görünür, ancak aslında temel veri değişmez.


// Yanlış kullanım
EditorGUILayout.EnumPopup("Durum", karakter.mevcutDurum);

// Doğru kullanım
karakter.mevcutDurum = (KarakterDurumu)EditorGUILayout.EnumPopup("Durum", karakter.mevcutDurum);

Hata 2: Type Casting Sorunları

EnumPopup, System.Enum tipinde bir değer döndürür. Bu değeri kendi özel enum tipinize dönüştürmeniz (cast etmeniz) gerekir. Aksi takdirde derleme hataları alırsınız.


// Yanlış kullanım (doğrudan atama)
karakter.mevcutDurum = EditorGUILayout.EnumPopup("Durum", karakter.mevcutDurum);

// Doğru kullanım (explicit casting)
karakter.mevcutDurum = (KarakterDurumu)EditorGUILayout.EnumPopup("Durum", karakter.mevcutDurum);

Hata 3: Editor Sınıfı Dışında Kullanım

EditorGUILayout sınıfındaki tüm metotlar, yalnızca Unity Editor ortamında çalışmak üzere tasarlanmıştır. Bu metotları bir MonoBehaviour veya diğer çalışma zamanı (runtime) betiklerinde kullanmaya çalışırsanız derleme veya çalışma zamanı hataları alırsınız.

Çözüm: Her zaman özel editör betiklerinizi (Assets/Editor klasörü altında) veya EditorWindow sınıflarınızı kullanarak EditorGUILayout metotlarını kullanın.

Performans ve Optimizasyon Notları

EditorGUILayout.EnumPopup() ve genel olarak EditorGUILayout metotları, çalışma zamanı (runtime) performansını doğrudan etkilemezler çünkü yalnızca Unity Editor'da çalışırlar. Bu nedenle, oyununuzun FPS'i veya bellek kullanımı üzerinde bir etkisi yoktur.

Ancak, çok karmaşık veya çok sayıda özel editör betiği oluşturuyorsanız, editor'ün kendisinin performansı etkilenebilir. Özellikle OnInspectorGUI() içinde pahalı hesaplamalar yapmaktan kaçınmalısınız. GUI.changed kontrolü ile sadece değişiklik olduğunda EditorUtility.SetDirty() veya serializedObject.ApplyModifiedProperties() çağırmak, gereksiz güncellemeleri önleyerek editor'ün daha duyarlı çalışmasına yardımcı olabilir.

Sonuç

EditorGUILayout.EnumPopup(), Unity editöründe enum değerlerini kullanıcı dostu ve etkileşimli bir şekilde yönetmek için vazgeçilmez bir araçtır. Bu makalede öğrendiğiniz temel ve gelişmiş teknikler sayesinde, özel inspector'larınızı daha işlevsel ve estetik hale getirebilir, geliştirme sürecinizi hızlandırabilirsiniz. Unity EnumPopup ile editör deneyiminizi bir üst seviyeye taşıyın ve daha düzenli, hatasız projeler geliştirin!

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