Menu
CoddyTech

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.

challenge icon

Sfida

Facile

Consenti a una porta di richiedere più tessere e al portachiavi di contenerne diverse.

  1. In KeyRing.cs, inserisci [System.Flags] sopra Access e assegnagli questi valori: None = 0, Red = 1, Blue = 2, Green = 4.
  2. Add(Access card) conserva le tessere già presenti: cards |= card;.
  3. Opens(Access needs) restituisce true solo quando il portachiavi contiene tutte le tessere indicate in needs.

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

Esercitati da solo: Playground Unity