在Unity開發中,枚舉經常被用到。可是Unity自身對於枚舉值,並不能作好中文的支持。不管是Head或者ToolTip.以下例:html
using UnityEngine; public class EnumTest : MonoBehaviour { public EmAniType AniType; } public enum EmAniType { Idle, Walk, Run, Atk, Hit, Die }
爲了將這些枚舉值變成中文,這裏使用了CustomPropertyDrawer(https://docs.unity3d.com/ScriptReference/CustomPropertyDrawer.html)。ide
第一步,定義一個Unity屬性標籤PropertyAttribute。動畫
using UnityEngine; public class EnumLabelAttribute : HeaderAttribute { public EnumLabelAttribute(string header) : base(header) { } }
這裏沒有繼承PropertyAttribute,而是HeaderAttribute。緣由是HeaderAttribute繼承PropertyAttribute,而我想用到HeaderAttribute的header字段。固然咱們也能夠徹底繼承PropertyAttribute。spa
第二步,使用CustomPropertyDrawer。在Editor文件夾下建立一個腳本EnumLabelDrawer.cs。EnumLabelDrawer繼承PropertyDrawer,並加上CustomPropertyDrawer標籤。在複寫OnGUI方法,經過C#的反射,獲取到枚舉中枚舉值上的Head標籤屬性數據。最終將這些屬性中的中文說明展現出來。3d
using System.Collections.Generic; using UnityEditor; using UnityEngine; [CustomPropertyDrawer(typeof(EnumLabelAttribute))] public class EnumLabelDrawer : PropertyDrawer { private readonly List<string> m_displayNames = new List<string>(); public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { var att = (EnumLabelAttribute)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); 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; } } }
第三步,更改原有的枚舉和腳本字段。在枚舉值上加上Header標籤,在腳本的字段上增長EnumLabel標籤。code
using UnityEngine; public class EnumTest : MonoBehaviour { [EnumLabel("動畫類型")] public EmAniType AniType; } public enum EmAniType { [Header("待機")] Idle, [Header("走")] Walk, [Header("跑")] Run, [Header("攻擊")] Atk, [Header("受擊")] Hit, [Header("死亡")] Die }
看看效果htm