Unity面板显示中文属性

发表于2018-04-25
评论0 3.4k浏览
虽然对于程序来说,一般习惯用英文命名,但也有为了沟通方便,在一些属性面板上会用一些中文的情况。下面就和大家介绍下两种实现中文属性名的方法。

1、使用Unity内置的HeaderAttribute

[Header("这是Header命名")]  
public bool testHeader;  
在字段上方这样书写代码,编译成功后我们可以在Unity属性面板观察到

2、自定义Attribute

首先,我们先来说下Attribute这个东西。

.Net 框架允许创建自定义特性,用于存储声明性的信息,且可在运行时被检索。该信息根据设计标准和应用程序需要,可与任何目标元素相关。

创建并使用自定义特性包含四个步骤:
  1. 声明自定义特性
  2. 构建自定义特性
  3. 在目标程序元素上应用自定义特性
  4. 访问特性
遵循上述步骤,我们先来声明自定义特性,名为RenameAttribute:
[AttributeUsage(AttributeTargets.Field)]    //指定为字段使用  
public class RenameAttribute : PropertyAttribute<span style="white-space:pre;"> </span>//需要继承Unity的PropertyAttribute,以便于实现Unity的某些特性  
需要注意的是,一个新的自定义特性应派生自 <span style="color:rgb(51,51,51);font-family:'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', Arial, sans-serif;font-size:13px;">System.Attribute</span><span style="color:rgb(51,51,51);font-family:'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', Arial, sans-serif;font-size:13px;"> 类。</span>  

然后我们来构建RenameAttribute:

我们的 RenameAttribute 类将一个用于存储中文名字的公有属性(property)。
每个特性必须至少有一个构造函数。
[AttributeUsage(AttributeTargets.Field)]<span style="white-space:pre;"> </span>  
public class RenameAttribute : PropertyAttribute  
{  
    //用来显示中文的字符串  
    public string name;  
    public RenameAttribute(string name)  
    {  
        this.name = name;  
    }  
}  

现在我们已经写好了RenameAttribute,我们的目的是显示中文属性,所以要再Inspector面板重新绘制该特性:
[CustomPropertyDrawer(typeof(RenameAttribute))]    //用到RenameAttribute的地方都会被重绘  
public class RenameDrawer : PropertyDrawer    //相对于Editor类可以修改MonoBehaviour的外观,我们可以简单的理解PropertyDrawer为修改struct/class的外观的Editor类  
{  
        //替换属性名称  
        RenameAttribute rename = (RenameAttribute)attribute;  
        label.text = rename.name;  
        //重绘GUI  
        EditorGUI.PropertyField(position, property, label);  
}  

接下来我们把RenameAtrribute放在要重命名的字段前,就可以应用它了
[Header("这是Header命名")]  
public bool testHeader;  
[Rename("自定义命名")]  
public int test; 
来自:https://blog.csdn.net/qq_17758883/article/details/79754906

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论