Class yang Dapat Diserialisasi
Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 18 dari 64.
Skrip dengan banyak pengaturan akan menampilkan daftar panjang yang datar di Inspector. Class C# biasa dapat mengelompokkan pengaturan tersebut: beri tanda [System.Serializable], lalu field dari class itu akan ditampilkan sebagai panel lipat bernama sesuai field tersebut, dengan field-field class di dalamnya. Satu class dapat digunakan untuk beberapa field dan beberapa skrip:
[System.Serializable]
public class Stats
{
public float speed = 2f;
public int damage = 10;
}
public class Enemy : MonoBehaviour
{
public Stats normal;
public Stats enraged;
private Stats current;
void Start()
{
current = normal;
}
void Update()
{
transform.Translate(0f, 0f, current.speed * Time.deltaTime);
}
public void Enrage()
{
current = enraged;
}
}Inspector menampilkan dua panel lipat, Normal dan Enraged, masing-masing dengan Speed dan Damage. Setiap Enemy memiliki dua objek Stats sendiri, yang nilainya diisi di Inspectornya sendiri, dan kode membacanya sebagai normal.speed. Unity membuat objek-objek ini saat memuat skrip, jadi normal tidak pernah null meski tanpa = new Stats(), dan nilai awal field (2 dan 10) adalah nilai awal untuk Enemy baru. struct bekerja dengan cara yang sama menggunakan atribut tersebut, [System.Serializable] public struct Range { public float min; public float max; }, dan seperti Vector3, nilainya disalin saat ditetapkan.
Atribut ini diperlukan karena Unity hanya menyimpan tipe yang diberi tahu untuk disimpan. Tanpanya, class tidak terlihat di Inspector: tidak ada panel lipat, nilai yang diatur di sana tidak disimpan, dan Unity tidak membuat objeknya, sehingga normal.speed memunculkan NullReferenceException. Di dalam class, aturan Inspector yang biasa tetap berlaku: field publik atau field privat dengan [SerializeField], bukan property atau field static.
Tantangan
MudahKelompokkan pengaturan setiap sinar dalam satu struct.
- Di atas
Flashlight, deklarasikanpublic struct BeamdenganColor color,float range, danfloat angleyang bersifat public. Tandai dengan[System.Serializable]agar Inspector menampilkannya. - Ganti enam field terpisah dengan
public Beam wide;danpublic Beam focused;. - Di
Apply(), atur tiga nilai lampu darifocusedOn ? focused : wide.
Tekan tombol “Main” lalu Space: sinarnya mencapai kristal. Kemudian tekan tombol “Periksa”.
Coba sendiri
using UnityEngine;
using UnityEngine.InputSystem;
public class Flashlight : MonoBehaviour
{
public Color wideColor = Color.white;
public float wideRange = 5f;
public float wideAngle = 60f;
public Color focusedColor = Color.white;
public float focusedRange = 10f;
public float focusedAngle = 30f;
private bool focusedOn;
private Light lamp;
void Start()
{
lamp = GetComponent<Light>();
Apply();
}
void Update()
{
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
focusedOn = !focusedOn;
Apply();
}
}
void Apply()
{
lamp.color = focusedOn ? focusedColor : wideColor;
lamp.range = focusedOn ? focusedRange : wideRange;
lamp.spotAngle = focusedOn ? focusedAngle : wideAngle;
}
}
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