Unity Attributes – Inspector Kullanımını Kolaylaştıran 8 Özellik

Unity Attributes, kod yazmamızı kolaylaştıran ve inspector’e görsel olarak iyileştirme yapabildiğimiz özelliklerdir. Genellikle, Inspector aracılığı ile atama yapmak, stringleri koda dokunmadan kolayca doldurabilmek, daha düzenli bir inspector kullanabilmek ve test sürecini hızlandırmak amacıyla kullanılır. Bir değişkene, methoda veya tüm sınıfa uygulanabilir. Böylece daha hızlı ve esnek kod yazmamızı sağlar.

Örneğin, bir float değerini slider yardımıyla değiştirmemizi sağlayarak float değerini sınırlandırmamızı ve ekip arkadaşlarımıza daha esnek & kolay bir düzenleme aracı oluşturmamızı sağlar. Şimdi bahsettiğimiz bu özellikleri daha detaylı inceleyelim.

1. Header

    public class Hero : MonoBehaviour
    {
        public int strength;
        public int agility;
        public int intelligence;

        public GameObject swordPrefab;
        public GameObject shieldPrefab;
    }

Sınıfımızda inspector’de görünecek şekilde değişkenler tanımladığımızda hepsini bir arada görürüz. Fakat birçok değişkene sahip olan bir sınıfta bu karmaşıklığa yol açabilir ve sürecimizi yavaşlatabilir. Header kullanarak değişkenleri gruplayıp daha güzel & temiz bir görünüme sahip olabiliriz.

Üstte gördüğümüz üzere kahramanımız çeşitli statlara ve giyebileceği kılıç ve kalkan referansına sahip. Header kullanmadan bunlar inspector’de şu şekilde görünür:

Şimdi header kullanalım:

    public class Hero : MonoBehaviour
    {
        [Header("Stats")]
        public int strength;
        public int agility;
        public int intelligence;

        [Header("References")]
        public GameObject swordPrefab;
        public GameObject shieldPrefab;
    }

Gerekli değişkenlerin üstüne bir Header özelliği ekledik ve string olarak buna bir isim verdik. Gerekli değişkenler bir başlık altında toplandı ve temiz görünüme sahip oldu. Inspector’de görüntüsü şu şekilde oldu:

2. Range

Range özelliği, belirtilen değişkeni verilen aralıklarda slider şeklinde düzenlememizi sağlar. Böylece slider aracılığıyla değişkenleri hızlıca değiştirip test edebilir ve taşmaları engelleyebiliriz. Örnek kodda moveSpeed değişkeni inspector aracılığıyla sadece 1 ve 20 arasında değiştirilebilir:

    public class Hero : MonoBehaviour
    {
        [Range(1,20)]
        public int moveSpeed;
    }

3. Space

Space özelliği, belirlenen header arasında veya belirlenen değişken arasında boşluk bırakmamızı sağlar.

public class Hero : MonoBehaviour
    {
        [Header("Stats")]
        public int strength;
        public int agility;
        public int intelligence;
        
        [Header("References")]
        [Space(50)]
        public GameObject swordPrefab;

    }

4. Tooltip

Tooltip özelliği, eklediğimiz değişkenin üzerine geldiğimizde açıklama göstermesini sağlayan bir attribute. Böylece değişkenin tam olarak ne işe yaradığını yazıp ileride hızlıca anlamak, hatırlamak veya dizayn ekibindeki arkadaşlarınıza gerekli açıklamalar eklemenizi sağlayabilir.

    public class Hero : MonoBehaviour
    {
        [Tooltip("Hey, this is for set the move speed of the character!")]
        public int moveSpeed;
    }

5. TextArea

TextArea özelliği, stringlerimizi daha kolay ve temiz düzenleyebileceğimiz bir text kutusu oluşturmamızı sağlar. Özellikle dialog ve açıklamalar eklediğimiz durumlarda tek string satırı işimiz görmeyebiliyor. Fakat TextArea özelliği ile istediğimiz genişlikte kutu oluşturup kolayca düzenleyebiliriz. Ayrıca Tooltip gibi sınıfı, methodu veya herhangi bir şeyi açıklamak için description alanı şeklinde de kullanılabilir. TextArea içinde belirttiğimiz ilk değişken minimum kaç satır olmalı, ikincisi ise maksimum kaç satır olmalıdır. Maksimum limitini geçtikten sonra kaydırma seçeneğimiz ortaya çıkar:

    public class Hero : MonoBehaviour
    {
        [TextArea(5,10)]
        public string description;
    }

6. SerializeField

SerializeField özelliği, private değişkenleri inspector’de açığa çıkartır. En popüler attribute’lardan biridir. Unity sadece public değişkenleri inspector’de gösterir. Fakat sadece inspectör’de görmek için public kullanmak iyi bir yöntem değildir. Daha iyi bir kod yazmak için en önemli noktalardan biri Encapsulation tekniğidir. Farklı bir sınıfın değişkenimize ulaşmasını istemezsek private olarak belirtiriz. Bu bağlamda private değişkeni editörde görmek için SerializeField kullanırız:

    public class Hero : MonoBehaviour
    {
        [SerializeField] private int moveSpeed;
        
        private int _attackSpeed;
    }

Bu bağlamda moveSpeed değişkenimiz inspector’de gözükecek fakat attackSpeed gözükmeyecektir.

7. ContextMenu

ContextMenu, belirtilen methodu scriptten tıklayarak doğrudan kullanmamızı sağlar. Test aşamasını inanılmaz hızlandırır. Şahsen en favori attribute’um olur kendisi. Belli başlı durumlarda method’un çalışmasını beklemek yerine oyun çalışrıken direkt olarak script aracılığıyla kodu çalıştırabiliriz:

    public class Hero : MonoBehaviour
    {
        [ContextMenu("Print the Text!")]
        private void Print()
        {
            Debug.Log("It's really working!");
        }
    }

Kullanımı da şu kadar basit:

8. RequireComponent

RequireComponent özelliği, belirlenen component’in direkt olarak script’in olduğu objeye eklenmesini ve silinmemesini sağlar. Örneğin 3 farklı objeye Enemy script’ini eklediğimizi varsayalım. Her birine tek tek Rigidbody component’i eklemek yerine gerekli script’e RequireComponent’i ekleyerek direkt oyun başladığında RigidBody’nin eklenmesini ve olası durumlarda silinmemesini sağlayabiliriz:

    [RequireComponent(typeof(Rigidbody))]
    public class Hero : MonoBehaviour
    {
    }

Gördüğümüz üzere Unity Attributes gerçekten çok kullanışlı ve proje sürecimizi hızlandıran bir özellik. Bunlara ek olarak Odin adlı asset yardımıyla hazırlanmış birçok özelliğe de ulaşabilirsiniz. Aklınıza dahi gelmeyen fakat çok kullanışlı özellikler de Odin tool’unda var. Şahsen kullanıyorum ve işimi çok görüyor.

Aşağıdaki linklerden Attribute’lar hakkında daha detaylı bilgi edinebilirsiniz:

https://medium.com/star-gazers/4-useful-unity-attributes-that-make-the-inspector-easier-to-use-part-1-d42b5b0b7543

https://tutorials.eu/unity-attributes-15-tipps-for-the-perfect-inspector-experience/#ftoc-heading-18