Unity, oyun ve etkileşimli deneyimler geliştirmek için güçlü bir platform sunar. Ancak bazen, varsayılan Inspector arayüzü karmaşık bileşenler veya özel veri yapıları için yeterince sezgisel olmayabilir. İşte bu noktada Custom Inspector’lar ve Property Drawer’lar devreye girer. Bu makalede, Unity geliştirme sürecinizi nasıl daha verimli ve kullanıcı dostu hale getirebileceğinizi gösteren bu iki güçlü aracı detaylı bir şekilde inceleyeceğiz.
Neden Custom Inspector Kullanmalıyız?
Unity’nin varsayılan Inspector’ı çoğu durum için harika çalışsa da, karmaşık sistemler geliştirirken bazı sınırlamalara sahip olabilir. Özel Inspector’lar ve Property Drawer’lar, bu sınırlamaları aşmanızı sağlayarak geliştirme sürecinizi optimize etmenize yardımcı olur.
Karmaşıklığı Azaltma
Bir bileşeninizde çok sayıda değişken veya iç içe geçmiş veri yapısı olduğunda, varsayılan Inspector hızla kalabalık ve okunaksız hale gelebilir. Custom Inspector’lar sayesinde, bu karmaşık verileri daha düzenli, gruplandırılmış ve anlaşılır bir şekilde sunabilirsiniz. Gereksiz alanları gizleyebilir, önemli olanları vurgulayabilir veya farklı sekmeler altında toplayabilirsiniz. Bu, özellikle büyük projelerde veya ekip çalışmalarında hata yapma olasılığını azaltır.
Kullanıcı Deneyimi (UX) İyileştirme
Geliştiriciler de bir tür “kullanıcıdır”. Editörde geçirdiğimiz zamanın verimli olması, genel proje kalitesini doğrudan etkiler. Custom Inspector’lar, bileşenlerinize özel kontroller (butonlar, kaydırıcılar, renk seçiciler vb.) eklemenizi, hatta özel görselleştirmeler yapmanızı sağlar. Örneğin, bir düşman AI’ı için hareket rotalarını doğrudan sahne görünümünde çizen veya bir level tasarımcısının belirli parametreleri kolayca ayarlamasını sağlayan özel bir arayüz oluşturabilirsiniz. Bu, bileşenin amacını anlama ve onunla etkileşim kurma sürecini büyük ölçüde basitleştirir.
Hata Ayıklama ve Verimlilik
Özel bir Inspector, geliştirme sırasında hata ayıklama sürecini de hızlandırabilir. Belirli bir bileşenin iç durumunu veya çalışma zamanı verilerini anında görüntüleyebilir, hatta bazı değerleri canlı olarak değiştirebilirsiniz. Bu, test ve iterasyon süreçlerini hızlandırarak genel verimliliği artırır. Ayrıca, varsayılan Inspector’da bulunmayan özel doğrulama kuralları ekleyerek hatalı veri girişlerini önleyebilirsiniz.
Property Drawer Nedir ve Nasıl Çalışır?
Property Drawer’lar, Unity’deki serileştirilebilir bir değişkenin (field) Inspector’da nasıl çizileceğini özelleştirmenizi sağlayan güçlü bir araçtır. Genellikle [SerializeField] ile işaretlenmiş özel sınıflar, struct’lar veya belirli veri tipleri için kullanılırlar. Bir Property Drawer, tek bir değişkenin veya özel bir veri yapısının Inspector’daki görünümünü ve etkileşimini kontrol eder.
Custom Property Drawer Oluşturma Adımları
Bir Property Drawer oluşturmak için iki ana bileşene ihtiyacınız vardır:
- PropertyAttribute: Inspector’da özelleştirmek istediğiniz field’ın üzerine uygulayacağınız özel bir nitelik (attribute).
- PropertyDrawer Sınıfı: Bu niteliği taşıyan field’ın nasıl çizileceğini tanımlayan ana sınıf.
Örnek Senaryo: Bir envanter sisteminde, öğelerin nadirliğini (Common, Uncommon, Rare, Epic, Legendary) temsil eden bir ItemRarity enum’umuz olduğunu varsayalım. Bu enum’un Inspector’da farklı renklerde görünmesini sağlayabiliriz.
// 1. Adım: PropertyAttribute'ı Tanımla
using UnityEngine;
public class ColoredRarityAttribute : PropertyAttribute
{
public Color commonColor = Color.white;
public Color uncommonColor = Color.green;
public Color rareColor = Color.blue;
public Color epicColor = Color.magenta;
public Color legendaryColor = Color.yellow;
}
// 2. Adım: PropertyDrawer Sınıfını Oluştur
using UnityEditor;
using UnityEngine;
[CustomPropertyDrawer(typeof(ColoredRarityAttribute))]
public class ColoredRarityDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
// Attribute'a erişim
ColoredRarityAttribute coloredRarity = (ColoredRarityAttribute)attribute;
// Enum değerini al
int rarityValue = property.enumValueIndex;
// Enum'a göre renk seçimi
Color originalColor = GUI.color;
switch (rarityValue)
{
case 0: // Common
GUI.color = coloredRarity.commonColor;
break;
case 1: // Uncommon
GUI.color = coloredRarity.uncommonColor;
break;
case 2: // Rare
GUI.color = coloredRarity.rareColor;
break;
case 3: // Epic
GUI.color = coloredRarity.epicColor;
break;
case 4: // Legendary
GUI.color = coloredRarity.legendaryColor;
break;
default:
GUI.color = originalColor;
break;
}
// Varsayılan Inspector kontrolünü çiz
EditorGUI.PropertyField(position, property, label);
// Rengi orijinaline geri döndür
GUI.color = originalColor;
}
}
Kullanım:
public enum ItemRarity { Common, Uncommon, Rare, Epic, Legendary }
public class ItemData : MonoBehaviour
{
[ColoredRarity]
public ItemRarity itemRarity;
public string itemName;
public int itemLevel;
}
Bu örnekte, ItemRarity enum’unun Inspector’da seçilen nadirlik derecesine göre farklı renklerde görünmesini sağladık. Property Drawer’lar, çok daha karmaşık özel veri tiplerini veya tekil field’ları özelleştirmek için kullanılabilir.
Custom Inspector Nedir ve Nasıl Kullanılır?
Property Drawer’lar tekil değişkenler için harikayken, Custom Inspector’lar bir MonoBehaviour veya ScriptableObject’in tüm Inspector görünümünü baştan sona kontrol etmenizi sağlar. Bu, birden fazla değişkeni ve bunların etkileşimlerini yönetmek istediğinizde idealdir.
Custom Inspector Oluşturma Adımları
Bir Custom Inspector oluşturmak için şunlara ihtiyacınız vardır:
[CustomEditor]Nitelik: Hangi bileşen veya ScriptableObject için Inspector oluşturacağınızı belirtir.- Editor Sınıfı:
UnityEditor.Editorsınıfından türeyen veOnInspectorGUI()metodunu geçersiz kılan ana sınıf.
Örnek Senaryo: Bir karakterin sağlık, mana ve dayanıklılık gibi özelliklerini yöneten bir PlayerStats bileşenimiz olduğunu varsayalım. Bu bileşenin Inspector’ında bu değerleri görsel olarak daha iyi sunmak ve belki de özel bir buton eklemek isteyebiliriz.
// Hedeflenen MonoBehaviour sınıfı
using UnityEngine;
public class PlayerStats : MonoBehaviour
{
public int health = 100;
public int maxHealth = 100;
public int mana = 50;
public int maxMana = 50;
public int stamina = 75;
public int maxStamina = 75;
public void ResetStats()
{
health = maxHealth;
mana = maxMana;
stamina = maxStamina;
Debug.Log("Stats resetlendi!");
}
}
// Custom Inspector sınıfı
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(PlayerStats))]
public class PlayerStatsEditor : Editor
{
public override void OnInspectorGUI()
{
// Hedef nesnemizi al
PlayerStats playerStats = (PlayerStats)target;
// Değişiklikleri takip etmeye başla
EditorGUI.BeginChangeCheck();
EditorGUILayout.LabelField("Karakter İstatistikleri", EditorStyles.boldHeader);
// Health
playerStats.health = EditorGUILayout.IntSlider("Can", playerStats.health, 0, playerStats.maxHealth);
playerStats.maxHealth = EditorGUILayout.IntField("Maksimum Can", playerStats.maxHealth);
EditorGUILayout.Space(10); // Boşluk bırak
// Mana
playerStats.mana = EditorGUILayout.IntSlider("Mana", playerStats.mana, 0, playerStats.maxMana);
playerStats.maxMana = EditorGUILayout.IntField("Maksimum Mana", playerStats.maxMana);
EditorGUILayout.Space(10); // Boşluk bırak
// Stamina
playerStats.stamina = EditorGUILayout.IntSlider("Dayanıklılık", playerStats.stamina, 0, playerStats.maxStamina);
playerStats.maxStamina = EditorGUILayout.IntField("Maksimum Dayanıklılık", playerStats.maxStamina);
EditorGUILayout.Space(20); // Daha fazla boşluk
// Buton ekle
if (GUILayout.Button("İstatistikleri Sıfırla"))
{
playerStats.ResetStats();
}
// Eğer Inspector'da bir değişiklik yapıldıysa, Unity'ye bildir.
// Bu, Undo/Redo sistemi ve Prefab override'ları için önemlidir.
if (EditorGUI.EndChangeCheck())
{
EditorUtility.SetDirty(playerStats);
}
}
}
Bu Custom Inspector, PlayerStats bileşeninin değerlerini daha görsel bir şekilde sunar (slider’lar ile) ve istatistikleri sıfırlamak için bir buton ekler. EditorGUILayout ve EditorGUI sınıfları, Inspector içinde çeşitli UI elemanlarını çizmek için kullanılır.
Pratik Uygulama Örnekleri
Custom Inspector’lar ve Property Drawer’lar ile yapabilecekleriniz neredeyse sınırsızdır. İşte bazı popüler kullanım senaryoları:
Renkli Başlıklar ve Ayırıcılar
Inspector’unuzu daha okunabilir hale getirmek için özel başlıklar veya görsel ayırıcılar ekleyebilirsiniz. Örneğin, farklı ayar gruplarını ayırmak için kalın başlıklı etiketler veya yatay çizgiler kullanabilirsiniz. Bu, özellikle çok sayıda ayarı olan bileşenlerde gezinmeyi kolaylaştırır.
Dinamik Alanlar
Bir değişkenin değeri başka bir değişkenin görünürlüğünü veya etkileşimini etkileyebilir. Örneğin, bir “UseCustomValue” (Özel Değer Kullan) onay kutusu işaretlendiğinde özel bir değer giriş alanını gösterebilir veya gizleyebilirsiniz. Bu tür dinamik UI elemanları, kullanıcıların yalnızca ilgili ayarları görmesini sağlayarak karmaşıklığı azaltır.
Sonuç
Unity’de Custom Inspector’lar ve Property Drawer’lar, geliştirme araçlarınızı kişiselleştirmeniz ve iş akışınızı önemli ölçüde iyileştirmeniz için vazgeçilmez mekanizmalardır. Karmaşık veri yapılarını daha anlaşılır hale getirmekten, geliştiricilere özel etkileşimli araçlar sunmaya kadar birçok alanda size avantaj sağlarlar. Bu araçları kullanarak projelerinizin kalitesini artırabilir, ekip üyelerinin verimliliğini yükseltebilir ve Unity editör deneyiminizi tam anlamıyla kontrol altına alabilirsiniz. Kendi özel Inspector’larınızı ve Property Drawer’larınızı tasarlayarak Unity geliştirme serüveninizde yeni bir boyut keşfetmeye başlayın!



