Unity编辑器开发,使用CustomPropertyDrawer实现枚举中文显示

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

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

        第一步,定义一个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
}

        看看效果

时间: 2024-11-18 02:08:37

Unity编辑器开发,使用CustomPropertyDrawer实现枚举中文显示的相关文章

Unity编辑器开发:官方风格的Table控件

Unity编辑器开发:官方风格的Table控件 Table控件能够非常直观地展现批量的数据.在Unity中,Light Explorer就是一个典型的具有Table控件的窗口. 如上图所示,窗口上方是4个TabButton.下面就是一个Table.这个Table功能非常强大,有列表,排序,筛选,实时同步数据更新,实时同步选择等功能. 在Unity项目开发中,也常常需要做这种Table数据的展示或者类似的功能,比如简单的一个需求,找出当前场景中所有的Camra,并显示它的某些属性.用Table控件

pycharm开发python时出现控制中文显示乱码

当pycharm开发python时,中文出现乱码 修改setting文件 这样就能正常显示 pycharm开发python时出现控制中文显示乱码

在Unity编辑器中增加脚本的中文说明

在游戏中,程序,美术,策划甚至音效都是分工合作的.很多时候,对于unity3d中一堆英文,大家都会看得很郁闷.尤其是不同的程序员,命名方式也不尽相同,甚至还是用拼音.因此,在脚本中增加一些中文显示,就能够很好地解决这个问题. 首先,unity中对于字段(Field)已经有了很好的中文显示方法[Header]标签 比如 using UnityEngine; public class TestScript : MonoBehaviour {     [Header("变量A")]    

Web前端开发神器--WebStorm(JavaScript 开发工具) 8.0.3 中文汉化破解版

WebStorm(JavaScript 开发工具) 8.0.3 中文汉化破解版 http://www.jb51.net/softs/171905.html WebStorm 是jetbrains公司旗下一款JavaScript 开发工具.被广大中国JS开发者誉为“Web前端开发神器”.“最强大的HTML5编辑器”.“最智能的JavaScript IDE”等.与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能.

Unity编辑器扩展Texture显示选择框

学习NGUI插件的时候,突然间有一个问题为什么它这些属性可以通过弹出窗口来选中呢? 而我自己写的组件只能使用手动拖放的方式=.=. Unity开发了组件Inspector视图扩展API,如果我们要写插件方便别人来使用,使用编辑器扩展API让我们的组件显示的更华丽,使用方便 Texture弹出选择框选中图片赋值: 1个组件对应1个Edit扩展器,继承Editor必须让入Editor文件夹下 MyComponent: using UnityEngine; using System.Collectio

10个免费的PHP编辑器/开发工具

一个好的编辑器或开发工具,能够极大提高我们的开发效率.下面介绍10个免费.强大的PHP编辑器/开发工具.这些编辑器拥有调试器.增量执行PHP脚本.查看每一行的所有变量值等功能. 1) Notepad ++ Notepad++是一款非常有特色的编辑器,是开源软件,可以免费使用.支持的语言: C, C++, Java , C#, XML, HTML, PHP, Javascript!  功能有: 1. Notepad内置支持多达 27 种语法高亮度显示(囊括各种常见的源代码.脚本,值得一提的是,完美

【Unity】开发WebGL内存概念详解和遇到的问题

自加入unity WebGL平台以来,Unity的开发团队就一直致力于优化WebGL的内存消耗.我们已经在Unity使用手册上有对于WebGL内存管理的详尽分析,甚至在Unite Europe 2015与Unite Boston 2015两届大会上,也有专题对其进行深入的讲解.然而,这方面的内容依旧是用户讨论的热门话题,因此我们意识到应当分享更多.希望本文能回答一些被频繁咨询的问题. Unity WebGL与其它平台有何不同? 一些用户已经熟悉了部分内存有所限制的的平台.而对于其它如桌面和Web

unity编辑器xml数据库插件

unity编辑器xml数据库插件 程序和数据分离的意义我就不多说了,大家自己脑补或者百度.在使用unity开发时,数据的调试是非常频繁和重要的.我们可以制作一个简单的编辑器插件,将数据显示在Inspector面板上,并进行编辑操作.这样测试人员就可以非常方便的管理测试数据了. 需求很简单,具体的效果是,能读取资源内的类,将其属性显示在面板上,可以对此进行增删改查的操作.如下图所示(对象组,相当于数据库所有的表.对象,相当于表的所有记录). 当需要创建一条新记录的时候,先填上主键,然后点击创建按钮

?Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果

Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果 使用忍者飞镖创建粒子效果 游戏中,诸如烟.火.水滴.落叶等粒子效果,都可以使用粒子系统(particle system)来实现.例如,<明朝传奇>中的篝火,如图2-32所示.粒子系统的最新版本也被称做忍者飞镖(Shuriken),因为场景中添加的粒子系统酷似忍者飞镖,如图2-33所示. 图2-32  游戏中的篝火               图2-33  粒子系统,也被称为忍者飞镖 unity中粒子基本属性 在使用粒子系统前,先了解一下它