Unıty ScriptableObject Nedir ?

Sosyal medyada paylaşın

ScriptableObject, sınıf örneklerinden bağımsız olarak büyük miktarda veriyi kaydetmek için kullanabileceğiniz bir veri kabıdır. ScriptableObject‘in ana kullanım durumlarından biri, değerlerin kopyalarından kaçınarak projenizin bellek kullanımını azaltmaktır. Inspector’den ScriptableObject‘e varlık olarak kaydettiğiniz veriler diske yazılır ve bu nedenle oturumlar arasında kalıcıdır.

https://docs.unity3d.com/Manual/class-ScriptableObject.html

Unity Dökümantasyonundan yapılan alıntıdan anlaşılacağı üzere ScriptableObject bellek kullanımını azaltır, tek bir noktadan kontrol sağlandığı için kullanım kolaylığı ve yönetilebilirlik sağlar. ScriptableObject‘de Unity nesnesinden üretilir fakat MonoBehaviour’un aksine herhangi bir objeye iliştirilemez, projenize varlık (assest) olarak kaydetmeniz gerekir. Prefab veya script içerisindeki verileri depolar, yani ScriptableObject varlığına sahnenizdeki herhangi bir objeyi prefab haline getirmeden referans olarak atayamazsınız.

Örneğin aşağıdaki class’a göz atalım.

public class Example : MonoBehaviour
{
   
    public bool groundedPlayer;
    public float playerSpeed = 2.0f;
    public float jumpHeight = 1.0f;
    public float gravityValue = -9.81f;
}

Bu class’ı sahnede 10 farklı objeye atarsak değerler 10 farklı birbirinden bağımsız değerlere dönüşür, birinin değişmesi diğerini etkilemez çünkü bellekte farklı klon değer konumdadır. Bu yüzdende daha fazla alan kaplar.

Projemizde birçok yerde kullanacağımız değerler var ise ScriptableObject kullanmak en mantıklı yol olacaktır. Belki benim gibi aklınıza ScriptableObject’in const“dan farkı ne diye gelmiştir, eğer öyleyse o soruyu da cevaplayayım 🙂 ScriptableObject Editör veya Oyun içindeyken depoladığı verileri değiştirebilmeyi destekliyor, const’da ise böyle bir durum yoktu başta ne belirlediyseniz daha sonradan değişebilme yetkiniz olmuyordu.

Const hakkındaki yazıma gitmek için buraya tıklayabilirsiniz.

ScriptableObject Oluşturmak

Öncelikle normal class oluşturup Mono yerine ScriptableObject’den miras almamız gerekiyor. Sınıftan özel varlık oluşturmayı kolaylaştırmak için CreateAssestMenu özniteliğini kullanabilirsiniz.

using UnityEngine;

[CreateAssetMenu(fileName = "Data", menuName = "ScriptableObjects/ExampleScriptableObject")]
public class ScriptableObjectExample : ScriptableObject
{
    public float speed;
    public int number;
    public Transform[] transforms;
    public GameObject obj;
}

Daha sonrasında ScriptableObject’ten varlık oluşturup kullanabilmeniz için Project>Create>ScriptableObject>ExampleScriptableObject yolunu izlemelisiniz. Artık her şey hazır 🙂 Inspector’den değerleri düzenleyebilirsiniz.

ScriptableObject Kullanımı:

ScriptableObject’i kullanmak istediğiniz class’da tanımlama yapıp erişebilirsiniz.

    public ScriptableObjectExample scriptableObjectExample;
    private void Awake()
    {
        Debug.Log(scriptableObjectExample.number);
    }

Umarım anlatabilmişimdir, iyi çalışmalar.