Unity3D编辑器实现枚举多选

简介:

在编辑器中,可以很简单的实现枚举的多选。

方法一

在脚本中自定义枚举属性

using System;
using UnityEngine;
/// <summary>
/// 测试枚举
/// </summary>
public enum EnumType
{
    One,
    Two,
    Three,
    Four
}
/// <summary>
/// 定义多选属性
/// </summary>
public class EnumMultiAttribute : PropertyAttribute { }
public class Test : MonoBehaviour
{
    [Header("测试枚举")]
    [EnumMultiAttribute]
    public EnumType enumType; 
}

Editor文件夹创建属性脚本

using UnityEditor;
using UnityEngine; 

/// <summary>
/// 绘制多选属性
/// </summary>
[CustomPropertyDrawer(typeof(EnumMultiAttribute))]
public class EnumMultiAttributeDrawer : PropertyDrawer
{
    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        property.intValue = EditorGUI.MaskField(position, label, property.intValue, property.enumNames);
    }
}

如果需要判断是否选中了某个枚举,需要位移操作

// 判断是否选中该枚举值
public bool IsSelectEnumType(EnumType type)
{
    int index = 1 << (int)type;
    int eventTypeResult = (int)enumType;
    if ((eventTypeResult & index) == index)
    {
        return true;
    }
    return false;
}

方法二

using System;
using UnityEngine;

[Flags]     // Flags关键字允许我们在使用.net 枚举变量时,使用多个组合值
public enum Week
{
    None = 0,     //  在组合值中,0代表不存在
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    Saturday = 32,
    Sunday = 64
}
public class Test : MonoBehaviour
{
    public Week weekDay;    //编辑器面板可多选
    /// <summary>
    /// 添加枚举元素
    /// </summary>
    /// <param name="w"> 原始变量 </param>
    /// <param name="_wArray"> 要增加的类型</param>
    public static void Add(ref Week w, Week[] _wArray)
    {
        foreach (Week _w in _wArray)
        {
            w = w | _w;
        }
    }

    /// <summary>
    /// 移除枚举元素
    /// </summary>
    /// <param name="w"> 原始变量 </param>
    /// <param name="_wArray"> 要增加的类型</param>
    public static void Remove(ref Week w, Week[] _wArray)
    {
        foreach (Week _w in _wArray)
        {
            w = w & ~_w;
        }
    }

    /// <summary>
    /// 是否包含
    /// </summary>
    /// <param name="w"> 原始变量 </param>
    /// <param name="_w"> 要增加的类型</param>
    public static bool IsContain(Week w, Week _w)
    {
        return 0 != (w & _w);
    }

    /// <summary>
    /// 是否为None
    /// </summary>
    public static bool IsNone(Week w)
    {
        return w != Week.None;
    }
}

posted @ 2022-02-16 19:59  镜子-眼泪  阅读(907)  评论(0)    收藏  举报