1. 程式人生 > >Unity3D使用經驗總結 編輯器擴充套件篇

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還提供了例項化物件的功能。

目前我在U3D使用的過程中,接觸的大概就是這些東西…………另外,關於AssetBundle相關的東西,會專門講解~

相關推薦

Unity3D使用經驗總結 編輯擴充套件

一個引擎,最重要的就是工具,工具除了提升開發速度,提供視覺化操作環境以外,還帶了容錯功能。 它使得大家的工作侷限在一定的範圍內,比如一個變數的配置,或者是一些型別的選擇。 使用編輯器,使得既使不太明白的人,也能快速找到方法。如果是採用手工配置的話,那每一個東西需具備相當

Unity3D編輯擴充套件——EditorWindow互動響應事件 轉載: 海王星很危險

  重點:需要在OnGUI方法裡監聽事件 Unity的編輯器介面中由這麼一些事件: EventType         MouseDown //滑鼠按下     &nbs

Unity 編輯擴充套件總結 一:編輯開發入門

編輯器擴充套件總結 工欲善其事必先利其器 引言: 在專案開發中,編輯器擴充套件為開發者提供了開發自定義工具的功能,讓開發者更加便利地使用編輯器開發專案。近期小生一直在學習編輯器擴充套件的知識,發現網路上關於編輯器知識點的部落格較為零散且混亂。當然,有一些大佬已經總結的很

Unity3D編輯擴充套件——EditorWindow生命週期

整理了一下EditorWindow開放出來的生命週期   OnEnable():當開啟介面的時候呼叫   OnFocus():當被聚焦的時候呼叫   OnGUI():當渲染UI的時候呼叫   OnSelectionChange():當選擇發生更改時呼叫,選中的可選項(

Unity3D編輯擴充套件——EditorWindow互動響應事件

Unity的編輯器介面中由這麼一些事件:  EventType         MouseDown //滑鼠按下         MouseUp //滑鼠擡起         MouseMove //滑鼠移動(沒觸發成功)         MouseDrag//滑鼠拖

Unity3D編輯器擴充套件(五)——常用特性(Attribute)以及Selection類 Unity3D編輯器擴充套件(一)——定義自己的選單按鈕 Unity3D編輯器擴充套件(二)——定義自己的視窗 Unity3D編輯器擴充套件(三)——使用GUI繪製視窗 Unity3D編輯器擴充套件(四)—

前面寫了四篇關於編輯器的: Unity3D編輯器擴充套件(一)——定義自己的選單按鈕 Unity3D編輯器擴充套件(二)——定義自己的視窗 Unity3D編輯器擴充套件(三)——使用GUI繪製視窗 Unity3D編輯器擴充套件(四)——擴充套件自己的元件 今天我們來講解在編輯器擴充套件中我們常用的特

[Unity3D]編輯擴充套件之陣列或List顯示

  之前一直使用迴圈的方式建立,現在找到了一種更簡便的方法,效果和Inspector面板上是一模一樣的。省事了ヾ(Ő∀Ő๑)ノ太好惹! 效果如下: 原始碼如下: using System.

Unity3D編輯擴充套件--自定義建立圓錐體

前言 這幾天琢磨著開發個個人作品的時候,發現原來Unity3D官方沒有提供圓錐體的建立功能,就自己做了個編輯器擴充套件。鑑於之前搜尋Mesh程式設計的時候很少有部落格把自己的演算法講清楚,這裡我拋磚引玉,盡我所能為一些初學者提供參考,當然,演算法未必優,如有更

Unity3D Editor 編輯擴充套件實戰 指令碼編譯完成後設定回撥函式

環境:Unity2017.2 語言:C#總起:今天同事在做自動化的工具,需要在指令碼編譯完成之後回撥一個函式。我在Google上找到UnityEditor.Callbacks.DidReloadScripts這個標籤可以在編譯完成後,Unity自動幫忙回撥。但是這樣很麻煩,可

Unity3D Editor 編輯擴充套件3 Editor指令碼

Unity3DEditor編輯器擴充套件3 Editor指令碼環境:Unity2017.2 語言:C#總起:在編輯Unity專案的時候,總不可能避免的接觸到Unity自身自帶的Inspector引數調整無法很好的完成某些特定功能的情況。比方說想要一個按鈕直接能跳到遊戲的主介面

unity3D編輯擴充套件

編輯器擴充套件只是在編輯專案中執行,釋出出來是不會執行的。固定建立一個資料夾Editor:所有的資源或者程式碼都不會被打包進去。01、使用MenuItem新增選單欄按鈕       指令碼不需要作為元件存在,可以不用繼承MonoBehaviour       如何刪除引用(每

unity3D 編輯擴充套件,MenuItem 和 ContextMenu 的使用方法

首先是unity頂部選單欄的一些用法,如圖: 注意:MenuItem是編輯器類,所以技能匯入 using UnityEditor; 名稱空間,且一般我們的類也不是整合自MonoBehaviour的,而是整合ScriptableObject的。

unity 編輯 ---獲取unity編輯中的所有視窗,並開啟顯示,以備後面編輯擴充套件

獲取原理:unity 所有視窗介面都繼承自編輯器UnityEditor程式集下的EditorWindow。而所有的編輯器視窗都在UnityEditor程式集裡定義,所以,我們通過反射獲取UnityEditor程式集獲取所有視窗就可以了。 直接上程式碼: using System; using

unity編輯擴充套件#2 GUILayout、EditorGUILayout 控制元件整理

  GUILayout 裝飾類控制元件: GUILayout.FlexibleSpace(); GUILayout.Space(100);//空格,沒什麼好說的 GUILayout.Label("label"); GUILayout.Box(new GUICo

unity編輯擴充套件#1 自定義視窗、面板、和屬性

擼一遍unity官方文件的給的三個案例:https://docs.unity3d.com/2017.4/Documentation/Manual/editor-EditorWindows.html 自定義視窗 首先,要注意和編輯器相關的指令碼都應該把放到Editor資料夾裡,可以有多個E

Unity3D 自定義編輯介面(Inspector)

今天看一個指令碼,本想看看在 Inspector 介面的變數在腳本里的用途,然後查詢變數名的時候怎麼也找不到,自己也是驚訝。通過網上搜索才瞭解到原來 Inspector介面 是可以自己定義的。 當然自己定義,當然也需要寫一個指令碼來改的。可能是為了讓介面整潔的目的。 首先

unity-Editor AssetBundle打包等編輯擴充套件工具整理

整理一些unity方便的快捷操作工具 因為在編輯擴充套件工具,因此指令碼必須放在Editor目錄下,並且引用相應的庫 這裡我把我使用到的庫全放出來 using System; using System.Collections.Generic; using System.IO; using

Unity編輯擴充套件:如何把asset 格式的資源轉成png

Assets Store 上提供了大量的優秀素材給開發者使用,包括模型貼圖UI音樂等等。但是一些上傳者可能出於特殊原因,上傳的素材格式是unity內建的.asset 格式,這樣的格式對於直接拿來在unity中使用的開發者當然沒有影響,但是遇到素材本身不是完全符合需求,需要做一些修

Unity編輯擴充套件:如何把圖集(Atlas)拆分成單個圖片

遊戲開發中可能會用到商店下載的圖集,但是如果只是用到一部分,卻把整個圖集打包到專案則明顯是不划算的。可以讓美術同事單獨把需要的圖片切出來,但是圖源比較多的話也是一個不小的工作。既然能夠拿到切好的圖集資料,是不是可以通過程式碼自動生成切好的小圖呢,答案當然是肯定的。這裡提供一個小工具,操作

Unity編輯擴充套件

(我們自己寫的指令碼放在 Editor檔案裡(Editor 自己建立 跟建立Scenes檔案一樣))1 增加簡單選單欄(第一排選單欄)(我們使用靜態方法便於呼叫     不用靜態方法   我們Unity不能顯示出來)public Class  Tools  {   [Menu