Menu
CoddyTech

Classi serializzabili

Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 18 di 64.

Uno script con molte impostazioni mostra un lungo elenco piatto nell'Inspector. Una semplice classe C# può raggrupparle: contrassegnala con [System.Serializable] e un campo di quella classe verrà visualizzato come un riquadro espandibile con il nome del campo e i campi della classe al suo interno. Una classe può essere usata per più campi e in più script:

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

L'Inspector mostra due riquadri espandibili, Normal ed Enraged, ciascuno con Speed e Damage. Ogni Enemy ha i propri due oggetti Stats, compilati nel suo Inspector, e il codice li legge come normal.speed. Unity crea questi oggetti quando carica lo script, quindi normal non è mai null, nemmeno senza = new Stats(), e gli inizializzatori dei campi (2 e 10) sono i valori iniziali di un nuovo Enemy. Anche una struct funziona allo stesso modo con l'attributo: [System.Serializable] public struct Range { public float min; public float max; }; inoltre, come Vector3, viene copiata quando la si assegna.

L'attributo è necessario perché Unity salva solo i tipi per cui è stato configurato. Senza di esso, la classe è invisibile nell'Inspector: non c'è alcun riquadro espandibile, i valori impostati lì non vengono salvati e Unity non crea l'oggetto, quindi normal.speed genera un'eccezione NullReferenceException. All'interno della classe valgono le consuete regole dell'Inspector: campi pubblici o campi privati con [SerializeField], mai proprietà o campi statici.

challenge icon

Sfida

Facile

Raggruppa le impostazioni di ciascun fascio in una struct.

  1. Sopra Flashlight, dichiara public struct Beam con Color color, float range e float angle pubblici. Contrassegnala con [System.Serializable] così che l'Inspector la mostri.
  2. Sostituisci i sei campi separati con public Beam wide; e public Beam focused;.
  3. In Apply(), imposta i tre valori della luce usando focusedOn ? focused : wide.

Premi «Gioca» e poi la barra spaziatrice: il fascio raggiunge il cristallo. Poi premi «Verifica».

Provalo tu

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

Tutte le lezioni di Architettura dei giochi in Unity

Esercitati da solo: Playground Unity