效果
枚举
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($"{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)}"); } }
参考
Unity中的位操作(从LayerMask说起) | indienova 独立游戏
标签:Enum,MyFontStyleMask,EditorGUI,public,枚举,EnumFlagsField,position,FontStyleFlags From: https://www.cnblogs.com/sailJs/p/18132244