| 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 |