Unity 允許使用者實作自定義視窗,以實作項目更加靈活且系統的配置。例如關卡編輯器、打包編輯器等等。它是能做出最多自定義功能的,但是實作過程其實也是比較固定的。總得來說自定義視窗最重要的部分其實是視窗内GUI得布局和方法,也就是說你要在視窗裡做些什麼。
視窗類型
預設視窗(可與其他視窗合并):适合做編輯器視窗。
彈窗 (PopUp):适合做視窗分層。
對焦彈窗(DropDown,失去焦點自動關閉):适合提示類視窗,比如插件介紹。
輔助視窗(AuxWindow):說是能夠實作視窗重用,但是官網沒有執行個體,不清楚具體是怎麼實作重用的。
浮動視窗(UtilityWindow):所有不能被合并的視窗都叫浮動視窗
通知消息 (Notification):顯示在視窗上,會自動淡出。可以調用RemoveNotification()将其手動關閉。
繪制
繪制自定義視窗最重要的是要實作OnGUI函數和一個可供MenuItem調用的靜态方法(假設叫 Init 函數)。
OnGUI是自定義視窗類必須要實作的函數,其中實作具體布局和方法調用,決定視窗裡看起來是怎麼樣的以及能實作什麼功能。
Init函數其實是MenuItem的靜态函數,用來相應MenuItem的點選,其中主要設定一些視窗的屬性,比如大小、标題,位置等等。
重要API
EditorWindow:所有自定義視窗都要繼承自它
GUI、EditorGUI、GUILayout、EditorGUILayout:都是用來繪制控件的
上述四種差別:前兩種在繪制GUI的時候要傳入Rect來确定位置,比較死闆;後兩種能夠自動排版;有Editor字樣的有針對于Editor相關的控件。
最最最重要的
就是工具方法。最根源的問題,你為什麼要自定義視窗這才是最重要的。其他控件的繪制其實問題不大,最不濟去翻API文檔就能實作控件了。但如果工具方法寫不出來,一切都白搭。
另外,要注意投入産出問題,做擴充的原始目的是提高效率,如果你完成的功能可以通過其他方式較快實作,那就沒必要做擴充了。
反編譯成熟插件的視窗擴充
要熟悉一項技能最重要的是自己動手實踐,但是參看前人經驗也同樣重要。我們可以通過JetBrain的dotPeek對插件dll檔案反編譯成C#,這樣就可以參照學習了。