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

Unity Editöründe Renk Seçimi: EditorGUILayout.ColorField Kullanımı

Paylaşan: Unity Eğitim 28 December 2025 10 dakika okuma 179 görüntülenme

Unity oyun motoru, geliştiricilere sadece oyun içi deneyimler yaratma imkanı sunmakla kalmaz, aynı zamanda bu deneyimleri daha verimli bir şekilde tasarlamak için güçlü editör araçları da sağlar. Özel editörler (Custom Inspectors) oluşturmak, geliştirme sürecini hızlandıran ve ekip üyeleri arasındaki iletişimi kolaylaştıran kilit bir özelliktir. Bu makalede, özel editörlerinizde renk seçimi yapmanızı sağlayan ve oldukça kullanışlı olan EditorGUILayout.ColorField metodunu derinlemesine inceleyeceğiz.

EditorGUILayout.ColorField, Unity'nin UnityEditor namespace'i altında bulunan bir UI kontrolüdür. Bu kontrol sayesinde, kendi yazdığınız component'ler veya ScriptableObject'ler için Inspector penceresinde bir renk seçici alanı görüntüleyebilirsiniz. Bu, özellikle materyal renklerini, UI öğelerinin renklerini veya oyun içi efektlerin renklerini düzenlerken büyük kolaylık sağlar. Kullanımı oldukça basittir ancak güçlü özelliklere sahiptir.

EditorGUILayout.ColorField Temelleri

EditorGUILayout.ColorField, sadece Unity Editör ortamında çalışan bir metottur. Yani, oyununuzun çalışma zamanında (runtime) değil, sadece Unity Editörü açıkken ve bir Editor sınıfının OnInspectorGUI metodu içinde çağrıldığında işlev görür. Bu, özel Inspector'lar, Editor pencere araçları veya ScriptableWizard'lar gibi editör uzantıları geliştirdiğinizde kullanışlıdır.

Temel kullanımı, bir Color değişkenini göstermek ve değiştirmek için bir etiket (label) ile birlikte kullanmaktır. İşte basit bir örnek:


using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(MyColorComponent))]
public class MyColorComponentEditor : Editor
{
    public override void OnInspectorGUI()
    {
        MyColorComponent myComponent = (MyColorComponent)target;

        // Renk alanını çizer ve değeri günceller
        myComponent.myColor = EditorGUILayout.ColorField("Renk Seçimi", myComponent.myColor);

        // Değişiklikleri Unity'ye bildir (isteğe bağlı ama önerilir)
        if (GUI.changed)
        {
            EditorUtility.SetDirty(myComponent);
        }
    }
}

using UnityEngine;

public class MyColorComponent : MonoBehaviour
{
    public Color myColor = Color.red;
}

Yukarıdaki örnekte, MyColorComponent adlı bir MonoBehaviour sınıfımız var ve bu sınıfın myColor adında bir Color değişkeni bulunuyor. MyColorComponentEditor sınıfı ise bu component için özel bir Inspector görevi görüyor. OnInspectorGUI metodu içinde EditorGUILayout.ColorField kullanarak myColor değişkenini editörde görüntülüyoruz ve kullanıcının seçtiği yeni rengi bu değişkene atıyoruz.

Parametreler ve Aşırı Yüklemeler

EditorGUILayout.ColorField metodunun birkaç farklı aşırı yüklemesi (overload) bulunur, bu da size esneklik sağlar:

  • Color ColorField(string label, Color value, params GUILayoutOption[] options)
  • Color ColorField(GUIContent label, Color value, params GUILayoutOption[] options)
  • Color ColorField(string label, Color value, bool showAlpha, bool HDR, params GUILayoutOption[] options)
  • Color ColorField(GUIContent label, Color value, bool showAlpha, bool HDR, params GUILayoutOption[] options)

En sık kullanılan parametreler şunlardır:

  • label: Renk alanının yanında gösterilecek metin etiketi. string veya GUIContent olarak verilebilir.
  • value: Mevcut renk değeri. Bu değeri, kullanıcı renk seçtikçe güncellersiniz.
  • showAlpha: (bool) Renk seçicinin alfa (saydamlık) kanalını gösterip göstermeyeceğini belirler. Varsayılan olarak true'dur.
  • HDR: (bool) Renk seçicinin Yüksek Dinamik Aralık (High Dynamic Range) modunda çalışıp çalışmayacağını belirler. HDR renkler, genellikle ışıklandırma veya özel efektler için kullanılır ve 1'den büyük değerler içerebilir. Varsayılan olarak false'tur.
  • options: (params GUILayoutOption[]) Genişlik, yükseklik gibi UI düzenleme seçeneklerini belirlemek için kullanılır.

Değişiklikleri Algılama ve Geri Alma (Undo)

Özel editörlerde yapılan değişikliklerin Unity tarafından doğru bir şekilde kaydedilmesi ve geri alınabilmesi (Undo/Redo) çok önemlidir. Bunun için EditorGUI.BeginChangeCheck(), EditorGUI.EndChangeCheck() ve Undo.RecordObject() metotlarını kullanırız. Bu, EditorGUILayout.ColorField ile çalışırken de geçerlidir.


using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(MyColorComponent))]
public class MyColorComponentEditor : Editor
{
    public override void OnInspectorGUI()
    {
        MyColorComponent myComponent = (MyColorComponent)target;

        // Değişiklik kontrolünü başlat
        EditorGUI.BeginChangeCheck();

        // Renk alanını çiz
        Color newColor = EditorGUILayout.ColorField("Ana Renk", myComponent.myColor, true, false);

        // Eğer bir değişiklik olduysa
        if (EditorGUI.EndChangeCheck())
        {
            // Geri alma (Undo) kaydı oluştur
            Undo.RecordObject(myComponent, "Rengi Değiştir");
            // Değeri güncelle
            myComponent.myColor = newColor;
            // Değişikliği Unity'ye bildir
            EditorUtility.SetDirty(myComponent);
        }
    }
}

Bu yapı, kullanıcının renk seçicide yaptığı her değişikliğin Undo sistemine kaydedilmesini sağlar. Böylece kullanıcı, Ctrl+Z (Cmd+Z) ile yaptığı değişiklikleri geri alabilir.

Pratik İpuçları

1. İpucu: SerializedProperty ile Daha Sağlam Kullanım

target objesi üzerinden doğrudan değişkenlere erişmek yerine, SerializedObject ve SerializedProperty kullanmak, Unity'nin Inspector sisteminin tüm avantajlarından (örneğin Prefab override'ları) yararlanmanızı sağlar ve daha sağlam bir kod yapısı sunar.


using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(MyColorComponent))]
public class MyColorComponentEditor : Editor
{
    private SerializedProperty myColorProp;

    private void OnEnable()
    {
        myColorProp = serializedObject.FindProperty("myColor");
    }

    public override void OnInspectorGUI()
    {
        // SerializedObject'i güncelleyin
        serializedObject.Update();

        // Renk alanını çizin ve SerializedProperty ile bağlayın
        // SerializedProperty'nin colorValue özelliğini doğrudan kullanabilirsiniz.
        EditorGUILayout.PropertyField(myColorProp, new GUIContent("Ana Renk"));
        // Veya daha fazla kontrol için:
        // myColorProp.colorValue = EditorGUILayout.ColorField(new GUIContent("Ana Renk"), myColorProp.colorValue);

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

EditorGUILayout.PropertyField, otomatik olarak SerializedProperty türüne uygun bir kontrol çizer. Eğer daha spesifik bir EditorGUILayout.ColorField kontrolü istiyorsanız, ikinci yorum satırındaki gibi doğrudan myColorProp.colorValue'yu kullanabilirsiniz.

2. İpucu: Birden Fazla Renk Alanı ve UI Düzeni

Bazen tek bir component içinde birden fazla renge ihtiyacınız olabilir. EditorGUILayout sınıfı, yatay (EditorGUILayout.BeginHorizontal()) ve dikey (EditorGUILayout.BeginVertical()) düzenlemeler için metotlar sunar. Bu metotları kullanarak renk alanlarınızı daha düzenli gösterebilirsiniz.


using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(MultiColorComponent))]
public class MultiColorComponentEditor : Editor
{
    public override void OnInspectorGUI()
    {
        MultiColorComponent myComponent = (MultiColorComponent)target;

        EditorGUI.BeginChangeCheck();

        EditorGUILayout.LabelField("Renk Ayarları", EditorStyles.boldLabel);

        EditorGUILayout.BeginHorizontal();
        myComponent.primaryColor = EditorGUILayout.ColorField(new GUIContent("Ana Renk"), myComponent.primaryColor, true, false, GUILayout.Width(250));
        myComponent.secondaryColor = EditorGUILayout.ColorField(new GUIContent("İkincil Renk"), myComponent.secondaryColor, true, false, GUILayout.Width(250));
        EditorGUILayout.EndHorizontal();

        myComponent.backgroundColor = EditorGUILayout.ColorField("Arka Plan Rengi", myComponent.backgroundColor);

        if (EditorGUI.EndChangeCheck())
        {
            Undo.RecordObject(myComponent, "Çoklu Renk Değişimi");
            EditorUtility.SetDirty(myComponent);
        }
    }
}

using UnityEngine;

public class MultiColorComponent : MonoBehaviour
{
    public Color primaryColor = Color.blue;
    public Color secondaryColor = Color.green;
    public Color backgroundColor = Color.black;
}

3. İpucu: Renk Değerini Anında Görselleştirme

Renk seçiciyi kullanırken, seçilen rengin oyun nesnesi üzerinde anında görünmesi kullanıcı deneyimini artırır. Örneğin, bir materyalin rengini doğrudan değiştirebilirsiniz.


using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(MaterialColorChanger))]
public class MaterialColorChangerEditor : Editor
{
    public override void OnInspectorGUI()
    {
        MaterialColorChanger changer = (MaterialColorChanger)target;

        EditorGUI.BeginChangeCheck();

        changer.targetColor = EditorGUILayout.ColorField("Hedef Renk", changer.targetColor);

        if (EditorGUI.EndChangeCheck())
        {
            Undo.RecordObject(changer, "Materyal Rengi Değişti");
            // Değişikliği kaydet
            EditorUtility.SetDirty(changer);

            // Materyali anında güncelle
            if (changer.targetRenderer != null && changer.targetRenderer.sharedMaterial != null)
            {
                changer.targetRenderer.sharedMaterial.color = changer.targetColor;
            }
        }
    }
}

using UnityEngine;

public class MaterialColorChanger : MonoBehaviour
{
    public Renderer targetRenderer;
    public Color targetColor = Color.white;

    void OnEnable()
    {
        if (targetRenderer == null) targetRenderer = GetComponent<Renderer>();
        if (targetRenderer != null && targetRenderer.sharedMaterial != null)
        {
            targetRenderer.sharedMaterial.color = targetColor;
        }
    }
}

Bu örnekte, Inspector'daki targetColor değiştiğinde, ilişkili Renderer'ın materyal rengi anında güncellenir. Bu, geliştiricinin yaptığı renk seçiminin görsel etkisini hemen görmesini sağlar.

Yaygın Hatalar ve Çözümleri

1. Hata: Editor Sınıfı Dışında Kullanmaya Çalışmak

Hata: EditorGUILayout.ColorField veya diğer EditorGUILayout metotlarını doğrudan bir MonoBehaviour veya oyun içi bir script içinde kullanmaya çalışmak.

Çözüm: EditorGUILayout sınıfı, sadece Unity Editör ortamında çalışmak üzere tasarlanmıştır. Bu metotları yalnızca UnityEditor namespace'i altında tanımlanmış Editor, EditorWindow veya ScriptableWizard gibi sınıfların içindeki OnInspectorGUI veya benzeri editör metotlarında kullanmalısınız. Oyununuzun çalışma zamanında renk seçmek için Unity UI veya başka bir kütüphane kullanmanız gerekir.

2. Hata: Değişiklikleri Kaydetmemek (Undo Eksikliği)

Hata: Kullanıcının EditorGUILayout.ColorField ile yaptığı değişikliklerin Unity'nin Undo sistemine kaydedilmemesi.

Çözüm: Her zaman EditorGUI.BeginChangeCheck(), EditorGUI.EndChangeCheck() ve Undo.RecordObject() üçlüsünü kullanın. Bu, hem değişiklikleri doğru şekilde kaydetmenizi sağlar hem de kullanıcıların yanlışlıkla yaptıkları değişiklikleri geri almalarına olanak tanır. Ayrıca, değişiklik yapıldığında EditorUtility.SetDirty(targetObject); çağrısını yaparak Unity'ye objenin değiştiğini bildirin.

3. Hata: OnInspectorGUI İçinde Gereksiz İşlemler

Hata: OnInspectorGUI metodu, Inspector penceresi her yeniden çizildiğinde (neredeyse sürekli) çağrılır. Bu metot içinde ağır hesaplamalar yapmak performansı düşürebilir.

Çözüm: OnInspectorGUI içinde sadece UI çizimi ve gerekli veri güncellemelerini yapın. Ağır işlemleri, örneğin bir veritabanı sorgusu veya dosya okuma/yazma gibi işlemleri, sadece gerçekten ihtiyaç duyulduğunda (örneğin bir buton tıklandığında) ve mümkünse ayrı bir metot veya iş parçacığında (thread) gerçekleştirin. EditorGUILayout.ColorField'in kendisi hafiftir ancak etrafındaki kod önemlidir.

Performans ve Optimizasyon Notları

EditorGUILayout.ColorField gibi editör UI elemanları, oyunun çalışma zamanı performansını doğrudan etkilemez. Ancak, OnInspectorGUI metodu, Inspector penceresi aktif olduğu sürece ve objede herhangi bir değişiklik olduğunda (veya Unity'nin belirli aralıklarla tetiklemesiyle) sürekli olarak çağrılır. Bu nedenle, OnInspectorGUI içinde aşırı karmaşık veya yoğun hesaplamalar yapmaktan kaçınmak önemlidir. Aksi takdirde, editörünüz yavaşlayabilir veya takılabilir.

  • Gereksiz FindObjectOfType veya GetComponent çağrılarından kaçının. Eğer bir referansa ihtiyacınız varsa, bunu OnEnable metodunda önbelleğe alın (cache edin).
  • Karmaşık döngüler veya veri işleme operasyonlarını sadece bir olay (buton tıklaması, değer değişimi) üzerine tetikleyin, her Inspector çiziminde değil.
  • SerializedProperty kullanmak, genellikle performans açısından doğrudan değişkenlere erişmekten daha iyidir çünkü Unity'nin dahili optimizasyonlarından faydalanır.

Sonuç

EditorGUILayout.ColorField, Unity'de özel editörler geliştirirken renk seçimi yeteneği eklemek için vazgeçilmez bir araçtır. Doğru kullanıldığında, geliştirme sürecinizi büyük ölçüde hızlandırır ve kullanıcı dostu arayüzler oluşturmanıza olanak tanır. Bu makaledeki ipuçları ve yaygın hatalara yönelik çözümlerle, özel editörlerinizde renk alanlarını daha verimli ve sorunsuz bir şekilde kullanabileceksiniz. Kendi oyun geliştirme yolculuğunuzda bu güçlü aracı etkin bir şekilde kullanarak, projelerinizi bir üst seviyeye taşıyın!

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