Menu
CoddyTech

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.

challenge icon

Görev

Orta

Oyuncunun ayarlarını bir veri varlığına taşı.

  1. HeroData.cs içinde, public string heroName, float moveSpeed ve Color color içeren public class HeroData : ScriptableObject yaz.
  2. [CreateAssetMenu(menuName = "Heroes/Hero Data")] ifadesini bir üst satıra ekle.
  3. Hero.cs içinde, üç alanı public HeroData data; ile değiştir ve bunun yerine data.heroName, data.moveSpeed ve data.color değ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

Kendi başına pratik yap: Unity playground