Menu
CoddyTech

Enumeraciones en el Inspector

Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 20 de 64.

Un campo de enumeración aparece en el Inspector como un menú desplegable, lo que lo convierte en una forma práctica de configurar objetos que comparten un mismo script. Un prefab Pickup sirve para monedas, corazones y escudos: cada copia del nivel obtiene su tipo del menú desplegable, y el script actúa en función de ese valor:

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 escena guarda cada opción como el número de su valor: Coin es 0, Heart es 1 y Shield es 2. Añadir un valor al final es seguro. Insertar uno al principio, como en { Gem, Coin, Heart, Shield }, desplaza todos los números y cambia el tipo de cada objeto Pickup de todas las escenas. Cambiar el nombre de un valor es seguro, ya que su número sigue siendo el mismo. Escribir los números explícitamente, Coin = 0, Heart = 1, Shield = 2, te permite reordenar los nombres más adelante sin cambiar ninguna opción guardada.

Una enumeración [System.Flags] almacena varios valores a la vez. Su menú desplegable tiene una casilla por valor, además de Nothing y Everything. Cada valor necesita su propio bit, así que los números son potencias de dos:

[System.Flags]
public enum Element { None = 0, Fire = 1, Ice = 2, Poison = 4 }

public Element immuneTo;   // marcados en el Inspector: Fire y Poison

public void Hit(int damage, Element element)
{
    if (immuneTo.HasFlag(element)) return;
    hp -= damage;
}

| combina valores: Element.Fire | Element.Poison es 5. HasFlag(x) es true cuando todos los valores de x están establecidos, y ToString() enumera los valores establecidos, como Fire, Poison.

challenge icon

Desafío

Fácil

Haz que una puerta necesite varias tarjetas y que el llavero pueda contener varias.

  1. En KeyRing.cs, pon [System.Flags] encima de Access y asígnale estos valores: None = 0, Red = 1, Blue = 2, Green = 4.
  2. Add(Access card) conserva las tarjetas que ya hay: cards |= card;.
  3. Opens(Access needs) devuelve true solo cuando el llavero contiene todas las tarjetas de needs.

Pulsa «Jugar» y recoge ambas tarjetas: la bóveda se abre. Después, pulsa «Comprobar».

Pruébalo tú mismo

using UnityEngine;

public enum Access { None, Red, Blue, Green }

public class KeyRing : MonoBehaviour
{
    public Access cards;

    public void Add(Access card)
    {
        // añade la tarjeta al llavero sin quitar las que ya tiene
    }

    public bool Opens(Access needs)
    {
        // true cuando el llavero contiene todas las tarjetas indicadas en needs
        return false;
    }
}

Todas las lecciones de Arquitectura de juegos en Unity

Practica por tu cuenta: Playground de Unity