zoukankan      html  css  js  c++  java
  • Unity编辑器开发,使用CustomPropertyDrawer实现枚举中文显示

            在Unity开发中,枚举常常被用到。但是Unity自身对于枚举值,并不能做好中文的支持。无论是Head或者ToolTip.如下例:

    using UnityEngine;
    
    public class EnumTest : MonoBehaviour
    {
        public EmAniType AniType;
    }
    
    public enum EmAniType
     {
         Idle,
         Walk,
         Run,
         Atk,
         Hit,
         Die
     }

    QQ截图20170523065015

            为了将这些枚举值变成中文,这里使用了CustomPropertyDrawer(https://docs.unity3d.com/ScriptReference/CustomPropertyDrawer.html)。

            第一步,定义一个Unity属性标签PropertyAttribute。

    using UnityEngine;
    
    public class EnumLabelAttribute : HeaderAttribute
    {
        public EnumLabelAttribute(string header) : base(header)
        {
        }
    }

            这里没有继承PropertyAttribute,而是HeaderAttribute。原因是HeaderAttribute继承PropertyAttribute,而我想用到HeaderAttribute的header字段。当然我们也可以完全继承PropertyAttribute。

            第二步,使用CustomPropertyDrawer。在Editor文件夹下创建一个脚本EnumLabelDrawer.cs。EnumLabelDrawer继承PropertyDrawer,并加上CustomPropertyDrawer标签。在复写OnGUI方法,通过C#的反射,获取到枚举中枚举值上的Head标签属性数据。最终将这些属性中的中文说明展示出来。

    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标签。

    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
    }

            看看效果

    QQ截图20170523065123

    个人博客请访问:http://www.cnblogs.com/CodeGize/
  • 相关阅读:
    C# log4net 的配置
    C# 泛型
    Word 2013 基本概念与常用操作
    DataGridViewComboBoxColumn 事件过程分析
    C#垃圾回收机制
    Ceph分布式存储之三-S3接口编程
    .NET特性(Attribute)的应用
    24.Odoo产品分析 (三) – 人力资源板块(5) – 出勤(1)
    23.Odoo产品分析 (三) – 人力资源板块(4) – 招聘流程(1)
    22.Odoo产品分析 (三) – 人力资源板块(3) – 休假管理(1)
  • 原文地址:https://www.cnblogs.com/CodeGize/p/6892299.html
Copyright © 2011-2022 走看看