Menu
CoddyTech

Enums no Inspector

Parte da seção Arquitetura de jogos no Unity do Journey de Unity da Coddy. Lição 17 de 50.

Um campo enum aparece no Inspector como uma lista suspensa, o que o torna uma maneira prática de configurar objetos que compartilham um script. Um prefab Pickup serve para moedas, corações e escudos: cada cópia no nível recebe seu tipo pela lista suspensa, e o script usa um switch para decidir o que fazer:

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 no final é seguro. Inserir um no início, como em { Gem, Coin, Heart, Shield }, desloca todos os números, e cada pickup em todas as cenas muda de tipo. Renomear um valor é seguro, pois seu número permanece o mesmo. 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. Sua lista suspensa tem uma caixa de seleção para cada valor, além de Nada e Tudo. Cada valor precisa de um bit próprio, 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) é true quando todos os valores em x estão definidos, e ToString() lista os valores que estão definidos, como em Fire, Poison.

challenge icon

Desafio

Fácil

A base tem três portas: o Depósito precisa do cartão-chave vermelho, o Laboratório do azul e o Cofre de ambos. O needs de cada porta e o card de cada cartão são definidos no Inspector com o enum Access, e Door.cs e Keycard.cs estão prontos. As setas movem o Player, cujo KeyRing guarda os cartões coletados. Termine KeyRing.cs:

  • Faça de Access um enum cujos valores possam ser combinados, para que uma porta possa precisar de vários cartões e o chaveiro possa guardar vários. Mantenha os quatro nomes: None, Red, Blue e Green.
  • Add(Access card) adiciona um cartão ao chaveiro, mantendo os cartões que já estão nele.
  • Opens(Access needs) retorna true quando o chaveiro contém todos os cartões em needs.

Pressione Play, teste as portas, pegue os cartões e então pressione Check.

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 lá
    }

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

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

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