Unity Editor Kaydırıcı: EditorGUILayout.Slider() Kullanımına Giriş
Unity oyun geliştirme sürecinde, çoğu zaman Inspector penceresindeki varsayılan bileşenler (components) veya özellikler (properties) yeterli olmayabilir. Özellikle karmaşık sistemler veya özel araçlar geliştirdiğinizde, kendi Inspector arayüzlerinizi tasarlamanız gerekebilir. İşte tam da bu noktada Unity’nin Editor GUI API’si devreye girer. Bu API sayesinde, oyun içi arayüzler yerine Unity Editor’ı içinde çalışan özel pencereler, düğmeler, metin alanları ve tabii ki kaydırıcılar (sliders) oluşturabilirsiniz.
Neden Özel Editörler ve EditorGUILayout?
Özel editörler (custom editors), geliştirme sürecini hızlandırmak, hataları azaltmak ve ekip üyelerinin daha kolay çalışmasını sağlamak için hayati öneme sahiptir. Bir tasarımcının, kod bilmeden bir animasyonun hızını veya bir parçacık sisteminin yoğunluğunu kolayca ayarlayabilmesi, özel editörlerin gücünü gösterir. `EditorGUILayout` sınıfı, bu özel editörleri oluştururken kullandığımız ana araçlardan biridir. `EditorGUILayout`, elemanları otomatik olarak düzenleyerek (layouting) kod yazımını basitleştirir ve daha az `Rect` hesaplaması yapmanızı sağlar. Bu sayede, Inspector’ınıza ekleyeceğiniz her yeni eleman için konum ve boyut hesaplamalarıyla uğraşmak yerine, doğrudan işlevselliğe odaklanabilirsiniz.
EditorGUILayout.Slider() Nedir?
EditorGUILayout.Slider(), Unity Editor’ı içinde belirli bir aralıktaki sayısal bir değeri görsel olarak ayarlamanızı sağlayan bir Unity Editor kaydırıcı elemanıdır. Bir minimum ve bir maksimum değer aralığı tanımlarsınız ve kullanıcı bu aralık içinde bir değer seçmek için kaydırıcıyı hareket ettirir. Bu, özellikle oyun objelerinin hızını, yoğunluğunu, renginin bir bileşenini veya herhangi bir sayısal parametreyi ayarlamak için son derece kullanışlıdır. Örneğin, bir ışığın parlaklığını 0 ile 10 arasında ayarlamak, bir karakterin zıplama gücünü 5 ile 20 arasında belirlemek veya bir efektin yoğunluğunu yüzde olarak ifade etmek gibi senaryolarda Unity Editor kaydırıcı vazgeçilmez bir araçtır.
EditorGUILayout.Slider() Temelleri ve Parametreleri
EditorGUILayout.Slider() metodunun farklı aşırı yüklemeleri (overloads) bulunur, ancak en yaygın kullanılanları float ve int değerler içindir. Her iki durumda da temel parametreler benzerdir: bir etiket (label), mevcut değer, minimum limit ve maksimum limit.
float Değerler İçin Kaydırıcı
Bir float değeri ayarlamak için kullanılan temel form şöyledir:
public static float Slider(string label, float value, float leftValue, float rightValue);
label: Kaydırıcının yanında görünecek metin etiketi.value: Kaydırıcının o anki değeri (veya başlangıç değeri). Bu değeri değiştirdiğinizde, kaydırıcı da hareket eder.leftValue: Kaydırıcının alabileceği minimum değer.rightValue: Kaydırıcının alabileceği maksimum değer.
Aşağıdaki örnekte, basit bir MonoBehaviour sınıfının bir float değerini özel bir Inspector ile nasıl ayarlayacağımızı göreceğiz. Öncelikle, Inspector’da görünmesini istediğimiz MonoBehaviour sınıfını oluşturalım:
// MySliderScript.cs
using UnityEngine;
public class MySliderScript : MonoBehaviour
{
[Range(0f, 10f)] // Sadece Inspector'da varsayılan slider için bir gösterim
public float speed = 5.0f;
public int count = 10;
}
Şimdi de bu script için özel bir Inspector oluşturalım:
// MySliderScriptEditor.cs
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(MySliderScript))]
public class MySliderScriptEditor : Editor
{
public override void OnInspectorGUI()
{
// Hedef objeye referans alalım
MySliderScript myScript = (MySliderScript)target;
// Varsayılan Inspector'ı çizmeyelim, kendi kontrolümüzü yapalım
// base.OnInspectorGUI(); // Eğer varsayılanı da göstermek isterseniz açın
EditorGUILayout.LabelField("Özel Float Kaydırıcı");
// Float değer için Unity Editor Kaydırıcı
myScript.speed = EditorGUILayout.Slider("Hız", myScript.speed, 0f, 10f);
// Değişiklikleri kaydetmek için gerekli
if (GUI.changed)
{
EditorUtility.SetDirty(myScript);
}
}
}
Bu kod bloğu, MySliderScript‘e bağlı bir objeyi seçtiğinizde Inspector’da “Hız” etiketli bir Unity Editor kaydırıcı gösterecektir. Bu kaydırıcı 0 ile 10 arasında bir değeri ayarlamanızı sağlar.
int Değerler İçin Kaydırıcı
int değerler için kullanım da benzerdir, sadece metodun tipi int olur:
public static int Slider(string label, int value, int leftValue, int rightValue);
Yukarıdaki MySliderScriptEditor örneğine int bir kaydırıcı ekleyelim:
// MySliderScriptEditor.cs (devamı)
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(MySliderScript))]
public class MySliderScriptEditor : Editor
{
public override void OnInspectorGUI()
{
MySliderScript myScript = (MySliderScript)target;
EditorGUILayout.LabelField("Özel Float Kaydırıcı");
myScript.speed = EditorGUILayout.Slider("Hız", myScript.speed, 0f, 10f);
EditorGUILayout.Space(); // Biraz boşluk bırakalım
EditorGUILayout.LabelField("Özel Int Kaydırıcı");
// Int değer için Unity Editor Kaydırıcı
myScript.count = EditorGUILayout.IntSlider("Adet", myScript.count, 0, 100);
if (GUI.changed)
{
EditorUtility.SetDirty(myScript);
}
}
}
SerializedProperty ile Çalışmak
Unity’de özel editörler geliştirirken, doğrudan script değişkenlerine erişmek yerine SerializedObject ve SerializedProperty kullanmak daha güvenli ve esnek bir yaklaşımdır. Bu yöntem, Undo/Redo sistemiyle otomatik entegrasyon, çoklu nesne düzenleme (multi-object editing) ve Prefab sistemiyle daha iyi uyum sağlar.
// MySliderScriptEditor.cs (SerializedProperty ile)
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(MySliderScript))]
public class MySliderScriptEditor : Editor
{
SerializedProperty speedProp;
SerializedProperty countProp;
void OnEnable()
{
// Script yüklendiğinde veya Inspector açıldığında çağrılır
speedProp = serializedObject.FindProperty("speed");
countProp = serializedObject.FindProperty("count");
}
public override void OnInspectorGUI()
{
// serializedObject'i güncelleyelim
serializedObject.Update();
EditorGUILayout.PropertyField(speedProp); // Varsayılan slider'ı kullanabiliriz
// Float değer için Unity Editor Kaydırıcı (SerializedProperty ile)
EditorGUILayout.Slider(speedProp, 0f, 10f, new GUIContent("Hız (Özel)"));
EditorGUILayout.Space();
// Int değer için Unity Editor Kaydırıcı (SerializedProperty ile)
EditorGUILayout.IntSlider(countProp, 0, 100, new GUIContent("Adet (Özel)"));
// Değişiklikleri serializedObject'e uygula ve kaydet
serializedObject.ApplyModifiedProperties();
}
}
EditorGUILayout.Slider(SerializedProperty property, float leftValue, float rightValue, GUIContent label) aşırı yüklemesi, etiketi (label) GUIContent nesnesi olarak alarak daha fazla esneklik sunar (örneğin, tooltip veya ikon ekleme).
Pratik İpuçları ve Gelişmiş Kullanım
1. Değişiklikleri Algılama ve Kaydetme (Begin/EndChangeCheck)
Özel editörlerdeki değer değişikliklerini algılamak ve yalnızca değişiklik olduğunda kaydetme veya diğer işlemleri tetiklemek için EditorGUI.BeginChangeCheck() ve EditorGUI.EndChangeCheck() kullanmak önemlidir. Bu, performansı artırır ve gereksiz güncellemeleri önler.
// MySliderScriptEditor.cs (Değişiklik Kontrolü)
// ... (OnInspectorGUI metodu içinde)
EditorGUI.BeginChangeCheck();
// Unity Editor Kaydırıcı
myScript.speed = EditorGUILayout.Slider("Hız", myScript.speed, 0f, 10f);
if (EditorGUI.EndChangeCheck())
{
Debug.Log("Hız değeri değişti: " + myScript.speed);
EditorUtility.SetDirty(myScript); // Değişikliği kaydet
}
// ...
SerializedProperty kullanıyorsanız, serializedObject.ApplyModifiedProperties() metodu bu kontrolü zaten otomatik olarak yapar ve yalnızca değişiklik olduğunda verileri kaydeder.
2. Kaydırıcıyı Sayı Girişi ile Birleştirmek
Bazen kullanıcılar kaydırıcı ile hassas bir değer ayarlamakta zorlanabilir. Bu durumda, kaydırıcının yanına doğrudan sayı girişi yapabilecekleri bir alan eklemek kullanıcı deneyimini iyileştirir. EditorGUILayout.FloatField() veya EditorGUILayout.IntField() ile bu mümkündür.
// MySliderScriptEditor.cs (Kaydırıcı ve Sayı Girişi)
// ... (OnInspectorGUI metodu içinde)
EditorGUILayout.BeginHorizontal();
// Sayı girişi
myScript.speed = EditorGUILayout.FloatField("Hız", myScript.speed, GUILayout.Width(150));
// Unity Editor Kaydırıcı
myScript.speed = EditorGUILayout.Slider(myScript.speed, 0f, 10f);
EditorGUILayout.EndHorizontal();
// Değerin belirlenen sınırlar içinde kalmasını sağlayalım
myScript.speed = Mathf.Clamp(myScript.speed, 0f, 10f);
// ...
Bu örnekte, aynı değeri hem bir FloatField hem de bir Slider ile kontrol edebilirsiniz. Mathf.Clamp kullanarak değerin belirlenen sınırlar dışına çıkmasını engellemek önemlidir.
3. Düzenli ve Okunabilir Layout İçin Ek İpuçları
Editörünüzün düzenli görünmesi, kullanım kolaylığı açısından kritiktir. EditorGUILayout, otomatik layout sağlasa da, bazen elemanları yan yana veya belirli bir hizalamada göstermek isteyebilirsiniz. Bunun için EditorGUILayout.BeginHorizontal() ve EditorGUILayout.EndHorizontal() gibi layout gruplarını kullanabilirsiniz.
Ayrıca, GUILayoutOption parametreleri ile elemanların boyutlarını veya hizalamalarını daha hassas kontrol edebilirsiniz:
GUILayout.Width(float width): Sabit genişlik belirler.GUILayout.MinWidth(float width): Minimum genişlik belirler.GUILayout.ExpandWidth(bool expand): Genişliği otomatik doldurmasını sağlar.GUILayout.Height(float height): Sabit yükseklik belirler.
Yukarıdaki kaydırıcı ve sayı girişi örneği, BeginHorizontal() kullanımına iyi bir örnektir. Etiketleri ve kaydırıcıları daha iyi hizalamak için EditorGUI.indentLevel da kullanabilirsiniz.
Yaygın Hatalar ve Çözümleri
1. Değişikliklerin Kaydedilmemesi
Hata: Inspector’da kaydırıcıyı hareket ettiriyorsunuz ama oyun durduğunda veya sahneyi kaydettiğinizde değişiklikler kayboluyor.
Çözüm: Doğrudan değişkenlere erişirken EditorUtility.SetDirty(target) metodunu çağırmayı unutmayın. SerializedProperty kullanıyorsanız, serializedObject.ApplyModifiedProperties() metodunu OnInspectorGUI metodunun sonunda çağırmalısınız. Bu, Unity’ye objenin değiştiğini ve kaydedilmesi gerektiğini bildirir.
2. Yanlış min/max Değerleri
Hata: Kaydırıcının minimum değeri maksimum değerinden büyük veya kaydırıcı hiç hareket etmiyor.
Çözüm: leftValue her zaman rightValue‘dan küçük olmalıdır. Ayrıca, değer aralığınızın mantıklı olduğundan emin olun. Örneğin, bir yüzde değeri için 0-100 aralığı, bir renk bileşeni için 0-1 aralığı gibi.
3. Performans Endişeleri (Editör İçin)
Hata: Çok karmaşık editörler, özellikle OnInspectorGUI içinde yoğun hesaplamalar yapıldığında Unity Editor’ı yavaşlatabilir.
Çözüm: OnInspectorGUI metodu her karede (veya Editor repainting gerektiğinde) çağrılabilir. Bu nedenle, bu metodun içinde ağır hesaplamalar yapmaktan kaçının. Yalnızca kullanıcı etkileşimine veya değişikliklere bağlı olarak hesaplamalar yapın. EditorGUI.BeginChangeCheck() kullanarak sadece değişiklik olduğunda ağır işlemleri tetiklemek iyi bir yaklaşımdır. Genellikle editor GUI performansı oyunun kendisini etkilemez, ancak geliştirme deneyimini kötüleştirebilir.
4. EditorGUI ve EditorGUILayout Farkı
Hata: `EditorGUILayout.Slider()` yerine `EditorGUI.Slider()` kullanmaya çalışıp layout sorunları yaşamak.
Çözüm: `EditorGUILayout` otomatik olarak düzenleme (layouting) yapar. Yani elemanların konumunu ve boyutunu sizin yerinize ayarlar. `EditorGUI` ise elemanların tam konumunu ve boyutunu (`Rect` nesnesi ile) sizin belirlemenizi gerektirir. Çoğu zaman özel Inspector’lar için `EditorGUILayout` daha pratiktir. Eğer elemanları tamamen manuel olarak konumlandırmanız gerekiyorsa `EditorGUI`’ye yönelmelisiniz.
Sonuç
EditorGUILayout.Slider(), Unity Editor’ınızda etkileşimli ve kullanıcı dostu arayüzler oluşturmak için güçlü ve esnek bir araçtır. Bu Unity Editor kaydırıcı, oyun geliştirme sürecinizi hızlandırırken, karmaşık parametrelerin ayarlanmasını basitleştirir. Temel kullanımından SerializedProperty ile çalışmaya, pratik ipuçlarından yaygın hataların çözümüne kadar geniş bir yelpazede ele aldığımız bu rehber, kendi özel editörlerinizi oluştururken size sağlam bir temel sunacaktır. Kendi araçlarınızı geliştirmeye devam ettikçe, Unity Editor kaydırıcı gibi elemanların ne kadar değerli olduğunu daha iyi anlayacaksınız. Denemekten ve farklı kombinasyonlar oluşturmaktan çekinmeyin!




