在遊戲中,程序,美術,策劃甚至音效都是分工合做的。不少時候,對於unity3d中一堆英文,你們都會看得很鬱悶。尤爲是不一樣的程序員,命名方式也不盡相同,甚至仍是用拼音。所以,在腳本中增長一些中文顯示,就可以很好地解決這個問題。html
首先,unity中對於字段(Field)已經有了很好的中文顯示方法[Header]標籤程序員
好比編輯器
using UnityEngine;
public class TestScript : MonoBehaviour
{
[Header("變量A")]
public float A;
}ide
顯示以下
可是對於[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; }
最終結果顯示以下
(PS:試過用MonoHeader替代Header來保證統一性,可是Unity對於字段只認Header,最終沒有效果,故MonoHeader用於類和方法的說明,字段的說明用Header)htm