记录!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,这儿别忘了加1
- Debug.LogError("value " + property.enumValueIndex.ToString());
- }
- }
- }