虽然对于程序来说,一般习惯用英文命名,但有时身在公司,总是需要和策划协作的,他们可能看不懂一些英文变量,所以为了方便交流,我抽空研究了下Unity属性面板中文化的问题。
有两种方法可以实现中文属性名:
1.使用Unity内置的HeaderAttribute
[Header("这是Header命名")]
public bool testHeader;
在字段上方这样书写代码,编译成功后我们可以在Unity属性面板观察到
2.自定义Attribute
首先,我们先来说下Attribute这个东西。
.Net 框架允许创建自定义特性,用于存储声明性的信息,且可在运行时被检索。该信息根据设计标准和应用程序需要,可与任何目标元素相关。
创建并使用自定义特性包含四个步骤:
- A.声明自定义特性
- B.构建自定义特性
- C.在目标程序元素上应用自定义特性
- D.访问特性
[AttributeUsage(AttributeTargets.Field)] //指定为字段使用
public class RenameAttribute : PropertyAttribute //需要继承Unity的PropertyAttribute,以便于实现Unity的某些特性
需要注意的是,一个新的自定义特性应派生自 System.Attribute 类。
我们的 RenameAttribute 类将一个用于存储中文名字的公有属性(property)。
每个特性必须至少有一个构造函数。
[AttributeUsage(AttributeTargets.Field)]
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类
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
//替换属性名称
RenameAttribute rename = (RenameAttribute)attribute;
label.text = rename.name;
//重绘GUI
EditorGUI.PropertyField(position, property, label);
}
}
接下来我们把RenameAtrribute放在要重命名的字段前,就可以应用它了
[Header("这是Header命名")]
public bool testHeader;
[Rename("自定义命名")]
public int test;
