ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

PropertyDrawer-枚举多选

2022-04-02 00:36:12  阅读:180  来源: 互联网

标签:MultiSelectEnumAttribute 多选 propertyLabel PropertyDrawer Header 枚举 var property 


 

# 标签类

public class MultiSelectEnumAttribute : HeaderAttribute
{
    public MultiSelectEnumAttribute(string header) : base(header)
    {
    }
}

# PropertyDrawer类

[CustomPropertyDrawer(typeof(MultiSelectEnumAttribute))]
public class MultiSelectEnumPropertyDrawer : PropertyDrawer
{
    private readonly List<string> m_displayNames = new List<string>();
    
    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        var attr = (MultiSelectEnumAttribute) attribute;
        var propertyLabel = attr.header;
        if (string.IsNullOrEmpty(propertyLabel))
            propertyLabel = label.text;
        
        var type = property.serializedObject.targetObject.GetType();
        FieldInfo field = type.GetField(property.name,
            BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
        if (null == field)
        {
            EditorGUI.LabelField(position, $"{propertyLabel}: {property.name}未找到");
            return;
        }
        
        var fieldType = field.FieldType;
        if (!fieldType.IsEnum)
        {
            EditorGUI.LabelField(position, $"{propertyLabel}: {property.name}不是枚举类型");
            return;
        }
        
        var enumNames = property.enumNames;
        foreach (var enumName in enumNames)
        {
            var enumItem = fieldType.GetField(enumName);
            var hds = enumItem.GetCustomAttributes(typeof(HeaderAttribute), false); //获取枚举上的Header标签
            m_displayNames.Add(hds.Length <= 0 ? enumName : ((HeaderAttribute) hds[0]).header);
        }

        EditorGUI.BeginChangeCheck();
        var value = EditorGUI.MaskField(position, propertyLabel, property.enumValueIndex, m_displayNames.ToArray());
        if (EditorGUI.EndChangeCheck())
        {
            property.intValue = value;
        }
    }
}

# 使用

public enum Nation
{
    [Header("中国")]
    China,
    [Header("I/印度")]
    India,
    [Header("A/美国")]
    America,
    England,
}

public class NewBehaviourScript : MonoBehaviour
{
    [MultiSelectEnumAttribute("亚洲国家")] public Nation _asia;
}

 

标签:MultiSelectEnumAttribute,多选,propertyLabel,PropertyDrawer,Header,枚举,var,property,
来源: https://www.cnblogs.com/sailJs/p/16089851.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有