Kafayı yiyecektim arkadaşlar. Yeni bir oyun prototipi üzerinde çalışıyordum ve karakterler, düşmanlar, silahlar için tonla ayar yapmam gerekiyordu. İlk refleks, her şeyi JSON ya da ScriptableObject olmadan önce düşündüğüm gibi, hard-code'lamak ya da ayrı text dosyalarına yazmaktı. "Şu değeri değiştireyim" dediğimde, oyunu durdur, kodu değiştir, build al, test et... Bu döngüden çıkamıyordum. Bir değişiklik için dakikalar harcıyordum. Şaka gibi!
Sonra, "ya şu ScriptableObject denen şeyi bir deneyeyim" dedim. Meğerse hayat kurtarıcıymış! Artık verilerimi asset olarak projede tutabiliyordum. Bir EnemySO scriptable object'im var diyelim:
C#:
public class EnemySO : ScriptableObject
{
public string enemyName;
public int health;
public float speed;
public GameObject prefab;
}
Unity Editor'ünde sağ tık -> Create -> EnemySO. İşte! Yeni bir düşman asset'im oldu. Değerlerini Inspector'dan değiştiriyorum, anında oyuna yansıyor. Üstelik bu asset'i istediğim scripte referans olarak sürükleyip bırakabiliyorum. Kodda hiçbir şey değiştirmeden, sadece bu asset'in değerlerini oynayarak balance tuning yapmak mümkün. Aklım almıyordu, neden daha önce bu kadar yoğun kullanmamışım?
Tabii her gülün dikeni var. Runtime'da ScriptableObject değerlerini değiştirirseniz, bu değişiklikler editörde KALICI olur (Play Mode'dan çıkınca da kalır). Bu bana bir iki kere oyunu bozmuştu. Çözümü, runtime'da değişmesi gereken veriler için ScriptableObject'ten bir kopya oluşturmak ya da başka bir data container kullanmakta. Bir de çok fazla asset oluşturursanız, proje klasörü biraz dağınık olabilir, iyi bir klasörleme şart.
Kısacası, ScriptableObject'ler, özellikle oyun tasarım verileri, ayarlar (settings) ve global event'lar için inanılmaz bir güç. Config dosyaları ile uğraşırken kaybettiğim saatleri düşündükçe... Of, ya! Eğer siz de Unity'de veri yönetimi konusunda kendinizi text dosyalarına veya sonsuz public değişkenlere gömülmüş buluyorsanız, kesinlikle bu canavara bir şans verin.
Peki ya siz? ScriptableObject'leri nasıl kullanıyorsunuz? Hiç "keşke daha erke başlasaydım" dediğiniz bir Unity özelliği oldu mu? Yoksa runtime değişikliği konusunda sizi de yakan oldu mu? Yorumlara yazın, birlikte isyan edelim!