Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Kelompokkan pengaturan setiap sinar dalam satu struct.

  1. Di atas Flashlight, deklarasikan public struct Beam dengan Color color, float range, dan float angle yang bersifat public. Tandai dengan [System.Serializable] agar Inspector menampilkannya.
  2. Ganti enam field terpisah dengan public Beam wide; dan public Beam focused;.
  3. Di Apply(), atur tiga nilai lampu dari focusedOn ? 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

Latihan sendiri: Playground Unity