天天看點

開發unity插件——一次搞定unity編輯器常用功能開發unity插件——一次搞定unity編輯器常用功能

開發unity插件——一次搞定unity編輯器常用功能開發unity插件——一次搞定unity編輯器常用功能

這篇文章主要分享unity中與editor插件等相關的使用,比較基礎,不過如果都掌握了就可以擴充寫一些unity插件了,平時開發中也會提升工作效率。

editor相關腳本一定要放在editor檔案夾下,繼承monobehaviour的檔案不要放到editor檔案夾下。

首先常用的在繼承monobehaviour類中寫public變量可以在inspector中序列化可編輯一般人都知道了,下面是一些可以更有效率更酷的方法。

效果如下圖,對于一些有範圍的數值可以用range做個slider讓策劃來調節,可以用header和space來組織面闆的外觀,也可以針對不同的屬性進行是否序列化的選擇。

開發unity插件——一次搞定unity編輯器常用功能開發unity插件——一次搞定unity編輯器常用功能

也可以序列化一個類

開發unity插件——一次搞定unity編輯器常用功能開發unity插件——一次搞定unity編輯器常用功能

有時在monobehaviour中寫一些方法可以初始化一些值或者随機産生某個值這種需求,都可以在菜單中觸發,隻要簡單的加一行即可。

效果如下圖,點選init就會賦一個初始的值,點選randomvalue可以随機産生一個life的值,這就是最簡單的editor工具了

開發unity插件——一次搞定unity編輯器常用功能開發unity插件——一次搞定unity編輯器常用功能

如果要在inspector中加上一些更進階的功能就需要使用editor相關的方法了

這是要使用的testinspector類代碼

其中需要用onenable和ondisable來做初始化和清理工作,oninspectorgui方法可以類比monobehaviour中的ongui,做ui渲染和ui事件處理。

裡面還注冊了undo,好處是可以通過ctrl+z來進行撤銷操作,這樣才更完美更像一個完善的unity插件。

代碼也沒什麼難度,我也做了下簡單的注釋,執行一下看看效果大部分人就都了解了。效果如下圖

開發unity插件——一次搞定unity編輯器常用功能開發unity插件——一次搞定unity編輯器常用功能
開發unity插件——一次搞定unity編輯器常用功能開發unity插件——一次搞定unity編輯器常用功能

之前可以在monobehaviour中加入<code>[contextmenu("random value")]</code>來生成對應腳本元件面闆的上下文菜單,那麼如果要生成一個在transform元件上的菜單怎麼辦

效果如下圖,如果策劃或者美術需要對transform的position幹這種随機的事,是不是就可以這麼搞了?或者對collider、rigibody之類的元件加上一些屬性模闆的設定,會很友善吧

開發unity插件——一次搞定unity編輯器常用功能開發unity插件——一次搞定unity編輯器常用功能

在editor中加個菜單item是件很容易的事情,那麼如果這個菜單是可以勾選的呢?是不是可以解決一些開關的問題?

效果如下圖,其中需要一個菜單的valid函數來判斷菜單是否在勾選狀态,這裡用了playprefs,在windows上就寫到系統資料庫裡了

開發unity插件——一次搞定unity編輯器常用功能開發unity插件——一次搞定unity編輯器常用功能

這個菜單是加到了assets下面,那麼在project面闆中右鍵也可以看到,這種菜單可以幹什麼呢,我也沒想好,不過幹些修改assetsimport屬性或者修改一些資源等等還是挺好用的吧

一般這種菜單都可以通過<code>selection.activeobject/activegameobject</code>等等來擷取選中對象,當然也可以擷取多選的多個對象,這個看下api就知道了

開發unity插件——一次搞定unity編輯器常用功能開發unity插件——一次搞定unity編輯器常用功能
開發unity插件——一次搞定unity編輯器常用功能開發unity插件——一次搞定unity編輯器常用功能

這個菜單還是比較實用的,相對來說也不太一樣

将菜單加到gameobject下面,就可以在hierarchy裡右鍵看到了

開發unity插件——一次搞定unity編輯器常用功能開發unity插件——一次搞定unity編輯器常用功能

那麼基于這個菜單我們可以做個比較實用的功能,例如右鍵hierarchy中場景的一個gameobject并且對它進行setactive為true or false的操作,代碼如下:

其中做校驗的方法是為了在不選中gameobject的時候能夠将菜單灰掉。另外這種菜單可以綁定一個快捷鍵,這個例子是綁定了a鍵,菜單中也可以看出來。

最終效果就成了:我選中一個gameobject,隻要按下a鍵就可以setactive(false),再按下變成true,還是比較實用的吧,基于此可以做很多實用的東西。效果如下圖

開發unity插件——一次搞定unity編輯器常用功能開發unity插件——一次搞定unity編輯器常用功能
開發unity插件——一次搞定unity編輯器常用功能開發unity插件——一次搞定unity編輯器常用功能

對話框比較簡單,就是一些内置的api,具體可以檢視api,支援了例如簡單和複雜對話框、打開儲存檔案對話框、進度條等等功能

<code>editorutility.displaycancelableprogressbar("ok", "done", 0.7f)</code>

<code>editorutility.clearprogressbar();</code>

<code>editorutility.openfilepanel("open", "d:/", ".txt");</code>

開發unity插件——一次搞定unity編輯器常用功能開發unity插件——一次搞定unity編輯器常用功能
開發unity插件——一次搞定unity編輯器常用功能開發unity插件——一次搞定unity編輯器常用功能

如果要做的事情可能不是與某個gameobject相關,inspector不能滿足要求,那麼可以建立一個新的視窗,建立新的editor視窗需要繼承editorwindow,代碼如下

好像代碼也不複雜,也沒什麼難度就是常見的ui繪制,效果如下:

開發unity插件——一次搞定unity編輯器常用功能開發unity插件——一次搞定unity編輯器常用功能
開發unity插件——一次搞定unity編輯器常用功能開發unity插件——一次搞定unity編輯器常用功能

如果有更高的需求可能需要更深入的研究一下unity中editor的相關api和文檔

unity還提供了可以在scene視窗中做一些操作,例如畫一些輔助線、顯示label、操作handler等,具體可以參考

<a href="http://blog.csdn.net/kun1234567/article/details/19421471">http://blog.csdn.net/kun1234567/article/details/19421471</a>

如果把這些代碼執行一遍,改改調試一下,了解基本流程,那麼已經可以寫一些提高工作效率的unity插件了

繼續閱讀