Enum nell'Inspector
Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 20 di 64.
Un campo enum appare nell'Inspector come menu a discesa, il che lo rende un modo pratico per configurare oggetti che condividono uno script. Un prefab Pickup è sufficiente per monete, cuori e scudi: ogni copia nel livello ottiene il proprio tipo dal menu a discesa e lo script lo usa per scegliere cosa fare:
public enum PickupKind { Coin, Heart, Shield }
public class Pickup : MonoBehaviour
{
public PickupKind kind;
public int amount = 1;
void OnTriggerEnter(Collider other)
{
if (!other.TryGetComponent(out PlayerStats stats)) return;
switch (kind)
{
case PickupKind.Coin: stats.coins += amount; break;
case PickupKind.Heart: stats.hp += amount; break;
case PickupKind.Shield: stats.shielded = true; break;
}
Destroy(gameObject);
}
}La scena salva ogni scelta come il numero del valore: Coin è 0, Heart 1, Shield 2. Aggiungere un valore alla fine è sicuro. Inserirne uno all'inizio, come in { Gem, Coin, Heart, Shield }, sposta tutti i numeri e cambia il tipo di ogni pickup in tutte le scene. Rinominare un valore è sicuro, poiché il suo numero rimane invariato. Scrivere i numeri esplicitamente, Coin = 0, Heart = 1, Shield = 2, ti permette in seguito di riordinare i nomi senza spostare nessuna scelta salvata.
Un enum [System.Flags] contiene più valori contemporaneamente. Il suo menu a discesa mostra una casella da spuntare per ogni valore, oltre a Nothing e Everything. Ogni valore deve avere un bit proprio, quindi i numeri sono potenze di due:
[System.Flags]
public enum Element { None = 0, Fire = 1, Ice = 2, Poison = 4 }
public Element immuneTo; // selezionati nell'Inspector: Fire e Poison
public void Hit(int damage, Element element)
{
if (immuneTo.HasFlag(element)) return;
hp -= damage;
}| combina i valori: Element.Fire | Element.Poison è 5. HasFlag(x) restituisce true quando sono impostati tutti i valori contenuti in x, mentre ToString() elenca i valori impostati, come Fire, Poison.
Sfida
FacileConsenti a una porta di richiedere più tessere e al portachiavi di contenerne diverse.
- In
KeyRing.cs, inserisci[System.Flags]sopraAccesse assegnagli questi valori:None = 0, Red = 1, Blue = 2, Green = 4. Add(Access card)conserva le tessere già presenti:cards |= card;.Opens(Access needs)restituisce true solo quando il portachiavi contiene tutte le tessere indicate inneeds.
Premi «Gioca» e raccogli entrambe le tessere: il Vault si apre. Poi premi «Verifica».
Provalo tu
using UnityEngine;
public enum Access { None, Red, Blue, Green }
public class KeyRing : MonoBehaviour
{
public Access cards;
public void Add(Access card)
{
// aggiungi la tessera al portachiavi, mantenendo quelle già presenti
}
public bool Opens(Access needs)
{
// true quando il portachiavi contiene tutte le tessere indicate in needs
return false;
}
}
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