记录!Unity Inspector面板编辑器扩展,枚举显示中文,枚举值自定义显示内容,显示部分选项。效果如下:
枚举类代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class EnumTest : MonoBehaviour
{[EnumAttackLevel("攻击级别")]public EAttackLevel level;
}public enum EAttackLevel
{[Header("0空")]None,[Header("1低")]Low,[Header("2中")]Med,[Header("3高")]High,
}
扩展类代码:
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;public class EnumAttackLevelAttribute : HeaderAttribute
{public EnumAttackLevelAttribute(string header) : base(header){}
}[CustomPropertyDrawer(typeof(EnumAttackLevelAttribute))]
public class EnumAttackLevelDrawer : PropertyDrawer
{private readonly List<string> m_displayNames = new List<string>();public override void OnGUI(Rect position, SerializedProperty property, GUIContent label){var att = (EnumAttackLevelAttribute)attribute;var type = property.serializedObject.targetObject.GetType();var field = type.GetField(property.name);var enumtype = field.FieldType;foreach (var enumName in property.enumNames){var enumfield = enumtype.GetField(enumName);if (enumfield.Name == "None")//不显示None{continue;}var hds = enumfield.GetCustomAttributes(typeof(HeaderAttribute), false);m_displayNames.Add(hds.Length <= 0 ? enumName : ((HeaderAttribute)hds[0]).header);//如果加了自定义属性,显示自定义名,否则显示枚举选项名}EditorGUI.BeginChangeCheck();var value = EditorGUI.Popup(position, att.header, property.enumValueIndex, m_displayNames.ToArray());if (EditorGUI.EndChangeCheck()){property.enumValueIndex = value + 1;//因为我们隐藏了一个显示项None,这儿别忘了加1Debug.LogError("value " + property.enumValueIndex.ToString());}}
}
https://www.cnblogs.com/fengxing999/p/12559887.html