Menu
CoddyTech

Aset Data

Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 23 dari 64.

Dalam game pertanian, wortel dan labu tumbuh. Wortel tumbuh selama 30 detik dan dijual seharga 5 koin, sedangkan labu tumbuh selama 90 detik dan dijual seharga 40 koin. Angka-angka itu milik tanaman, bukan satu tanaman tertentu: jika dijadikan field Inspector pada script Plant, setiap wortel di setiap scene menyimpan salinan 30 dan 5 miliknya sendiri, dan untuk mengubahnya, kamu harus mencari semuanya. ScriptableObject menyimpan data seperti ini dalam sebuah asset, yaitu file di proyek yang dapat dirujuk oleh objek sebanyak apa pun. Class-nya diturunkan dari ScriptableObject, bukan MonoBehaviour:

using UnityEngine;

[CreateAssetMenu(fileName = "NewPlant", menuName = "Farm/Plant Data")]
public class PlantData : ScriptableObject
{
    public string plantName;
    public float growTime;
    public int sellPrice;
}

[CreateAssetMenu] menambahkan class ke menu Create di jendela Project. Klik kanan di jendela Project, pilih Create > Farm > Plant Data, lalu Unity membuat asset bernama NewPlant; ganti namanya menjadi Carrot, pilih asset itu, lalu masukkan Carrot, 30, dan 5 ke field-nya di Inspector. Asset Pumpkin dibuat dengan cara yang sama. Class ini disimpan dalam file yang namanya sama, PlantData.cs, seperti halnya MonoBehaviour.

Perilakunya tetap berada dalam MonoBehaviour yang memiliki field dengan tipe asset tersebut. Seret asset Carrot ke field itu, lalu script membaca angka-angkanya melalui field tersebut:

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;
        }
    }
}

ScriptableObject tidak berada pada GameObject maupun di dalam scene. ScriptableObject tidak memiliki Transform, dan Unity tidak pernah memanggil Update atau Start miliknya: ScriptableObject menyimpan data, sedangkan Plant menyimpan perilakunya. Jika 200 wortel merujuk ke satu asset Carrot, mengubah growTime-nya menjadi 25 akan mengubah nilainya untuk semua 200 wortel. Dalam kode, instance dibuat dengan ScriptableObject.CreateInstance<PlantData>(), bukan dengan new.

challenge icon

Tantangan

Sedang

Pindahkan pengaturan hero ke dalam aset data.

  1. Di HeroData.cs, tulis public class HeroData : ScriptableObject dengan string heroName, float moveSpeed, dan Color color yang bersifat publik.
  2. Letakkan [CreateAssetMenu(menuName = "Heroes/Hero Data")] pada baris di atasnya.
  3. Di Hero.cs, ganti ketiga field dengan public HeroData data;, lalu gunakan data.heroName, data.moveSpeed, dan data.color.

Tekan tombol “Main”: Knight merah berjalan dengan kecepatan 3. Lalu tekan tombol “Periksa”.

Coba sendiri

using UnityEngine;

// HeroData: nama, kecepatan, dan warna pahlawan sebagai ScriptableObject

Semua pelajaran di Arsitektur Game di Unity

Latihan sendiri: Playground Unity