Menu
CoddyTech

Veri Varlıkları

Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 19 / 50.

Bir çiftlik oyununda havuçlar ve balkabakları yetişir. Bir havucun yetişmesi 30 saniye sürer ve 5 madeni paraya satılır; bir balkabağının yetişmesi 90 saniye sürer ve 40 madeni paraya satılır. Bu sayılar tek bir bitkiye değil, ürüne aittir: Plant betiğinde Inspector alanları olarak tutulduklarında, her sahnedeki her havuç kendi 30 ve 5 kopyasını taşır ve bir değişiklik yapmak hepsini bulmayı gerektirir. ScriptableObject, bu tür verileri bir varlıkta tutar; bu, projedeki istediğiniz sayıda nesnenin referans verebileceğ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 penceresindeki Create menüsüne ekler. Project penceresinde sağ tıklayın, Create > Farm > Plant Data'yı seçin; Unity, NewPlant adlı bir varlık oluşturur. Adını Carrot olarak değiştirin, varlığı seçin ve Inspector'daki alanlarına Carrot, 30 ve 5 değerlerini yazın. Pumpkin varlığı da aynı şekilde oluşturulur. MonoBehaviour'da olduğu gibi sınıf, kendi adını taşıyan PlantData.cs dosyasında yer alır.

Davranış, varlığın türünde bir alanı olan MonoBehaviour'da kalır. Carrot varlığını bu alana sürükleyin; 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 ve hiçbir sahnede yer almaz. Transform'u yoktur ve Unity, Update ya da Start yöntemlerini hiçbir zaman çağırmaz: verileri tutar, Plant ise davranışı tutar. 200 havuç aynı Carrot varlığına referans verdiğinde, growTime değerini 25 yapmak 200'ünün de değerini değiştirir. Kodda bir örnek ScriptableObject.CreateInstance<PlantData>() ile oluşturulur; asla new ile oluşturulmaz.

challenge icon

Görev

Orta

Hero, oklarla arenada yürür. Adı, hızı ve rengi Hero betiğinin alanlarıdır ve her yeni kahraman bunları yeniden kopyalar. Bunları bir varlığa taşı:

  • HeroData.cs içinde, public alanları heroName (bir string), moveSpeed (bir float) ve color (bir Color) olan bir ScriptableObject olan HeroData'yı yaz. Menü adı Heroes/Hero Data olacak şekilde ona [CreateAssetMenu] ekle.
  • Hero.cs içinde, üç alanı HeroData türünde tek bir public data alanıyla değiştir ve betiğin kendi değerlerini kullandığı yerlerde varlığın değerlerini kullan.

Projede, bu menüyle oluşturulmuş bir Knight varlığı (Knight, hız 3, kırmızı) bulunuyor ve Inspector bunu Hero'nun data alanına yerleştiriyor. Play'e basıp Knight'ı etrafta yürüt, ardından Check'e tıkla.

Kendin dene

using UnityEngine;

// HeroData: kahramanın adı, hızı ve rengi, bir ScriptableObject olarak
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Unity'de Oyun Mimarisi bölümündeki tüm dersler