Enum nell'Inspector
Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 17 di 50.
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 viene usato per monete, cuori e scudi: ogni copia nel livello riceve il proprio tipo dal menu a discesa e lo script agisce in base a esso:
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 corrispondente al 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 ogni scena. Rinominare un valore è sicuro, perché il suo numero rimane invariato. Scrivere esplicitamente i numeri, Coin = 0, Heart = 1, Shield = 2, ti consente di riordinare i nomi in seguito senza modificare le scelte salvate.
Un enum [System.Flags] contiene più valori contemporaneamente. Il suo menu a discesa mostra una casella da spuntare per ogni valore, oltre a Nothing ed Everything. Ogni valore ha bisogno di un bit dedicato, 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) è true quando è impostato ogni valore in x, e ToString() elenca i valori impostati, come Fire, Poison.
Sfida
FacileLa base ha tre porte: il Magazzino richiede la tessera rossa, il Laboratorio quella blu e il Caveau entrambe. Il valore needs di ciascuna porta e il valore card di ciascuna tessera si impostano nell'Inspector con l'enum Access, mentre Door.cs e Keycard.cs sono pronti. Le frecce muovono il Player, il cui KeyRing contiene le tessere raccolte. Completa KeyRing.cs:
- Fai in modo che
Accesssia un enum i cui valori possano essere combinati, così una porta può richiedere più tessere e il portachiavi può contenerne diverse. Mantieni i suoi quattro nomi: None, Red, Blue e Green. Add(Access card)aggiunge una tessera al portachiavi, mantenendo quelle già presenti.Opens(Access needs)restituisce true quando il portachiavi contiene tutte le tessere indicate inneeds.
Premi Play, prova le porte, raccogli le tessere, poi premi Check.
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 in needs
return false;
}
}
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
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRiepilogo: torretta modulare4Dati serializzati
Classi serializzabiliListe nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottino7Macchine a stati
Gli stati come classiUna macchina a statiTransizioniIntelligenze dei nemiciRiepilogo: stati della porta10Progetto: Sopravvissuto nell’arena
L’eroeTipi di nemici5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseOndate come datiRiepilogo: database degli oggetti