记录!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());
}
}
}
https://www.cnblogs.com/fengxing999/p/12559887.html