Veri Varlıkları
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 23 / 64.
Bir çiftlik oyununda havuçlar ve balkabakları yetişir. Bir havuç 30 saniyede yetişir ve 5 jetona satılır; bir balkabağı ise 90 saniyede yetişir ve 40 jetona satılır. Bu sayılar tek bir bitkiye değil, ürüne aittir: Bir Plant betiğinde Inspector alanları olarak tanımlandıklarında, her sahnedeki her havuç kendi 30 ve 5 kopyasını tutar ve değişiklik yapmak için bunların hepsini bulmak gerekir. Bir ScriptableObject, bunun gibi verileri bir varlıkta tutar; varlık, projede istediğin sayıda nesnenin başvurabileceği bir dosyadır. Sınıfı, MonoBehaviour yerine ScriptableObject sınıfından türetilir:
using UnityEngine;
[CreateAssetMenu(fileName = "NewPlant", menuName = "Farm/Plant Data")]
public class PlantData : ScriptableObject
{
public string plantName;
public float growTime;
public int sellPrice;
}[CreateAssetMenu], sınıfı Project penceresinin Create menüsüne ekler. Project penceresinde sağ tıklayıp Create > Farm > Plant Data'yı seç; Unity, NewPlant adlı bir varlık oluşturur. Bu varlığın adını Carrot olarak değiştir, seç ve Inspector'daki alanlarına Carrot, 30 ve 5 değerlerini yaz. Pumpkin varlığı da aynı şekilde oluşturulur. MonoBehaviour'da olduğu gibi, sınıf da kendi adını taşıyan PlantData.cs adlı bir dosyada bulunur.
Davranış, varlık türünde bir alanı olan bir MonoBehaviour'da kalır. Carrot varlığını bu alana sürükle; betik sayıları bu alan üzerinden okur:
public class Plant : MonoBehaviour
{
public PlantData data;
private float age;
void Update()
{
age += Time.deltaTime;
if (age >= data.growTime)
{
Debug.Log(data.plantName + " is ready, worth " + data.sellPrice);
enabled = false;
}
}
}Bir ScriptableObject hiçbir GameObject üzerinde bulunmaz ve hiçbir sahnede yer almaz. Transform'u yoktur ve Unity, onun Update ya da Start metodunu asla çağırmaz: O verileri tutar, Plant ise davranışı üstlenir. 200 havuç tek bir Carrot varlığına başvurduğunda, varlığın growTime değerini 25 yapmak 200 havucun tümünü değiştirir. Kodda bir örnek ScriptableObject.CreateInstance<PlantData>() ile oluşturulur; new ile asla oluşturulmaz.
Görev
OrtaOyuncunun ayarlarını bir veri varlığına taşı.
HeroData.csiçinde, publicstring heroName,float moveSpeedveColor coloriçerenpublic class HeroData : ScriptableObjectyaz.[CreateAssetMenu(menuName = "Heroes/Hero Data")]ifadesini bir üst satıra ekle.Hero.csiçinde, üç alanıpublic HeroData data;ile değiştir ve bunun yerinedata.heroName,data.moveSpeedvedata.colordeğerlerini oku.
“Oyna” düğmesine bas: kırmızı Şövalye 3 hızında yürür. Ardından “Kontrol et” düğmesine bas.
Kendin dene
using UnityEngine;
// HeroData: kahramanın adı, hızı ve rengi, bir ScriptableObject olarak
Unity'de Oyun Mimarisi bölümündeki tüm dersler
1Kalıtım Değil, Bileşenler
Küçük BileşenlerTemel Düşman Script'iSoyut BileşenlerBirlikte Çalışan BileşenlerTekrar: Modüler TaretTekrar: Çift Namlulu Top4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larTekrar: Ganimet TablosuTekrar: Ganimeti At2Unity'de Arayüzler
IDamageableArayüzler ve TryGetComponentGetComponentsÖzet: Etkileşim TuşuÖzet: Erişim Mesafesindeki En Yakın5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriOrtak AyarlarRüzgârı KaydetVeri Olarak DalgalarTekrar: Eşya VeritabanıTekrar: Dükkândan Satın Al8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearestKendi başına pratik yap: Unity playground