
在本出版物中,我将尝试简要地讨论
C#中的枚举类型,将其用作标志以及如何在
Unity检查器中简化其绘制。
什么是枚举?
枚举是
C#中的重要类型,由一组常量组成。 关键字
enum用于声明它。 每个枚举器都有一个整数值。 第一个默认值为
0 ,随后的默认值加
1 。
enum Color { Red,
您可以使用初始值设定项来覆盖值。
enum Color { Red = 1, Green = 2, Blue = 3 }
每种枚举类型都有一个基本类型,它可以是除
char外的任何整数类型(默认为
int )。 也可以明确指定。
enum Color : byte { Red = 1, Green = 2, Blue = 3 }
标志
有时有必要赋予实体许多属性。 您可以声明多个字段或创建一个列表,但是有时一个列表就足够了。 要将枚举用作标志,请添加特殊属性
System.FlagsAttribute 。 这就需要对值进行显式初始化,并将每个值都提高为幂。
[System.FlagsAttribute] enum Color : byte { None = 0, Red = 1,
使用按位
或运算,可以合并枚举元素,并使用
HasFlag(Enum)方法检查实例中是否存在位字段。
var color = Color.Red | Color.Green | Color.Blue; var hasFlag = color.HasFlag(Color.Red | Color.Green);
您也可以使用
AND按位运算执行检查。
var aColor = Color.Red | Color.Green; var bColor = Color.Green | Color.Blue;
Unity中的转移
例如,使用下面的代码。
using UnityEngine; public enum Color { Red, Green, Blue } public class Example : MonoBehaviour { public Color Color; }
内置的
Unity工具可让您以下拉列表的形式显示枚举。

不幸的是,编辑器无法以标志的形式自动绘制枚举。 为此,需要重新定义检查器,这总是很不方便。 但是,您可以使用技巧,并在全局范围内重新定义工程图枚举。 首先,修改示例。
using System; using UnityEngine; [Flags] public enum Color { Red = 1, Green = 2, Blue = 4 } public class Example : MonoBehaviour { public Color Color; }
接下来,您需要实现
PropertyDrawer 。 如果serializable属性具有
Flags属性,则将使用
EditorGUI.MaskField方法进行绘制,否则将使用标准的
EditorGUI.PropertyField方法。 还要注意,属性可以是数组的元素。 下面的代码应放在名为
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); } } }
现在,该字段已正确显示在检查器中,适用于任何
枚举类型。

除了某些枚举值外,编辑器还添加了两个:
相关连结