這是一個關于強迫症的故事。Unity中如果沒有自定義腳本的Inspector,就會預設繪制出一個,不可編輯的腳本對應選取框。
這有什麼好處呢 ?滑鼠點選的時候,能夠在Project試圖裡定位腳本所在的檔案夾和位置。當然如果沒有,也可以滑鼠右鍵進行Editor Script。
如果我們override了OnInspectorGUI函數,除非調用base.OnInspectorGUI父類的方法,否則是不會繪制這個腳本選擇框的。UGUI自帶的元件,也都沒有繪制這個選擇框。
那麼,現在我需要自定義Inspector,并且還就是想要這個預設的腳本選擇框,該怎麼辦 ? 經過我的研究,雖然UGUI的源碼沒有答案,但我還是找到了一個實作的途徑。
先直接看代碼。
public abstract class BaseEditor : Editor
{
protected SerializedObject serializedTarget;
protected Object monoScript;
protected virtual void OnEnable()
{
this.serializedTarget = new SerializedObject(this.target);
this.monoScript = MonoScript.FromMonoBehaviour(this.target as MonoBehaviour);
}
protected void DrawMonoScript()
{
EditorGUI.BeginDisabledGroup(true);
EditorGUILayout.ObjectField("Script", this.monoScript, typeof(MonoScript), false);
EditorGUI.EndDisabledGroup();
}
}
- 首先,我們需要知道mono的腳本,其實是一個MonoScript類型的Asset,這個類型直接繼承TextAsset,作為文本檔案載入的。
- 其次,MonoScript.FromMonoBehaviour這個函數能夠通過MonoBehaviour對象,找到MonoScript對象。
- 最後,EditorGUILayout.ObjectField方法能夠繪制,一個Asset的選擇框。預設選擇的Project視圖裡的檔案,就是第二個參數。
- 有些坑的是,禁用一個控件狀态的函數,并不在EditorGUILayout裡面,而是在EditorGUI裡。BeginDisabledGroup 和 EndDisabledGroup。
現在,自定義Inspector的代碼,繼承BaseEditor,然後重寫OnInspectorGUI就可以了。
public override void OnInspectorGUI()
{
this.DrawMonoScript();
}
效果就是:
「很好看的Script預設框」