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 @   镜子-眼泪  阅读(809)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
欢迎阅读『Unity3D编辑器实现枚举多选』

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示