Unity3D使用經驗總結 編輯器擴展篇

一個引擎,最重要的就是工具,工具除了提升開發速度,提供可視化操作環境以外,還帶了容錯功能。 它使得大家的工作侷限在一定的範圍內,比如一個變量的配置,或者是一些類型的選擇。 使用編輯器,使得既使不太明白的人,也能快速找到方法。如果是採用手工配置的話,那每一個東西需具備相當完善的文檔,文件加載時,得提供高強度的錯誤效驗和錯誤提示功能。 否則很容易陷入困境。

UNITY3D的IDE本身的強大,除了表現在其提供的強大功能外,更讓人喜歡的,是它高度的可擴展特性。這也是一個項目開發中,必不可少的環節。 

 

關於編輯器擴展,網上也有很多資料提到了。並且,通過官方文檔,也能很容易查閱到想要的內容。 這裏只是作爲一個整理,並不是教程。

在此順便吐槽一下編輯器相關的官方文檔。 可以說非常亂,並且也不齊全。 比如 文檔中並沒有區分哪些是命令,哪些是類。

比如Editor是一個類,而CustomEditor是一個內嵌命令。 在文檔中並未體現。 有時候讓人摸不着頭腦,同時也沒有地方可以全部瞭解到所有可用的內嵌命令。

 

BTW:新安裝的系統沒有安裝BLOG工具,貼圖不方便,所以文檔中使用的圖,都是網上找的。

先說說幾個常用的命令吧。

 

CustomEditor

使用方式

[CustomEditor(YouScript)] C#

@CustomEditor(YouScript) JS

這個是比較常用,用於對對象界面的擴展,比如一個對象的屬性,可以像下面一樣 注意damage和armor只是一個普通變量,而現在,我們可以讓使用者使用拖動的方式來配置。 這樣就限制了變量的範圍。

 

ExecuteInEditMode

[ExecuteInEditMode]

@ExecuteInEditMode

這個功能可以說是相當霸氣的。 想想這樣一種情況,我們配置了一個怪物,這個怪物有攻擊範圍,偵測範圍。 我們想要在編輯器中顯示出來。 怎麼辦呢?

當然,我們通過CustomEditor命令和Editor類可以很容易地實現這個功能。 但是,有時候又覺得挺麻煩。 那ExecuteInEditMode就是解決這個問題的。

Unity3D在默認情況下,會執行處於Editor模式下的代碼,而這個代碼,是不會打包到發佈後的程序中的。 而在其它地方的代碼,只有掛接到對象上,且在PLAY模式下才執行。

但,如果加上了這個ExecuteInEditMode命令,一但你將對象放入場景,這段代碼便會執行。 通常我們可以拿來做一些變量的顯示。

但要記得,在腳本中,變量顯示的代碼記得用

#ifdef UNITY_EDITOR

#endif

來封裝一下,否則你遊戲裏面一樣可以看到你的代碼。

 

MenuItem

[MenuItem("MenuName")]

@MenuItem("MenuName")

這個就更不用說了,這個命令也是比較常用的。這個的功能很簡單,就是向菜單柵添加一個菜單,執行一些操作。 比如,在程序開發過程中,我們想做點測試,點擊一下,就觸發一段代碼。 我們可以像這樣。

[MenuItem("Test")]

static OnTestMenuClick()

{

   //do something you need.

}

可以說是相當方便…… MenuItem同樣可以在遊戲模式和Editor下使用。比如,我們弄了一個屬性編輯器的窗口,想讓這個窗口通過菜單彈出來。

那可以將下面代碼加到屬性窗口中

 

class PropEditorWindow:EditorWindow

{

...

[MenuItem("Test/PropEditorWindow...")]

static PropEditorWindowClick()

{

  PropEditorWindow window = (PropEditorWindow) EditorWindow.GetWindow(typeof(PropEditorWindow));

}

....

}

 

AddComponentMenu

[AddComponentMenu("111/222")]

你自定義了一個腳本,並且這個腳本很常用,那你可以使用這個命令,把腳本加到Component菜單中,不用再在去Scripts堆裏翻了

 

下面來說說相關的類

Editor

這個類,用於擴展一些編輯器全局的功能。 且這個類可以和目標對象作用 [CustomEditor(MyScript)].

在Editor類裏,可以重寫OnInspectorGUI(這個用得是比較多的)等方法。

 

EditorWindow

這個類,用於自定義一個窗口,你可以爲窗口添加一些按鈕,選項等。 比如,如果你想弄一個任務編輯器,用於配置一些數據。 那你不需要去研究MFC,C# FORM什麼的了。 直接用UNITY3D的這個東西吧。 

 

它有一個OnSceneUI的事件可以監聽,可以使你實現像自已的編輯器一樣,在SCENE中點擊某個物體後,在鼠標位置顯示一個菜單,或者一些操作按鈕。

另外,還有一個比較適用的事件是 OnHierarchyChange.當一個對象的父被改變,或者被新建的時候,這個事件會被觸發。我們可以通過這個事件,對對象進行重新命名, 比如 ID_OBJECT的方式。 要不然,整個對象樹中,同一個PREFAB的實例都是一樣的,不利於編輯和管理。通過ID鑑別,在數據驅動的開發模式中,也更容易得到幫助。

EditorApplication

這個類提供了許多變量的訪問,同時提供了Save等方法。 比如,你可以新建一個編輯器腳本,在它的UPDATE函數裏,進行記事,以做定時保存。從而避免不必要的損失。

這個類還提供了新建場景,打開項目等操作。

如果你是在界面下使用UNITY3D,可能這個類的意義不大。 但如果你是基於U3D的命令行來構建一個一鍵式多平臺發佈方案。那這個類的地位就舉足輕重了。 說到命令行,這個改天有空再和大家細說。 U3D是一個強大的工具,完全可以取代自主研發的引擎。 不管是從自動化部署還是自定義工具上,都很強大。 關鍵看你打不打算花時間去這樣用。

BaseHierarchySort

在Hierarchy中,所有對象默認是按首字母排序。 如果我想根據創建日期,或者是根據地理位置,又或者根據對象類型來排序,如何做呢。 這就需要用到BaseHierarchySort,我們可以重寫它的Compare方法,同時,我們添加幾個菜單來做切換。就能使我們的工作很加便利了。

 

EditorUtility

一看明字就知道,這貨肯定提供了不少全局函數,並且多半是靜態的。比如,你想彈出一個打開文件的對話框,或者保存文件的對話框。或者你要查看場景樹中的某個對象是enable與否,都可以通過它來訪問。更好的是,他還提供了一個彈出對話框。 你想做一些讓用戶選擇是否確定的,或者顯示一個About,可以使它。

 

FileUtil

這個類提供了一些文件拷貝,移動位置等操作,在命令行模式進行自動佈署的時候,使用居多。

 

Help

在你的編輯器中,如果你覺得你的文字不足以表達,或者需要用戶查詢相關文檔,那你可以使用HELP,它提供了打開網頁地址的功能。

 

ObjectPreview

這個類提供了你當前選擇的對象數據。 比如,在上面顯示攻擊和偵測範圍的例子中,如果我們只是想讓選中的單位才顯示預覽,那我們可以通過這個類的target來判定。

 

Tools

這個類提供了對象批量查找功能,比如,如果我們的工具,想對某一類對象進行打包。 那我們直接使用FindObjectsOfType,拿到所有的對象即可。 TOOL還提供了實例化對象的功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章