最近除了看了些Shader的教學外也跑去看了一下怎麼自製Unity開發者工具,今天就來跟大家分享一下最近的一些學習筆記吧!
什麼是開發者工具?
雖然一些如Unity的遊戲引擎已經提供給開發者功能相當多樣的編輯介面,但是有些時候我們還是會希望能為了各別的專案去增設一些額外的功能,例如可能今天團隊裡頭有著其他負責關卡設計的成員,但是他並不了解你做的遊戲物件該怎麼設置,這時候你就可以特別寫一個直接做好基礎設置的功能給對方。 (好吧,我承認這個例子好像沒有很好QQ)
開發者工具涵蓋的範圍很廣,簡言之,它代表額外做出來輔助開發者的工具,雖然對最終的遊戲內容沒有影響,但卻可以減少開發的負擔。(雖然你現在又多了開發編輯器工具的負擔)
那具體上來說該怎麼做呢?
我們先來看看三個常用到的簡單部分吧,分別是
——Gizmos(繪製輔助圖像)
——Attribute(屬性標籤)
——Custom Editor(自訂Editor視窗)
——Gizmos
直譯成中文的話是小玩意兒的意思,在Unity編輯器當中Gizmos可以用來繪製一些場景裡的輔助圖像,這些東西不會在實際遊玩的時候出現。
讓我們來假設一個情境吧,今天我們要製作一個範圍型的補包,他會在玩家碰到的時候治療某個範圍內的所有角色,因此這個補包會有兩個感應範圍——"補包的實際大小(感應玩家有沒有碰到)" 以及 "補包的治療區域(感應說哪些單位應該受到治療)"。
補包的實際大小基本上可以直接用Unity原本有的BoxCollider來顯示就好,讓我們先在場景中按 "右鍵->3D Object->Cube" 來創立一個方塊吧。
(這邊為了讓觸碰的感應範圍更明顯,刻意把Cube上頭原本附加的Box Collider的Size調大)
接著我們希望能在編輯模式下看清楚這個補包的治療範圍究竟有多廣,但是又不希望特別為了顯示這個範圍而額外附加另一個Collider來顯示邊界,這時候我們就可以在他身上加上Gizmos的程式碼,讓我們先來創立一個C#檔吧。
Gizmos的程式碼部分必須要寫在OnDrawGizmos或OnDrawGizmosSelected當中被呼叫,OnDrawGizmos有點類似我們在編輯畫面中的Update函式,會每幀呼叫,後者則一樣是編輯模式下不斷執行,只不過OnDrawGizmosSelected只會在你選到該物件的時後執行。(詳細可看
官方資料)
到此我們先來看看效果如何
現在除了原本BoxCollider提供的物體範圍外,我們也能額外看到Gizmos繪製的治療範圍!
如果想要弄的更顯眼的話我們也可以另外再調整Gizmos的顏色。
(其實可以直接繪製完後把Color設為預設的白色,但我想說可能你之後會前面想要先弄別的顏色)
另外介紹完Gizmos後我想要稍微提一下
Handles,就我的認知,後者跟Gizmos其實很像,不過它還可以被用在一些其他地方,例如你可能之後會想要讓這些輔助的圖像跟你的滑鼠做連動,那時候就會需要用到Handles,而我之前則是看
Freya Holmér的教學,她則是習慣乾脆全部都用Handles來繪製,不過說了那麼多,我們先來看一個Handles的簡單應用吧。
讓我們在剛才的OnDrawGizmos裡面再加幾行Handles的程式碼(這邊把半徑*1.2是為了避免繪製出來的線條疊在一起,難以區分)
(另外記得使用Handles的時候要先在最上面引入UnityEditor)
接著看一下最後的效果~
——Attributes
屬性標籤,其實Attributes算是C#本來就擁有的東西(
詳細),Unity這邊則又額外添加了許多預設屬性標籤,這邊先舉個應該算最常見的例子。
當我們在Unity裡的C#宣告了公開的變數時,我們就可以在Inspector的地方直接看到該變數的數值,且可以直接調動,那如果我們今天希望可以讓非公開(private,protected)的變數一樣也可以在Inspector當中調動呢? 此時我們可以額外增加屬性標籤
在這裡我們使用SerializeField標籤來讓private變數顯示在編輯器當中,同時也用HideInInspector將public變數藏了起來。 (序列化的意思簡單來說是把物體轉換為可被取用的格式,讓他可以保存起來且拿到別的機器上再還原……我也覺得聽起來很難懂,在此先記得說它可以讓Unity編輯器顯示出來就好)
接著我們再稍稍看幾個常見的(應該啦)Attribute標籤
想要認識更多Unity的Attribute標籤不妨到下面的文章看看
——Custom Editor
自訂編輯器,這項功能讓開發者有辦法特別針對自己的需求去客製化自己要的小視窗(Inspector等欄位)。
(史奈普是之前我看教學時做出來的小視窗)
讓我們繼續以剛才的補包為例吧,假設今天你要把補包設計成可以 "單體治療" 或 "全體治療" 呢? 當設為單體模式的時候,我們不希望讓開發者看到治療範圍的資訊,因此想要特別隱藏起來 (如以下影片)
這時候我們就可以來做個自訂的編輯器了,為此我們首先要先在名為Editor的資料夾中建立一個繼承於Editor的類別(聽起來好拗口XD),最初始的樣子大致如下。
第二張則是編輯畫面中看到的樣子,目前已經確認了我們有成功去調整原本的編輯器視窗。
到此先容我回頭去解釋一下上面提到的事情,剛才我在文中提到了CustomEditor的程式碼檔案要放在Editor資料夾底下(資料夾可自行建立),這一部分在我實驗後發現其實不是必要的,就算你建立在其他資料夾底下也還是能夠正常運作,不過還是會建議這麼做,因為Editor資料夾有著以下幾個特性:
OK,解釋完了Editor資料夾的問題後,我們接著就可以繼續寫自訂編輯器了……嗎?
其實現在還有個小問題,只是那個問題剛開始不會察覺到,讓我們先複製幾個剛才的補包並且全選。
此時你會發現只要全選起來你就無法去編輯這些補包的數值,而小視窗的欄位則會顯示 "Multi-object editing not supported." (不支援多物件編輯)
要解決這個問題我們就得要為CustomEditor另外再加上一個Attribute標籤——[CanEditMultipleObjects],藉此允許該Editor變成可以多物件修改的版本。
然而加上去後各位應該會發現剛才的問題依舊沒有被解決……
(此時的讀者:……等等,你是不是直接用了剛才的截圖)
……
好啦XD這邊是因為我有實驗過,並且懶得重新截圖才這麼做,不過為什麼加了那個標籤卻還無法多重編輯,原因是什麼我就不是很清楚了(而且我後來試著把之後修改的程式碼註解到跟剛剛內容一樣竟然又可以了)。
雖然不知道上面的方法為何失敗(而後來又不知為何成功),但是我之前看教學的時候確實有看過另一種解決辦法,而那個解決辦法也有利於我們等一下要做的效果。
讓我們先把預設的base.OnInspectorGUI()給註解掉吧,這一段要改成我們自己手動把要顯示的資料顯示出來,為此我們要先宣告一個SerializedObject(序列化的物件),以及多個SerializedProperty(序列化的變數),當你使用這些變數的時候,他們會自動幫你處理多重選擇以及Undo等等的問題 (Undo的部分在一般狀況下,想要ctrl+z回復上一步驟還得要特別去跟Unity註冊事件)。
序列化變數的初始化動作
然後你應該就能正常地對物件做多重選擇並修改了
現在我們已經有了跟原本差不多的編輯器功能,是時候加上前面說過的限制了,讓我們先宣告Enum來代表補包的類型
然後我們再去OnDrawGizmos那邊加入限制,場景中的繪製主要還是交給類別本身,而非管理它的CustomEditor。
這邊加完限制後我們再另外去自訂編輯器那邊加入補包類型的變數吧
最後再去顯示類型欄位,並且判斷說是否為範圍型的,只有符合時才會繪製半徑的欄位,然後就大功告成了!!
我們去編輯畫面中把玩這些補包,它應該會有以下效果。
……沒錯,這是剛才的影片
(讀者:你連梗圖的字都懶得改!)
那麼今天就先分享到這了,希望能為大家帶來幫助!
……是說我現在的筆記是不是越寫越長了呀QwQ