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

 

posted @ 2022-04-02 00:12  yanghui01  阅读(73)  评论(0编辑  收藏  举报