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.
Desafio
FácilA 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
Accessum 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 emneeds.
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;
}
}
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
1Componentes, não hierarquias
Componentes pequenosUm script-base para inimigosComponentes abstratosComponentes trabalhando juntosRevisão: Torre modular4Dados Serializados
Classes SerializáveisListas no InspectorEnums no InspectorRevisão: Tabela de Loot7Máquinas de Estados
Estados como ClassesUma Máquina de EstadosTransiçõesInteligências dos InimigosRevisão: Estados da Porta10Projeto: Sobrevivente da Arena
O HeróiTipos de Inimigos5ScriptableObjects
Assets de dadosAtributos das armasConfigurações compartilhadasOndas como dadosRevisão: banco de dados de itens