使用PropertyDrawer自定枚举显示

# 默认的展示方式

 # 自定义后的展示方式

 

# 标签类,enum成员加上这个标签才会按自定义的方式显示

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

# PropertyDrawer类

[CustomPropertyDrawer(typeof(CustomEnumAttribute))]
public class CustomEnumPropertyDrawer : PropertyDrawer
{
    private readonly List<string> m_displayNames = new List<string>();

    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        var attr = (CustomEnumAttribute)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.Popup(position, propertyLabel, property.enumValueIndex, m_displayNames.ToArray());
        if (EditorGUI.EndChangeCheck())
        {
            property.enumValueIndex = value;
        }
    }
}

# 使用

public enum Animal
{
    None,
    [Header("哺乳动物/猪")]
    Pig,
    [Header("鱼类/金鱼")]
    GoldFish,
}

public class NewBehaviourScript : MonoBehaviour
{
    [CustomEnum("")]
    public Animal _animal;
    
}

 

posted @ 2022-04-01 23:44  yanghui01  阅读(95)  评论(0编辑  收藏  举报