Menu
CoddyTech

Enums no Inspector

Parte da seção Arquitetura de Jogos no Unity do Journey de Unity da Coddy. Lição 20 de 64.

Um campo enum aparece no Inspector como um menu suspenso, o que o torna uma maneira prática de configurar objetos que compartilham um mesmo script. Um prefab Pickup serve para moedas, corações e escudos: cada cópia no nível recebe seu tipo pelo menu suspenso, e o script usa esse tipo em uma seleção:

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

A cena salva cada escolha como o número do valor: Coin é 0, Heart é 1, Shield é 2. Adicionar um valor ao final é seguro. Inserir um no início, como em { Gem, Coin, Heart, Shield }, altera todos os números, e cada coleta em todas as cenas muda de tipo. Renomear um valor é seguro, já que seu número permanece igual. Escrever os números explicitamente, como em Coin = 0, Heart = 1, Shield = 2, permite reordenar os nomes depois sem alterar nenhuma escolha salva.

Um enum [System.Flags] armazena vários valores ao mesmo tempo. Seu menu suspenso tem uma caixa de seleção para cada valor, além de Nothing e Everything. Cada valor precisa ter seu próprio bit, então os números são potências de dois:

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

public Element immuneTo;   // marcados no Inspector: Fire e Poison

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

| combina valores: Element.Fire | Element.Poison é 5. HasFlag(x) é verdadeiro quando todos os valores em x estão definidos, e ToString() lista os valores definidos, como em Fire, Poison.

challenge icon

Desafio

Fácil

Permita que uma porta precise de vários cartões-chave e que o chaveiro contenha vários.

  1. Em KeyRing.cs, coloque [System.Flags] acima de Access e numere-o como None = 0, Red = 1, Blue = 2, Green = 4.
  2. Add(Access card) mantém os cartões que já estão lá: cards |= card;.
  3. Opens(Access needs) retorna true somente quando o chaveiro contém todos os cartões em needs.

Pressione “Jogar” e pegue os dois cartões: o Cofre se abre. Depois, pressione “Verificar”.

Experimente você mesmo

using UnityEngine;

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

public class KeyRing : MonoBehaviour
{
    public Access cards;

    public void Add(Access card)
    {
        // adicione o cartão ao chaveiro, mantendo os cartões que já estão nele
    }

    public bool Opens(Access needs)
    {
        // true quando o chaveiro contém todos os cartões em needs
        return false;
    }
}

Todas as lições de Arquitetura de Jogos no Unity

Pratique por conta própria: Playground de Unity