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.
Sfida
FacileRaggruppa le impostazioni di ciascun fascio in una struct.
- Sopra
Flashlight, dichiarapublic struct BeamconColor color,float rangeefloat anglepubblici. Contrassegnala con[System.Serializable]così che l'Inspector la mostri. - Sostituisci i sei campi separati con
public Beam wide;epublic Beam focused;. - In
Apply(), imposta i tre valori della luce usandofocusedOn ? 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
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRipasso: torretta modulareRipasso: cannone doppio4Dati serializzati
Classi serializzabiliElenchi nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottinoRiepilogo: tira il bottino2Interfacce in Unity
IDamageableInterfacce e TryGetComponentGetComponentsRiepilogo: tasto InteragisciRiepilogo: il più vicino a portata5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseSalva il ventoOnde come datiRiepilogo: database degli oggettiRiepilogo: comprare dal negozioEsercitati da solo: Playground Unity