
Nesta publicação, tentarei falar brevemente sobre o tipo de enumeração em 
C # , seu uso como sinalizadores e como simplificar seus desenhos no inspetor da 
Unidade . 
O que é o Enum?
As enumerações são um tipo significativo em 
C # , consistindo em um conjunto de constantes. A palavra-chave 
enum é usada para declará-lo. Cada enumerador possui um valor inteiro. O primeiro padrão é 
0 e os subsequentes aumentam em 
1 .
enum Color { Red,  
Você pode usar inicializadores para substituir valores.
 enum Color { Red = 1, Green = 2, Blue = 3 } 
Cada tipo de enumeração possui um tipo base, que pode ser qualquer tipo de número inteiro, exceto 
char (o padrão é 
int ). Também pode ser especificado explicitamente.
 enum Color : byte { Red = 1, Green = 2, Blue = 3 } 
Bandeiras
Às vezes, torna-se necessário dotar uma entidade com um número de propriedades. Você pode declarar vários campos ou criar uma lista, mas às vezes uma única listagem é suficiente. Para usar a enumeração como sinalizadores, adicione o atributo especial 
System.FlagsAttribute . Isso requer inicialização explícita de valores, cada um dos quais é elevado a um poder.
 [System.FlagsAttribute] enum Color : byte { None = 0, Red = 1,  
Usando a operação 
OR bit a bit, você pode combinar elementos de enumeração e, usando o método 
HasFlag (Enum) , verifique a presença de campos de bits em uma instância.
 var color = Color.Red | Color.Green | Color.Blue; var hasFlag = color.HasFlag(Color.Red | Color.Green);  
Você também pode executar verificações usando a operação 
AND bit a bit.
 var aColor = Color.Red | Color.Green; var bColor = Color.Green | Color.Blue;  
Transferências na Unidade
Por exemplo, pegue o código abaixo.
 using UnityEngine; public enum Color { Red, Green, Blue } public class Example : MonoBehaviour { public Color Color; } 
As ferramentas integradas do 
Unity permitem exibir enumerações na forma de uma lista suspensa.

Infelizmente, o editor não pode desenhar enumerações automaticamente na forma de sinalizadores. Para esses fins, é necessária uma redefinição do inspetor, o que está longe de ser sempre conveniente. Mas você pode seguir o truque e redefinir as enumerações de desenho globalmente. Primeiro, modifique o exemplo.
 using System; using UnityEngine; [Flags] public enum Color { Red = 1, Green = 2, Blue = 4 } public class Example : MonoBehaviour { public Color Color; } 
Em seguida, você precisa implementar seu 
PropertyDrawer . Se a propriedade serializable tiver o atributo 
Flags , usaremos o método 
EditorGUI.MaskField para desenhar e, caso contrário, o método padrão 
EditorGUI.PropertyField . Observe também que uma propriedade pode ser um elemento de uma matriz. O código abaixo deve ser colocado em uma pasta chamada 
Editor .
 [CustomPropertyDrawer(typeof(Enum), true)] public sealed class EnumPropertyDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { using (new EditorGUI.PropertyScope(position, label, property)) { if (HasEnumFlagsAttribute()) { var intValue = EditorGUI.MaskField(position, label, property.intValue, property.enumDisplayNames); if (property.intValue != intValue) { property.intValue = intValue; } } else { EditorGUI.PropertyField(position, property, label); } } bool HasEnumFlagsAttribute() { var fieldType = fieldInfo.FieldType; if (fieldType.IsArray) { var elementType = fieldType.GetElementType(); return elementType.IsDefined(typeof(FlagsAttribute), false); } return fieldType.IsDefined(typeof(FlagsAttribute), false); } } } 
Agora, o campo é exibido corretamente no inspetor para qualquer tipo de 
enum .

Além de certos valores de enumeração, o editor adiciona mais dois:
- Nada - tem um valor inteiro 0 ;
- Tudo - tem um valor inteiro -1 .
Links relacionados