在Unity編輯器中增加腳本的中文說明

来源:http://www.cnblogs.com/CodeGize/archive/2017/04/03/6661507.html
-Advertisement-
Play Games

在游戲中,程式,美術,策劃甚至音效都是分工合作的。很多時候,對於unity3d中一堆英文,大家都會看得很鬱悶。尤其是不同的程式員,命名方式也不盡相同,甚至還是用拼音。因此,在腳本中增加一些中文顯示,就能夠很好地解決這個問題。 首先,unity中對於欄位(Field)已經有了很好的中文顯示方法[Hea ...


        在游戲中,程式,美術,策劃甚至音效都是分工合作的。很多時候,對於unity3d中一堆英文,大家都會看得很鬱悶。尤其是不同的程式員,命名方式也不盡相同,甚至還是用拼音。因此,在腳本中增加一些中文顯示,就能夠很好地解決這個問題。

        首先,unity中對於欄位(Field)已經有了很好的中文顯示方法[Header]標簽

        比如

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

   顯示如下
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的子類都有效。

        在其OnEnable事件中,通過反射獲取到MonoHeaderAttribute的信息,然後在OnInspectorGUI顯示出來。當然MonoDescriptionEditor完全可以自由定義,這裡使用了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上和一些函數上,加入了一些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)

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 設計模式(Design pattern):指的是一種大多數人反覆使用的代碼設計經驗。 作用:代碼復用、易讀性、保證代碼可靠性。 一、簡單工廠模式 用法:創建一個工廠類(命名習慣以Factiory結尾),一個靜態的帶參數(根據不同的參數返回不同的子類對象)的父類類型的方法。 public class ...
  • 記錄點點滴滴知識,為了更好的服務後來者! 一、為什麼使用AutoFac? 之前介紹了Unity和Ninject兩個IOC容器,但是發現園子里用AutoFac的貌似更為普遍,於是捯飭了兩天,發現這個東東確實是個高大上的IOC容器~ Autofac是.NET領域最為流行的IOC框架之一,傳說是速度最快的 ...
  • 1.看到標題首先要想到三層架構是什麼? 三層架構其實為: ①表示層:負責接收用戶的輸入,將輸出呈現給用戶, 以及訪問安全性驗證,並對輸入的數據的正確性、 有效性及呈現樣式負責,但對輸出的數據的正確性 不負責。 ②業務邏輯性:負責系統領域業務的處理,負責邏輯性數據的生產、 處理及轉換。對所輸入的邏輯性 ...
  • (一)概述 數組的大小是固定的。如果元素個數是動態的,就應使用集合類。 List<T>是與數組相當的集合類。還有其它類型的集合:隊列、棧、鏈表、字典和集。 (二)列表 1、創建列表 調用預設的構造函數,就可以創建列表對象。在泛型類List<T>中,必須為聲明為列表的值指定類型。使用預設構造函數創建一 ...
  • 概念引入 ●什麼是介面? 介面是包含一組虛方法的抽象類型,其中每一種方法都有其名稱、參數和返回值。介面方法不能包含任何實現,CLR允許介面可以包含事件、屬性、索引 器、靜態方法、靜態欄位、靜態構造函數以及常數。但是註意:C#中不能包含任何靜態成員。一個類可以實現多個介面,當一個類繼承某個介面時,它不 ...
  • 界面http://localhost:你的伺服器/Code/index 實現步驟: 註冊賬號https://www.geetest.com 新增驗證 下載demo (url:http://docs.geetest.com/install/server/csharp/) 找到C#的SDK .dll g ...
  • 使用Microsoft.NETCore.Portable.Compatibility會破壞該類庫在Mono和Xamarin平臺的相容性 可能導致的問題 和 無法安裝程式包“Microsoft.NETCore.Jit 1.0.2” ...
  • 跨平臺系列彙總:http://www.cnblogs.com/dunitian/p/4822808.html#linux 在說正式步驟前先把準備工作做到位: 1.IP設置,這個因為是GUI的,手動設置一下就好了,如果想知道命令行的方式看這篇文章:(http://www.cnblogs.com/dun ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...