Menu
CoddyTech

Klasy serializowalne

Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 18 z 64.

Skrypt z wieloma ustawieniami wyświetla w Inspectorze długą, płaską listę. Zwykła klasa C# może je pogrupować: oznacz ją atrybutem [System.Serializable], a pole tej klasy będzie wyświetlane jako rozwijana sekcja nazwana tak jak pole, zawierająca pola klasy. Jedna klasa może służyć kilku polom i kilku skryptom:

[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 wyświetla dwie rozwijane sekcje: Normal i Enraged, każda z polami Speed i Damage. Każdy obiekt Enemy ma własne dwa obiekty Stats, których wartości ustawiasz w jego Inspectorze, a w kodzie odczytujesz je jako normal.speed. Unity tworzy te obiekty podczas ładowania skryptu, więc normal nigdy nie ma wartości null, nawet bez = new Stats(), a wartości inicjalizatorów pól (2 i 10) są wartościami początkowymi nowego obiektu Enemy. Struktura działa tak samo z tym atrybutem: [System.Serializable] public struct Range { public float min; public float max; }, a tak jak Vector3 jest kopiowana przy przypisaniu.

Atrybut jest potrzebny, ponieważ Unity zapisuje tylko te typy, które mu wskażesz. Bez niego klasa jest niewidoczna w Inspectorze: nie ma rozwijanej sekcji, ustawione tam wartości nie są zapisywane, a Unity nie tworzy obiektu, więc normal.speed powoduje wyjątek NullReferenceException. Wewnątrz klasy obowiązują zwykłe zasady Inspectora: pola publiczne albo prywatne pola oznaczone atrybutem [SerializeField], nigdy właściwości ani pola statyczne.

challenge icon

Wyzwanie

Łatwy

Zgrupuj ustawienia każdej wiązki w jednej strukturze.

  1. Nad Flashlight zadeklaruj public struct Beam z publicznymi polami Color color, float range i float angle. Oznacz ją jako [System.Serializable], aby była widoczna w Inspectorze.
  2. Zastąp sześć oddzielnych pól deklaracjami public Beam wide; i public Beam focused;.
  3. W Apply() ustaw trzy wartości światła na podstawie focusedOn ? focused : wide.

Naciśnij „Graj” i spację: wiązka dosięgnie kryształu. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

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

Wszystkie lekcje w sekcji Architektura gier w Unity

Poćwicz samodzielnie: Edytor online Unity