PropertyDrawer-枚举多选

2022/4/2 6:21:25

本文主要是介绍PropertyDrawer-枚举多选,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 

# 标签类

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;
}

 



这篇关于PropertyDrawer-枚举多选的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程