Unity編輯器開發,使用CustomEditor增長腳本的中文說明

        在遊戲中,程序,美術,策劃甚至音效都是分工合做的。不少時候,對於unity3d中一堆英文,你們都會看得很鬱悶。尤爲是不一樣的程序員,命名方式也不盡相同,甚至仍是用拼音。所以,在腳本中增長一些中文顯示,就可以很好地解決這個問題。html

        首先,unity中對於字段(Field)已經有了很好的中文顯示方法[Header]標籤程序員

        好比編輯器

using UnityEngine;
public class TestScript : MonoBehaviour
{
    [Header("變量A")]
    public float A;
}ide

   顯示以下
image

 

        可是對於[Header],它自己不支持在非字段上作標籤,因此想顯示類的說明或者類函數的說明就無能爲力了。函數

        既然如此,咱們能夠建立一個自定義的新標籤MonoHeaderAttribute,它繼承於Header,而且限制只能在類和函數上。固然,咱們也能夠不繼承Header,徹底也能夠本身寫一個僅繼承於Attribute的標籤。思路是同樣的。這裏用的是前者。測試

using System;
using UnityEngine;
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MonoHeaderAttribute : HeaderAttribute
{
    public MonoHeaderAttribute(string header) : base(header)
    {}
}

 

        而後unity中建立一個editor目錄,在editor目錄下建立顯示腳本MonoDescriptionEditor,繼承於Editor,並定於CustomEditor標籤爲MonoBehaviour。注意,CustomEditor的第二個參數必須爲true,表示對繼承於MonoBehaviour的子類都有效。3d

        在其OnEnable事件中,經過反射獲取到MonoHeaderAttribute的信息,而後在OnInspectorGUI顯示出來。固然MonoDescriptionEditor徹底能夠自由定義,這裏使用了HelpBox來顯示。code

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(MonoBehaviour), true)]
public class MonoDescriptionEditor : Editor
{
    private string m_res;

    public void OnEnable()
    {
        m_res = "";
        var type = target.GetType();
        var atts = type.GetCustomAttributes(typeof(MonoHeaderAttribute), true);
        if (atts.Length <= 0)
            return;
        var att = (MonoHeaderAttribute)atts[0];
        m_res = att.header + "\n";
        var methods = type.GetMethods();
        foreach (var method in methods)
        {
            var matts = method.GetCustomAttributes(typeof(MonoHeaderAttribute), true);
            if (matts.Length > 0)
            {
                var matt = (MonoHeaderAttribute)matts[0];
                if (method.DeclaringType != null)
                    m_res += $"\n{method.DeclaringType.Name}.{method.Name}\n{matt.header}\n";
            }
        }
    }

    private static bool s_fold = true;
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        if (string.IsNullOrEmpty(m_res))
            return;
        var color = GUI.color;
        GUI.contentColor = Color.cyan;
        s_fold = EditorGUILayout.Foldout(s_fold, "說明");
        if (s_fold)
            EditorGUILayout.HelpBox(m_res, MessageType.Info);
        GUI.contentColor = color;
    }
}
    
    回到TestScript,加入一些測試代碼。在class上和一些函數上,加入了一些MonoHeader。
using UnityEngine;

[MonoHeader("這是一個測試腳本:TestScript")]
public class TestScript : MonoBehaviour
{
    internal void Start()
    {
    }

    [MonoHeader("這是一個測試函數")]
    public void TestA()
    {
    }

    [MonoHeader("第二個函數")]
    public void TestB()
    {
    }

    [Header("變量A")]
    public float A;
}
    
    最終結果顯示以下
image
 

         (PS:試過用MonoHeader替代Header來保證統一性,可是Unity對於字段只認Header,最終沒有效果,故MonoHeader用於類和方法的說明,字段的說明用Header)htm

轉載聲明www.codegize.com  http://www.cnblogs.com/CodeGizeblog

相關文章
相關標籤/搜索