在游戲中,程式,美術,策劃甚至音效都是分工合作的。很多時候,對於unity3d中一堆英文,大家都會看得很鬱悶。尤其是不同的程式員,命名方式也不盡相同,甚至還是用拼音。因此,在腳本中增加一些中文顯示,就能夠很好地解決這個問題。 首先,unity中對於欄位(Field)已經有了很好的中文顯示方法[Hea ...
在游戲中,程式,美術,策劃甚至音效都是分工合作的。很多時候,對於unity3d中一堆英文,大家都會看得很鬱悶。尤其是不同的程式員,命名方式也不盡相同,甚至還是用拼音。因此,在腳本中增加一些中文顯示,就能夠很好地解決這個問題。
首先,unity中對於欄位(Field)已經有了很好的中文顯示方法[Header]標簽
比如
using UnityEngine;
public class TestScript : MonoBehaviour
{
[Header("變數A")]
public float A;
}
顯示如下
但是對於[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; }
最終結果顯示如下
(PS:試過用MonoHeader替代Header來保證統一性,但是Unity對於欄位只認Header,最終沒有效果,故MonoHeader用於類和方法的說明,欄位的說明用Header)
轉載聲明www.codegize.com http://www.cnblogs.com/CodeGize