[聚合文章] Unity中利用Editor显示中文属性

c# 2018-04-18 94 阅读

如何在Unity中显示中文属性,汉化你的脚本,更方便的修改脚本属性?这里利用Editor来实现。
先上效果图:

用法:
1.在Unity中新建一个Editor文件夹
2.在Editor文件夹下新建一个RenameEditor.cs脚本,把以下代码复制到脚本里。
Editor文件夹是Unity中的特殊文件夹,可以放在任意目录下,Editor下的所有文件包括脚本都不会被打包进发布版里

using UnityEngine;
using UnityEditor;

/// <summary>
/// 重命名属性编辑器
/// <para>ZhangYu 2018-04-18</para>
/// </summary>
public class RenameEditor : Editor {

    //需要重命名的键值对儿
    protected string[] renameKeyValues;
    protected string[] renameKeys;
    protected string[] renameValues;

    /// <summary> 设置需要重命名的属性和昵称 </summary>
    /// <param name="keyValues">键值对儿数组</param>
    /// <param name="separator">"key:value" 键值对儿分隔符</param>
    protected virtual void setRenameProperties(string[] keyValues, char separator = ':') {
        int length = keyValues.Length;
        renameKeyValues = keyValues;
        renameKeys = new string[length];
        renameValues = new string[length];
        for (int i = 0; i < length; i++) {
            string[] array = keyValues[i].Split(separator);
            renameKeys[i] = array[0];
            renameValues[i] = array[1];
        }
    }

    public override void OnInspectorGUI() {
        if (renameKeyValues != null) {
            //绘制新的属性名称
            EditorGUI.BeginChangeCheck();
            for (int i = 0; i < renameKeyValues.Length; i++) {
                SerializedProperty property = serializedObject.FindProperty(renameKeys[i]);
                if (property != null) EditorGUILayout.PropertyField(property, new GUIContent(renameValues[i]), true);
            }
            if (EditorGUI.EndChangeCheck()) serializedObject.ApplyModifiedProperties();
        } else {
            base.OnInspectorGUI();
        }
    }

}

3.在Editor文件夹下新建一个xxxEditor.cs脚本,继承自RenameEditor,并绑定你需要汉化的脚本。
举个例子:RenameTestEditor.cs
实现OnEnable()方法并调用setRenamePropetries(string[] keyValues)传入需要汉化的属性和名称

using UnityEditor;

[CustomEditor(typeof(RenameTest))]
public class RenameTestEditor : RenameEditor {

    private void OnEnable() {
        string[] keyValues = { "names:名称列表", "ages:年龄列表", "targets:目标列表" };
        setRenameProperties(keyValues);
    }

}

RenameTest.cs脚本代码:

using UnityEngine;

public class RenameTest : MonoBehaviour {

    public string[] names;
    public int[] ages;
    public GameObject[] targets;
    
}

PS:转载请注明:作者 冰封百度

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。