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 独立游戏

 

posted @   yanghui01  阅读(102)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示