天天看點

「Unity3D」(1)自定義Inspector繪制預設Script

這是一個關于強迫症的故事。Unity中如果沒有自定義腳本的Inspector,就會預設繪制出一個,不可編輯的腳本對應選取框。

「Unity3D」(1)自定義Inspector繪制預設Script

這有什麼好處呢 ?滑鼠點選的時候,能夠在Project試圖裡定位腳本所在的檔案夾和位置。當然如果沒有,也可以滑鼠右鍵進行Editor Script。

如果我們override了OnInspectorGUI函數,除非調用base.OnInspectorGUI父類的方法,否則是不會繪制這個腳本選擇框的。UGUI自帶的元件,也都沒有繪制這個選擇框。

「Unity3D」(1)自定義Inspector繪制預設Script

那麼,現在我需要自定義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();
}
           

效果就是:

「Unity3D」(1)自定義Inspector繪制預設Script

「很好看的Script預設框」

繼續閱讀