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 @ 2024-04-12 22:15  yanghui01  阅读(8)  评论(0编辑  收藏  举报