Menu
CoddyTech

Classi serializzabili

Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 15 di 50.

Uno script con molte impostazioni mostra nell'Inspector un lungo elenco piatto. 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 diversi campi e in diversi 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 neanche 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; }; come Vector3, viene copiata quando la assegni.

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 una 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

La torcia dell'esploratore ha due fasci e la barra spaziatrice alterna tra i due: un fascio ampio e caldo per guardarsi intorno e uno concentrato, bianco freddo, che raggiunge le profondità della caverna. Flashlight.cs conserva le tre impostazioni di ciascun fascio in sei campi separati. La scena è già configurata con le impostazioni raggruppate per fascio e lo script deve rispecchiarla:

  • Dichiara una struct Beam con tre campi pubblici: color (un Color), range e angle (float). Deve essere visibile nell'Inspector.
  • Sostituisci i sei campi separati con due campi Beam, wide e focused. La scena imposta wide su un colore caldo, con range 6 e angle 80, e focused su un bianco freddo, con range 15 e angle 25.
  • Fai in modo che Apply() legga il Beam del fascio attuale e imposti color, range e spotAngle della Light a partire da esso. Il resto rimane invariato: la torcia si avvia con il fascio ampio e la barra spaziatrice alterna i fasci.

Premi Play, premi la barra spaziatrice per illuminare l'estremità lontana della caverna, quindi Check.

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;
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Architettura dei giochi in Unity