Simplifique o desenho de sinalizadores Enum no Unity



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, // 0 Green, // 1 Blue // 2 } 

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, // 2 ^ 0 Green = 2, // 2 ^ 1 Blue = 4 // 2 ^ 2 } 

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); // True 

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; //     var contains = (aColor & bColor) == bColor; // False //     var overlaps = (aColor & bColor) != 0; // True 

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


Source: https://habr.com/ru/post/pt456852/


All Articles