03
2017
04

鍦║nity缂栬緫鍣ㄤ腑澧炲姞鑴氭湰鐨勪腑鏂囪鏄

        鍦ㄦ父鎴忎腑锛岀▼搴忥紝缇庢湳锛岀瓥鍒掔敋鑷抽煶鏁堥兘鏄垎宸ュ悎浣滅殑銆傚緢澶氭椂鍊欙紝瀵逛簬unity3d涓竴鍫嗚嫳鏂囷紝澶у閮戒細鐪嬪緱寰堥儊闂枫傚挨鍏舵槸涓嶅悓鐨勭▼搴忓憳锛屽懡鍚嶆柟寮忎篃涓嶅敖鐩稿悓锛岀敋鑷宠繕鏄敤鎷奸煶銆傚洜姝わ紝鍦ㄨ剼鏈腑澧炲姞涓浜涗腑鏂囨樉绀猴紝灏辫兘澶熷緢濂藉湴瑙e喅杩欎釜闂銆

        棣栧厛锛寀nity涓浜庡瓧娈(Field)宸茬粡鏈変簡寰堝ソ鐨勪腑鏂囨樉绀烘柟娉昜Header]鏍囩

        姣斿

using UnityEngine;
public class TestScript : MonoBehaviour
{
    [Header("鍙橀噺A")]
    public float A;
}

       鏄剧ず濡備笅

       浣嗘槸瀵逛簬[Header]锛屽畠鏈韩涓嶆敮鎸佸湪闈炲瓧娈典笂鍋氭爣绛撅紝鎵浠ユ兂鏄剧ず绫荤殑璇存槑鎴栬呯被鍑芥暟鐨勮鏄庡氨鏃犺兘涓哄姏浜嗐

        鏃㈢劧濡傛锛屾垜浠彲浠ュ垱寤轰竴涓嚜瀹氫箟鐨勬柊鏍囩MonoHeaderAttribute锛屽畠缁ф壙浜嶩eader锛屽苟涓旈檺鍒跺彧鑳藉湪绫诲拰鍑芥暟涓娿傚綋鐒讹紝鎴戜滑涔熷彲浠ヤ笉缁ф壙Header锛屽畬鍏ㄤ篃鍙互鑷繁鍐欎竴涓粎缁ф壙浜嶢ttribute鐨勬爣绛俱傛濊矾鏄竴鏍风殑銆傝繖閲岀敤鐨勬槸鍓嶈呫

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

        鐒跺悗unity涓垱寤轰竴涓猠ditor鐩綍锛屽湪editor鐩綍涓嬪垱寤烘樉绀鸿剼鏈琈onoDescriptionEditor锛岀户鎵夸簬Editor锛屽苟瀹氫簬CustomEditor鏍囩涓篗onoBehaviour銆傛敞鎰忥紝CustomEditor鐨勭浜屼釜鍙傛暟蹇呴』涓簍rue锛岃〃绀哄缁ф壙浜嶮onoBehaviour鐨勫瓙绫婚兘鏈夋晥銆

        鍦ㄥ叾OnEnable浜嬩欢涓紝閫氳繃鍙嶅皠鑾峰彇鍒癕onoHeaderAttribute鐨勪俊鎭紝鐒跺悗鍦∣nInspectorGUI鏄剧ず鍑烘潵銆傚綋鐒禡onoDescriptionEditor瀹屽叏鍙互鑷敱瀹氫箟锛岃繖閲屼娇鐢ㄤ簡HelpBox鏉ユ樉绀恒

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涓婂拰涓浜涘嚱鏁颁笂锛屽姞鍏ヤ簡涓浜汳onoHeader銆

using UnityEngine;

[MonoHeader("杩欐槸涓涓祴璇曡剼鏈細TestScript")]
public class TestScript : MonoBehaviour
{
    internal void Start()
    {
    }

    [MonoHeader("杩欐槸涓涓祴璇曞嚱鏁")]
    public void TestA()
    {
    }

    [MonoHeader("绗簩涓嚱鏁")]
    public void TestB()
    {
    }

    [Header("鍙橀噺A")]
    public float A;
}

        鏈缁堢粨鏋滄樉绀哄涓

         锛圥S锛氳瘯杩囩敤MonoHeader鏇夸唬Header鏉ヤ繚璇佺粺涓鎬э紝浣嗘槸Unity瀵逛簬瀛楁鍙Header锛屾渶缁堟病鏈夋晥鏋滐紝鏁匨onoHeader鐢ㄤ簬绫诲拰鏂规硶鐨勮鏄庯紝瀛楁鐨勮鏄庣敤Header锛

芦 涓婁竴绡 涓嬩竴绡 禄