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.
Tantangan
SedangPindahkan pengaturan hero ke dalam aset data.
- Di
HeroData.cs, tulispublic class HeroData : ScriptableObjectdenganstring heroName,float moveSpeed, danColor coloryang bersifat publik. - Letakkan
[CreateAssetMenu(menuName = "Heroes/Hero Data")]pada baris di atasnya. - Di
Hero.cs, ganti ketiga field denganpublic HeroData data;, lalu gunakandata.heroName,data.moveSpeed, dandata.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
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja BersamaRangkuman: Turret ModularRangkuman: Meriam Kembar4Data yang Diserialisasi
Class yang Dapat DiserialisasiList di InspectorEnum di InspectorRangkuman: Tabel LootRangkuman: Acak Loot2Antarmuka di Unity
IDamageableAntarmuka dan TryGetComponentGetComponentsRingkasan: Tombol InteractRingkasan: Terdekat dalam Jangkauan5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaSelamatkan AnginGelombang sebagai DataRekap: database ItemBeli dari Toko8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearestLatihan sendiri: Playground Unity