位置校正器工具主要會有兩個欄位
1.校正器的座標模式 (笛卡爾座標/極座標)
2.校正單位 (物體間隔/越大表示會校正的越遠)
3.角度分割 (將一整個圓圈切成幾格,只有在極座標模式中用的上)
以下就讓我們實際來看看這些功能要怎麼做吧!
—MenuItem
MenuItem是一個Attribute(先前提到的屬性標籤),用在靜態(Static)的函式之上,只要加了這個標籤就可以在編輯器當中直接呼叫該函式。
為了要做到今天想要的效果,我們需要先寫出具體上能夠對遊戲物件進行校準的函式。
雖然可能不是重點但還是稍微說明一下。
Mathf.Round是用來計算四捨五入結果的函式,這裡的話前後稍微做一些調整就可以把結果改為 "依照我們要的單位校正"。
下面的話則用到了Extension method,這是我在看先前
Freya Holmér的教學時看到的,如同截圖中註解所說的,他有點像幫Vector3擴充了一個方法出來,如此一來可以幫助你未來寫得更加直觀(雖然我沒有很習慣),另外要特別記得Extension method的第一個參數要寫 "this",代表你所擴充的類別,有興趣的人不妨看一下
官方說明(雖然我覺得C#的官方文件都寫得很拗口)。
接著讓我們看看MenuItem的部分
這邊大致有A和B兩個部分可以看
A部分是我們主要呼叫的函式,他會去把
Selection(我們在編輯器當中選取的所有東西)當中的每一個遊戲物件取出,並切對他們一一進行位置校正。
同時特別注意,如果你希望在校正後可以按Ctrl+z還原的話,那記得要跟Undo系統要求說要紀錄這些物件的變化(截圖中40行)。
B部分則是ValidateFunction,他是用來檢查A部分能不能執行的,在這裡他會去檢查Selection是否有選取到任何的GameObject。
(為選取任何物件時,選項暗下來,無法點擊)
(這裡選取了一些物件後就可以正常點擊了!)
這裡除了設定他的路徑外,我們也額外在後面加上了熱鍵的宣告,如果對熱鍵要怎麼設定有興趣的話,不妨看一下
官方的說明。
—EditorWindow
如果你想要另外再生出一個視窗來輔助工作的話,這時候我們就可以用上EditorWindow,以下讓我們先看一個簡單的範例。
(建議自訂的視窗都寫在Tools底下,比較整齊,另外跟上回一樣的,Editor相關的類別最好都放在Editor資料夾底下,因為它有著以下特性)
那接下來我們該試著讓它顯示我們需要的變數了。
(先宣告我們要的變數)
接著跟
上次的筆記很像,只是我們這次是把自己帶入SerializedObject當中,供其觀察,並在OnGUI(有點類似編輯器畫面中的Update)中將這些變數顯示出來。
讓我們看看實際效果。
需要的變數都到位了以後,接著我們就要來實際呼叫校正的函式了。
(在SnapSelections函式當中去區分不同座標系統的校正方法,笛卡爾座標的話就直接去用先前寫的Snapper.SnapTheThings)
我們順便看一下前面按鈕的部分,這裡寫了using (new EditorGUI.DisabledScope(Selection.gameObjects.Length <= 0))
這一段程式碼有兩個我想特別提的部分,第一個先提一下using,這玩意兒我們平常應該幾乎都是用在引入函式庫(像是using UnityEngine),但在這裡我們是拿它來當作一段
陳述,用來表示後面宣告的變數只會存在於這個區段。
此處我們只有在該按鈕的地方才會去判定是否符合該條件,因此這個判斷式也只會留在此處。
接著我們再來看看using當中的東西是什麼,我們在此宣告了一個
DisabledScope,當他裡頭所帶入的條件成立時它就會把下面顯示的東西調成Disable(暗下來,無法互動),讓我們看看一個範例。
這裡看到我完全沒有選取任何遊戲物件時,右方的視窗下半部也跟著暗了下來。
用using將它限縮在固定範圍內,除了因為之後用不上以外,另一方面也是為了避免DisabledScope影響到後面其他要顯示的東西。
好啦,我覺得到目前為止也寫得有點長了,剩下繪製座標網格,以及如何計算極座標的校正問題就留到下一次再繼續聊吧! 希望大家還喜歡這次的筆記分享