EditorGUI.EnumFlagsField实现多选枚举
效果
枚举
public enum MyFontStyleMask { Bold = 1, Italic = 1 << 1, Outline = 1 << 2, }
标签类
using UnityEngine; public class MyEnumMaskAttribute : PropertyAttribute { }
Property Drawer
#if UNITY_EDITOR using System; using UnityEditor; using UnityEngine; [CustomPropertyDrawer(typeof(MyEnumMaskAttribute))] public class MyEnumMaskPropertyDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty sp, GUIContent label) { position = EditorGUI.PrefixLabel(position, label); var fieldType = fieldInfo.FieldType; if (!typeof(Enum).IsAssignableFrom(fieldType)) { EditorGUI.LabelField(position, $"not Enum Type: {fieldType.Name}"); } else { var obj = Enum.ToObject(fieldType, sp.intValue); //整数值强转为枚举类型 Enum e = EditorGUI.EnumFlagsField(position, (Enum)obj); sp.intValue = Convert.ToInt32(e); //枚举强转为整数 } } } #endif
测试代码
public class MyEnumMaskTest : MonoBehaviour { [MyEnumMask] public int m_Value; [MyEnumMask] public MyFontStyleMask m_FontStyleFlags; void Start() { Debug.Log($"{(int)m_FontStyleFlags}, {Convert.ToString((int)m_FontStyleFlags, 2).PadLeft(32, '0')}"); Debug.Log($"Bold: { 0 != (m_FontStyleFlags & MyFontStyleMask.Bold)}"); Debug.Log($"Italic: {0 != (m_FontStyleFlags & MyFontStyleMask.Italic)}"); Debug.Log($"Outline: {0 != (m_FontStyleFlags & MyFontStyleMask.Outline)}"); } }
注意:EditorGUI.EnumMaskPopup这个也用于实现同样的功能,只是现在已弃用。
参考
Unity中的位操作(从LayerMask说起) | indienova 独立游戏