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.
Desafio
FácilPermita que uma porta precise de vários cartões-chave e que o chaveiro contenha vários.
- Em
KeyRing.cs, coloque[System.Flags]acima deAccesse numere-o comoNone = 0, Red = 1, Blue = 2, Green = 4. Add(Access card)mantém os cartões que já estão lá:cards |= card;.Opens(Access needs)retorna true somente quando o chaveiro contém todos os cartões emneeds.
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
1Componentes, não hierarquias
Componentes pequenosUm script base de inimigoComponentes abstratosComponentes trabalhando juntosRevisão: torre modularRevisão: canhão duplo4Dados Serializados
Classes SerializáveisListas no InspectorEnums no InspectorRevisão: Tabela de LootRevisão: Sorteie o Loot2Interfaces no Unity
IDamageableInterfaces e TryGetComponentGetComponentsRevisão: tecla de interaçãoRevisão: mais próximo ao alcance5ScriptableObjects
Ativos de DadosAtributos da ArmaConfigurações CompartilhadasSalve o VentoOndas como DadosRevisão: Banco de ItensRevisão: Comprar na LojaPratique por conta própria: Playground de Unity