Menu
CoddyTech

Aset Data

Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 19 dari 50.

Sebuah game pertanian menumbuhkan wortel dan labu. Wortel tumbuh selama 30 detik dan dijual seharga 5 koin, sedangkan labu tumbuh selama 90 detik dan dijual seharga 40 koin. Angka-angka tersebut berlaku untuk tanaman, bukan untuk satu tanaman individual: sebagai field Inspector pada skrip Plant, setiap wortel di setiap scene menyimpan salinan 30 dan 5 miliknya sendiri, dan untuk mengubahnya kamu harus menemukan semuanya. ScriptableObject menyimpan data seperti ini dalam sebuah asset, yaitu file di proyek yang dapat dirujuk oleh sejumlah object. 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 tersebut, lalu masukkan Carrot, 30, dan 5 ke field-nya di Inspector. Asset Pumpkin dibuat dengan cara yang sama. Class tersebut disimpan dalam file yang namanya sama dengan class, yaitu PlantData.cs, seperti halnya MonoBehaviour.

Perilakunya tetap berada dalam MonoBehaviour yang memiliki field bertipe asset tersebut. Seret asset Carrot ke field itu, lalu skrip 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 mana pun maupun di scene mana pun. ScriptableObject tidak memiliki Transform, dan Unity tidak pernah memanggil Update atau Start miliknya: ScriptableObject menyimpan data, sedangkan Plant menyimpan perilakunya. Saat 200 wortel merujuk ke satu asset Carrot, mengatur growTime-nya menjadi 25 akan mengubah nilai untuk semua 200 wortel. Dalam kode, sebuah instance dibuat dengan ScriptableObject.CreateInstance<PlantData>(), bukan dengan new.

challenge icon

Tantangan

Sedang

Hero berjalan di arena menggunakan tombol panah. Nama, kecepatan, dan warnanya adalah field dalam script Hero, dan setiap hero baru akan menyalinnya lagi. Pindahkan semuanya ke dalam asset:

  • Di HeroData.cs, tulis HeroData, sebuah ScriptableObject dengan field publik heroName (sebuah string), moveSpeed (sebuah float), dan color (sebuah Color). Berikan [CreateAssetMenu] dengan nama menu Heroes/Hero Data.
  • Di Hero.cs, ganti ketiga field dengan satu field publik data bertipe HeroData, lalu gunakan nilai dari asset di bagian yang sebelumnya menggunakan nilai milik script itu sendiri.

Proyek ini memiliki asset Knight yang dibuat menggunakan menu tersebut (Knight, kecepatan 3, merah), dan Inspector menempatkannya di field data milik Hero. Tekan Play dan gerakkan Knight berkeliling, lalu tekan Check.

Coba sendiri

using UnityEngine;

// HeroData: nama, kecepatan, dan warna pahlawan sebagai ScriptableObject
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Arsitektur Game di Unity