Unity Inspector Özelleştirme: Custom Editor'a Giriş
Unity, oyun geliştiricilere güçlü ve esnek bir ortam sunar. Ancak bazen varsayılan Inspector görünümü, karmaşık bileşenler veya özel veri yapıları için yeterince bilgilendirici veya kullanıcı dostu olmayabilir. İşte tam bu noktada Unity Custom Editor devreye girer. Bu makalede, Unity Inspector'ını nasıl özelleştirebileceğinizi, iş akışınızı nasıl hızlandırabileceğinizi ve geliştirme deneyiminizi nasıl iyileştirebileceğinizi adım adım inceleyeceğiz.
Unity Custom Editor, oyun geliştirme sürecinde verimliliği artıran kritik bir araçtır. Özellikle karmaşık sistemler geliştirirken, oyun içi nesnelerin davranışlarını ve özelliklerini doğrudan Inspector üzerinden yönetmek, zaman kazandırır ve hata olasılığını azaltır. Bu yazıda, Custom Editor'ın temel prensiplerini, pratik uygulamalarını ve dikkat edilmesi gereken noktaları detaylı bir şekilde ele alacağız.
Unity Custom Editor Nedir ve Neden Kullanılır?
Unity'deki her MonoBehaviour veya ScriptableObject sınıfı için, Unity otomatik olarak bir Inspector görünümü oluşturur. Bu görünüm, sınıfın public alanlarını ve [SerializeField] niteliği ile işaretlenmiş private alanlarını editörde gösterir. Ancak, bu varsayılan görünüm her zaman ideal değildir:
- Çok sayıda alan olduğunda Inspector karmaşıklaşabilir.
- Belirli alanların belirli koşullara bağlı olarak görünmesi veya gizlenmesi gerekebilir.
- Karmaşık veri yapıları (örneğin, liste içindeki listeler) varsayılan olarak iyi görünmeyebilir.
- Oyun içi mantığı tetikleyecek özel düğmeler veya görsel geri bildirimler eklemek isteyebilirsiniz.
İşte bu senaryolarda Editor sınıfından türetilen ve [CustomEditor(typeof(YourComponent))] niteliğiyle belirli bir bileşene bağlanan Unity Custom Editor sınıfları kullanılır. Bu editörler, OnInspectorGUI() metodu aracılığıyla bileşenin Inspector'ını tamamen kendi isteğimize göre çizmemize olanak tanır.
Temeller: Custom Editor Oluşturma
Bir Unity Custom Editor oluşturmak için aşağıdaki adımları izlemeniz gerekir:
- Projenizde bir
Editorklasörü oluşturun (eğer yoksa). Tüm editör scriptleri bu klasörde veya alt klasörlerinde bulunmalıdır. - Yeni bir C# scripti oluşturun (örneğin,
MyComponentEditor). - Bu scripti
UnityEditornamespace'ini kullanarakEditorsınıfından türetin. - Hangi bileşen için editör yazdığınızı belirtmek için sınıfın üzerine
[CustomEditor(typeof(MyComponent))]niteliğini ekleyin. OnInspectorGUI()metodunu override edin. Bu metot, Inspector'ın çizildiği yerdir.
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(MyComponent))]
public class MyComponentEditor : Editor
{
public override void OnInspectorGUI()
{
// Varsayılan Inspector'ı çizmek için:
DrawDefaultInspector();
// Hedef bileşene erişim:
MyComponent myComponent = (MyComponent)target;
// Özel bir düğme ekleyelim
if (GUILayout.Button("Selam Ver"))
{
myComponent.SayHello();
}
}
}
using UnityEngine;
public class MyComponent : MonoBehaviour
{
public string message = "Merhaba Dünya!";
public void SayHello()
{
Debug.Log(message);
}
}
SerializedObject ve SerializedProperty Kullanımı
Inspector'da değişiklikleri doğru bir şekilde yönetmek (Undo/Redo ve çoklu seçim desteği dahil) için doğrudan target objesinin public alanlarına erişmek yerine SerializedObject ve SerializedProperty kullanmak en iyi yöntemdir. Bu, Unity Custom Editor geliştirmenin temel taşıdır.
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(MyComponent))]
public class MyComponentEditor : Editor
{
SerializedProperty messageProperty;
private void OnEnable()
{
// Hedef bileşenin SerializedObject'i üzerinden özelliği bul
messageProperty = serializedObject.FindProperty("message");
}
public override void OnInspectorGUI()
{
// Inspector'da herhangi bir değişiklik yapılmadan önce çağrılmalı
serializedObject.Update();
// Özelliği çiz
EditorGUILayout.PropertyField(messageProperty);
// Değişiklikleri kaydet
serializedObject.ApplyModifiedProperties();
MyComponent myComponent = (MyComponent)target;
if (GUILayout.Button("Selam Ver"))
{
myComponent.SayHello();
}
}
}
serializedObject.Update(), scriptteki son değerleri Inspector'a çekerken, serializedObject.ApplyModifiedProperties(), Inspector'da yapılan değişiklikleri script'e geri yazar. Bu iki metodu kullanmak, değişikliklerin doğru bir şekilde kaydedilmesini ve Undo/Redo sisteminin çalışmasını sağlar.
Pratik İpuçları
1. Koşullu Alanlar ve Grup Oluşturma
Bazı alanların sadece belirli koşullar altında görünmesi Inspector'ı daha düzenli hale getirir. Örneğin, bir enum seçimine göre farklı ayarları gösterebilirsiniz.
// MyComponent içinde bir enum ekleyelim
public enum DisplayMode { Simple, Advanced }
public DisplayMode mode;
public float simpleValue;
public Vector3 advancedSettings;
// MyComponentEditor içinde
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(serializedObject.FindProperty("mode"));
MyComponent.DisplayMode currentMode = (MyComponent.DisplayMode)serializedObject.FindProperty("mode").enumValueIndex;
if (currentMode == MyComponent.DisplayMode.Simple)
{
EditorGUILayout.PropertyField(serializedObject.FindProperty("simpleValue"));
}
else
{
EditorGUILayout.PropertyField(serializedObject.FindProperty("advancedSettings"));
}
serializedObject.ApplyModifiedProperties();
}
Ayrıca, EditorGUILayout.BeginVertical(), EditorGUILayout.EndVertical() gibi Layout gruplarını kullanarak veya EditorGUILayout.Foldout() ile açılır/kapanır bölümler oluşturarak Inspector'ı daha okunaklı hale getirebilirsiniz. Unity Custom Editor bu tür düzenlemeler için geniş bir API sunar.
2. Çalışma Zamanı Metodlarını Tetikleme İçin Düğmeler
Oyun geliştirme sırasında, bir bileşenin belirli bir metodunu hızlıca test etmek isteyebilirsiniz. Inspector'a ekleyeceğiniz düğmelerle bunu kolayca yapabilirsiniz.
// MyComponent içinde
public void PerformComplexCalculation()
{
Debug.Log("Karmaşık hesaplama yapıldı!");
// ... uzun süren bir işlem ...
}
// MyComponentEditor içinde
public override void OnInspectorGUI()
{
DrawDefaultInspector(); // Varsayılanı çizsin, üzerine ekleyelim
MyComponent myComponent = (MyComponent)target;
EditorGUILayout.Space();
if (GUILayout.Button("Hesaplama Yap"))
{
myComponent.PerformComplexCalculation();
}
}
Bu, özellikle prototipleme veya hata ayıklama aşamalarında çok zaman kazandırır. Bu şekilde, bir metodun çağrılması için oyunu çalıştırmanıza veya sahneye bir nesne yerleştirmenize gerek kalmaz.
3. İlerleme Çubukları veya Bilgilendirici Mesajlar
Uzun süren işlemler veya belirli bir durum hakkında kullanıcıyı bilgilendirmek için özel çizimler kullanabilirsiniz. Örneğin, bir veri yükleme durumu veya bir yüzdelik tamamlama çubuğu.
// MyComponent içinde
[Range(0f, 1f)]
public float progress = 0.5f;
public bool showWarning = true;
// MyComponentEditor içinde
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(serializedObject.FindProperty("progress"));
EditorGUILayout.ProgressBar(serializedObject.FindProperty("progress").floatValue, "İşlem İlerlemesi");
EditorGUILayout.PropertyField(serializedObject.FindProperty("showWarning"));
if (serializedObject.FindProperty("showWarning").boolValue)
{
EditorGUILayout.HelpBox("Bu bir uyarı mesajıdır! Dikkatli olun.", MessageType.Warning);
}
serializedObject.ApplyModifiedProperties();
}
EditorGUILayout.ProgressBar ve EditorGUILayout.HelpBox gibi Unity'nin sunduğu hazır görsel elementler, Unity Custom Editor'larınızı daha bilgilendirici ve profesyonel hale getirir.
Yaygın Hatalar ve Çözümleri
-
Editör Scriptini Yanlış Yere Koymak: Editor scriptleri mutlaka
Assets/Editorklasörü veya bu klasörün altındaki herhangi bir klasörde olmalıdır. Aksi takdirde, derleme hataları alabilir veya editörünüz çalışmayabilir.Çözüm: Scriptinizi doğru klasöre taşıyın.
-
serializedObject.ApplyModifiedProperties()Unutmak: Inspector'da yaptığınız değişiklikler scriptinize yansımaz ve kaydedilmez.Çözüm:
OnInspectorGUI()metodunun sonundaserializedObject.ApplyModifiedProperties()metodunu çağırdığınızdan emin olun. -
serializedObject.Update()Unutmak: Scriptteki güncel değerler Inspector'a çekilemez, bu da Inspector'ın eski veya yanlış değerleri göstermesine neden olabilir.Çözüm:
OnInspectorGUI()metodunun başındaserializedObject.Update()metodunu çağırdığınızdan emin olun. -
targetÜzerinden Doğrudan Değişiklik Yapmak: Bu, Undo/Redo sistemini bozabilir ve çoklu obje seçimi durumunda doğru çalışmayabilir.Çözüm: Her zaman
SerializedObjectveSerializedPropertykullanarak değişiklikleri yapın. -
[CustomEditor(typeof(MyComponent))]Niteliğini Eklemeyi Unutmak: Editörünüz hiçbir bileşenle ilişkilendirilmez ve çalışmaz.Çözüm: Sınıf tanımınızın üzerine doğru
[CustomEditor(...)]niteliğini ekleyin.
Performans ve Optimizasyon Notları
OnInspectorGUI() metodu, Inspector penceresi odaklandığında veya bir değişiklik olduğunda sık sık çağrılabilir. Bu nedenle, bu metodun içinde çok yoğun veya pahalı işlemler yapmaktan kaçınmak önemlidir.
- Gereksiz Hesaplamalardan Kaçının: Her
OnInspectorGUIçağrısında uzun süreli matematiksel işlemler veya dosya okuma/yazma gibi işlemler yapmaktan kaçının. Bu tür işlemleri, yalnızca bir düğmeye basıldığında veya bir özellik değiştiğinde tetikleyin. SerializedPropertyÖnbellekleme:FindProperty()metodu, her çağrıldığında bir miktar maliyetlidir. Eğer bir özelliği birden fazla kez kullanıyorsanız,OnEnable()metodunda önbelleğe alıp daha sonra kullanmak performansı artırır. Yukarıdaki örneklerde de bunu yaptık.- Yalnızca Gerektiğinde Çizim Yapın: Gerekmedikçe karmaşık GUI elementleri çizmekten kaçının. Örneğin,
EditorGUI.BeginChangeCheck()veEditorGUI.EndChangeCheck()kullanarak sadece Inspector'da bir değişiklik olduğunda pahalı bir işlemi tetikleyebilirsiniz.
Sonuç
Unity Custom Editor, oyun geliştirme sürecinizi kişiselleştirmenin ve hızlandırmanın güçlü bir yoludur. Varsayılan Inspector'ın ötesine geçerek, özel araçlar, görsel geri bildirimler ve daha akıcı bir kullanıcı deneyimi yaratabilirsiniz. SerializedObject ve SerializedProperty kavramlarını anlamak, Custom Editor'ları etkin bir şekilde kullanmanın anahtarıdır. Bu makaledeki bilgilerle, kendi özel Inspector görünümlerinizi oluşturmaya başlayabilir ve Unity iş akışınızı bir üst seviyeye taşıyabilirsiniz. Unutmayın, iyi tasarlanmış bir Unity Custom Editor, sadece size değil, ekibinizdeki diğer geliştiricilere de büyük kolaylıklar sağlar.
🧠 Ders Sonu Değerlendirme Testi
Dersi tamamladıktan sonra bilgilerinizi test edin ve ekstra puanlar kazanın.
Yorumlar (0)
İlk yorumu siz yapın!