Unity'de Editor Script (EditorWindow) Yazma

Ceza

Yarbay
Admin
Katılım
25 Kasım 2025
Mesajlar
882
Reaksiyon puanı
49

Neden Editor Script Kullanmalıyız?​


Unity projelerinde geliştirme süreci karmaşık ve tekrarlayıcı görevler içerebilir. Standart Unity arayüzü çoğu ihtiyacı karşılasa da, bazen projenin kendine özgü gereksinimleri için özel araçlara ihtiyaç duyarız. Editor Script'ler, özellikle EditorWindow sınıfı, bu noktada devreye girer. Geliştiricilerin iş akışını otomatize etmelerine, özel görselleştirme araçları oluşturmalarına veya belirli bir görevi hızlandırmak için özelleştirilmiş bir arayüz tasarlamalarına olanak tanır. Bu nedenle, ekiplerin verimliliğini artırmak ve hata olasılığını azaltmak için kritik öneme sahiptirler. Ek olarak, sanatçılar ve tasarımcılar için kullanımı kolay arayüzler sunarak onların teknik detaylarla uğraşmadan direkt olarak içerik üretimine odaklanmalarını sağlarlar. Sonuç olarak, projenin genel kalitesini ve hızını doğrudan etkileyen güçlü bir mekanizmadır.

EditorWindow Temelleri: İlk Pencerenizi Oluşturma​


Bir EditorWindow oluşturmak oldukça basit bir süreçle başlar. Öncelikle, projenizin "Assets" klasörü içinde bir "Editor" klasörü oluşturmalısınız. Editor script'leri bu klasörün içinde yer almalıdır, çünkü Unity bu klasördeki kodları yalnızca editör ortamında derler ve oyunun derlenmiş versiyonuna dahil etmez. Yeni bir C# script dosyası oluşturduktan sonra, onu `EditorWindow` sınıfından türetmelisiniz. Pencerenizi açmak için genellikle bir `MenuItem` kullanılır. `GetWindow<T>()` metodunu çağırarak pencerenizi başlatırsınız. Pencerenizin içeriğini oluşturmak için `OnGUI()` metodunu geçersiz kılmalısınız. Bu metodun içinde `GUILayout` veya `EditorGUILayout` kullanarak butonlar, metin alanları veya kaydırıcılar gibi GUI elemanlarını düzenleyebilirsiniz. Örneğin, basit bir metin etiketi eklemek için `GUILayout.Label("Merhaba Editor!");` yazmanız yeterlidir.

GUI Kontrolleri ve Düzenleri​


Unity EditorWindow'larda kullanıcı arayüzü elemanlarını düzenlemek için `GUILayout` ve `EditorGUILayout` sınıflarını kullanırız. Bu sınıflar, standart Unity UI elemanlarının editör versiyonlarını sunar ve arayüzü düzenlemek için çeşitli metotlar içerir. Örneğin, `EditorGUILayout.TextField` ile metin girişi alabilir, `EditorGUILayout.IntField` ile sayısal değerleri işleyebilir veya `EditorGUILayout.ObjectField` ile sahnedeki nesneleri veya asset'leri seçtirebilirsiniz. Daha karmaşık düzenler oluşturmak için `EditorGUILayout.BeginHorizontal()` ve `EditorGUILayout.BeginVertical()` gibi metotlar kullanarak elemanları yatay veya dikey olarak gruplayabilirsiniz. Bu, arayüzünüzün daha düzenli ve okunabilir olmasını sağlar. Bununla birlikte, kullanıcı deneyimini iyileştirmek için `EditorGUILayout.Space()` veya `EditorGUILayout.Separator()` gibi ayırıcıları kullanmak da oldukça faydalıdır. Doğru GUI kontrollerini seçmek ve onları mantıklı bir şekilde düzenlemek, özel aracınızın kullanışlılığını doğrudan etkiler.

Veri Yönetimi ve Kaydetme​


EditorWindow'ların en önemli yönlerinden biri, kullanıcı tarafından girilen veya oluşturulan verileri kalıcı olarak yönetebilmektir. Aksi takdirde, pencere kapatıldığında tüm değişiklikler kaybolur. Veri kaydetme ve yükleme için çeşitli yöntemler mevcuttur. Küçük çaplı ayarlar veya tercihler için `EditorPrefs` sınıfını kullanabilirsiniz; bu, anahtar-değer çiftleri şeklinde veri saklamanıza olanak tanır. Daha karmaşık ve yapılandırılmış veriler için `ScriptableObject` sınıfı idealdir. Kendi `ScriptableObject` sınıfınızı tanımlayarak, bunu bir asset dosyası olarak kaydedebilir ve projenizin bir parçası haline getirebilirsiniz. Bu, verilerinizi kolayca referans almanızı ve Unity editöründe görüntülemenizi sağlar. `AssetDatabase` sınıfı ise bu tür asset'leri oluşturmak, kaydetmek, yüklemek veya silmek için kullanılır. Başka bir deyişle, EditorWindow'unuzun ürettiği veya yönettiği bilgilerin Unity projenizle birlikte yaşaması için bu mekanizmaları doğru bir şekilde anlamak ve uygulamak şarttır.

Özel Inspector'lar ile Etkileşim​


EditorWindow'lar genellikle sahnedeki nesneler veya proje varlıkları ile etkileşim kurmak üzere tasarlanır. Bu etkileşim, seçili nesnenin bileşenlerini görüntülemek veya değiştirmek şeklinde olabilir. `Selection.activeGameObject` veya `Selection.activeObject` kullanarak o an editörde seçili olan nesneye veya varlığa erişebilirsiniz. Daha gelişmiş etkileşimler için `SerializedObject` ve `SerializedProperty` sınıfları devreye girer. Bu sınıflar, bir MonoBehaviour veya ScriptableObject üzerindeki değerleri güvenli ve geri alınabilir bir şekilde düzenlemenizi sağlar. Örneğin, bir EditorWindow içinden, seçili bir oyun nesnesinin bir script'indeki public bir değişkeni doğrudan değiştirebilir ve bu değişikliğin Unity'nin geri alma sistemine dahil olmasını sağlayabilirsiniz. Ek olarak, kendi `Custom Inspector`'ınızı yazdıysanız, EditorWindow'unuz bu Inspector ile entegre çalışarak daha güçlü ve kapsamlı araçlar ortaya çıkarabilir.

Performans ve Optimizasyon İpuçları​


EditorWindow'lar kullanışlı olsalar da, yanlış yazıldıklarında Unity editörünün performansını olumsuz etkileyebilirler. `OnGUI()` metodu saniyede birden çok kez çağrılabilir, bu nedenle içinde ağır hesaplamalar yapmaktan veya yoğun işlemler gerçekleştirmekten kaçınmak önemlidir. Büyük listeleri veya karmaşık grafikleri çiziyorsanız, sadece görünür olan kısımları çizmeye odaklanmalısınız. Sıkça kullanılan ve maliyetli olabilecek verileri önbelleğe almak, performansı önemli ölçüde artırabilir. Örneğin, bir veri setini her `OnGUI()` çağrısında yeniden yüklemek yerine, sadece değiştiğinde yükleyip önbellekte tutmak daha verimli olacaktır. Ayrıca, `Repaint()` metodunu yalnızca arayüzün gerçekten güncellenmesi gerektiğinde çağırmalısınız. Gereksiz `Repaint` çağrıları, editörün daha sık yeniden çizilmesine neden olarak tepki süresini yavaşlatabilir. Bununla birlikte, editörün donmasını engellemek için uzun süren işlemleri `EditorApplication.delayCall` ile bir sonraki editör güncellemesine ertelemeyi düşünebilirsiniz.

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


EditorWindow'lar sadece basit araçlar oluşturmakla kalmaz, aynı zamanda Unity'nin çekirdek işlevselliğini derinden genişleten gelişmiş senaryolarda da kullanılabilir. Örneğin, `MenuItem` özniteliği sadece pencere açmakla sınırlı değildir; aynı zamanda bağlam menüleri (Context Menus) oluşturarak belirli asset'lere veya oyun nesnelerine sağ tıkladığınızda özel seçenekler sunmanızı sağlar. Scene View içinde 3D çizimler yapmak için `Handles` sınıfını kullanabilirsiniz. Bu, oyun içi nesneleri düzenlemek için doğrudan sahne görünümünde görsel araçlar oluşturmanıza olanak tanır. Ayrıca, EditorWindow'lar ile asset işleme otomasyonu yapabilir, projenizdeki binlerce dosyanın belirli özelliklerini toplu olarak değiştirebilirsiniz. Sonuç olarak, bu gelişmiş teknikleri öğrenmek, Unity'de çok daha güçlü, kapsamlı ve projenize özel geliştirme ortamları yaratmanızı sağlar. Bu sayede, oyun geliştirme sürecinizi kişiselleştirebilir ve ekip verimliliğini üst düzeye çıkarabilirsiniz.
 
Bu konu hakkında çok kapsamlı ve faydalı bir derleme olmuş, eline sağlık! Editor Script'lerin sadece iş akışını otomatikleştirmekle kalmayıp, proje verimliliğini ve hatta sanatçı/tasarımcıların çalışma kolaylığını nasıl artırdığını çok güzel açıklamışsın.

Özellikle veri yönetimi ve performans ipuçları kısımları, bu tür araçlar geliştirirken sıkça karşılaşılan zorluklara güzel çözümler sunuyor. Bu detaylı paylaşımın birçok kişiye yol göstereceğine eminim, teşekkürler.
 
Geri
Üst Alt