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 独立游戏
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端