在游戲中,程序,美術,策划甚至音效都是分工合作的。很多時候,對於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)

