
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