
En esta publicación, trataré de hablar brevemente sobre el tipo de enumeración en
C # , su uso como banderas, y cómo simplificar su dibujo en el inspector de
Unity .
¿Qué es la enumeración?
Las enumeraciones son un tipo significativo en
C # , que consiste en un conjunto de constantes. La palabra clave
enum se usa para declararla. Cada enumerador tiene un valor entero. El primero por defecto es
0 , y los siguientes aumentan en
1 .
enum Color { Red,
Puede usar inicializadores para anular valores.
enum Color { Red = 1, Green = 2, Blue = 3 }
Cada tipo de enumeración tiene un tipo base, que puede ser cualquier tipo entero excepto
char (el valor predeterminado es
int ). También se puede especificar explícitamente.
enum Color : byte { Red = 1, Green = 2, Blue = 3 }
Banderas
A veces se hace necesario dotar a una entidad de varias propiedades. Puede declarar varios campos o crear una lista, pero a veces una sola lista es suficiente. Para usar la enumeración como banderas, agregue el atributo especial
System.FlagsAttribute . Esto requiere una inicialización explícita de valores, cada uno de los cuales se eleva a una potencia.
[System.FlagsAttribute] enum Color : byte { None = 0, Red = 1,
Usando la operación
OR a nivel de bit, puede combinar elementos de enumeración, y utilizando el
método HasFlag (Enum) , verifique la presencia de campos de bits en una instancia.
var color = Color.Red | Color.Green | Color.Blue; var hasFlag = color.HasFlag(Color.Red | Color.Green);
También puede realizar comprobaciones utilizando la operación
AND bit a bit.
var aColor = Color.Red | Color.Green; var bColor = Color.Green | Color.Blue;
Traslados en la unidad
Por ejemplo, tome el código a continuación.
using UnityEngine; public enum Color { Red, Green, Blue } public class Example : MonoBehaviour { public Color Color; }
Las herramientas incorporadas de
Unity le permiten mostrar enumeraciones en forma de una lista desplegable.

Desafortunadamente, el editor no puede dibujar enumeraciones automáticamente en forma de banderas. Para estos fines, se requiere la redefinición del inspector, lo que está lejos de ser siempre conveniente. Pero puede ir por el truco y redefinir las enumeraciones de dibujo a nivel mundial. Primero, modifique el ejemplo.
using System; using UnityEngine; [Flags] public enum Color { Red = 1, Green = 2, Blue = 4 } public class Example : MonoBehaviour { public Color Color; }
A continuación, debe implementar su
PropertyDrawer . Si la propiedad serializable tiene el atributo
Flags , entonces para el dibujo usaremos el método
EditorGUI.MaskField , de lo contrario, el método estándar
EditorGUI.PropertyField . También tenga en cuenta que una propiedad puede ser un elemento de una matriz. El siguiente código debe colocarse en una carpeta llamada
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); } } }
Ahora el campo se muestra correctamente en el inspector para cualquier tipo de
Enum .

Además de ciertos valores de enumeración, el editor agrega dos más:
- Nada : tiene un valor entero de 0 ;
- Todo : tiene un valor entero de -1 .
Enlaces relacionados