Menu
CoddyTech

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.

challenge icon

Sfida

Facile

La 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 Access sia 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 in needs.

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