using System; 
 | 
using System.Collections; 
 | 
using System.Collections.Generic; 
 | 
using UnityEngine; 
 | 
#if UNITY_EDITOR 
 | 
using UnityEditor; 
 | 
using System.Reflection; 
 | 
#endif 
 | 
  
 | 
[AttributeUsage(AttributeTargets.Field)] 
 | 
public class EnumLabelAttribute : PropertyAttribute 
 | 
{ 
 | 
    public readonly Type enumType; 
 | 
    public EnumLabelAttribute(Type type) 
 | 
    { 
 | 
        this.enumType = type; 
 | 
    } 
 | 
} 
 | 
  
 | 
#if UNITY_EDITOR 
 | 
[CustomPropertyDrawer(typeof(EnumLabelAttribute))] 
 | 
public class EnumLabelPropertyDrawer : PropertyDrawer 
 | 
{ 
 | 
    List<string> m_EnumLabels = new List<string>(); 
 | 
    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) 
 | 
    { 
 | 
        var customAttribute = (EnumLabelAttribute)attribute; 
 | 
        if (m_EnumLabels.Count != property.enumNames.Length) 
 | 
        { 
 | 
            m_EnumLabels.Clear(); 
 | 
            var enumtype = customAttribute.enumType; 
 | 
            foreach (var enumName in property.enumNames) 
 | 
            { 
 | 
                var enumfield = enumtype.GetField(enumName); 
 | 
                var customAttributes = enumfield.GetCustomAttributes(typeof(HeaderAttribute), false); 
 | 
                m_EnumLabels.Add(customAttributes.Length <= 0 ? enumName : ((HeaderAttribute)customAttributes[0]).header); 
 | 
            } 
 | 
        } 
 | 
        EditorGUI.BeginChangeCheck(); 
 | 
        var value = EditorGUI.Popup(position, fieldInfo.Name, property.enumValueIndex, m_EnumLabels.ToArray()); 
 | 
        if (EditorGUI.EndChangeCheck()) 
 | 
        { 
 | 
            property.enumValueIndex = value; 
 | 
        } 
 | 
    } 
 | 
} 
 | 
#endif 
 |