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.
Wyzwanie
ŁatwyZgrupuj ustawienia każdej wiązki w jednej strukturze.
- Nad
Flashlightzadeklarujpublic struct Beamz publicznymi polamiColor color,float rangeifloat angle. Oznacz ją jako[System.Serializable], aby była widoczna w Inspectorze. - Zastąp sześć oddzielnych pól deklaracjami
public Beam wide;ipublic Beam focused;. - W
Apply()ustaw trzy wartości światła na podstawiefocusedOn ? 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
1Komponenty, nie hierarchie
Małe komponentyBazowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPowtórka: modułowa wieżyczkaPowtórka: podwójne działo4Dane serializowane
Klasy serializowalneListy w InspectorzeEnumy w InspectorzePodsumowanie: tabela łupówPodsumowanie: losowanie łupów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPowtórka: klawisz interakcjiPowtórka: najbliższy w zasięgu5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaOcal wiatrFale jako danePowtórka: Baza przedmiotówPowtórka: Kupowanie w sklepie8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearestPoćwicz samodzielnie: Edytor online Unity