[閱讀筆記] Unity のエディター拡張 #2

《Unity のエディター拡張》後所留下的簡單筆記,第六到八章。 前五章以介紹內建的 Editor 功能為主,六到八章開始進入了自訂 EditorGUI 的部分了,然後是 EditorWindow。

第六章:EditorGUI

  • EditorGUI 與 EditorGUILayout 這兩個類別與 4.6 以前,用於遊戲 run time 建立使用者介面的 GUI 類別功能相近,只是它可被用於 EditorWindow 上。
  • 相關 API:
    • EditorGUI.BeginChangeCheck / EndChangeCheck 用於檢查是否有數值變化,有則回傳 true。
    • EditorGUI.BeginDisabledGroup / EndDisabledGroup 用於繪製無法操作的區塊。
    • EditorGUILayout.BeginFadeGroup / EndFadeGroup 可以裁切掉特定高度外的 UI 元件。
    • EditorGUI.ObjectField 可以產生欄位用於拉動資源形成參照,依照資源類型有不同介面。
    • EditorGUI.MultiFloatField 多欄位的浮點數組合。
    • EditorGUI.indentLevel 配合 EditorGUILayout 使用,用於調整縮排。
    • EditorGUILayout.Knob 繪製旋鈕。(疑?官方文件中沒有這個阿?)
  • 關於 Scope
    • 用於在特定的彈性範圍內控制 GUI 參數。
    • Scope 繼承了 IDisposable 介面,透過 using 來控制影響範圍。
    • 內建的 Scope 有 HorizontalScope、VerticalScope、ScrollViewScope,實際上利用 EditorGUILayout.BeginHorizontal/EndHorizontal 之類的 API。
    • 可以繼承 GUI.Scope 來自訂 Scope。
  • 小技巧:
    • 利用 Toggle 欄位配合 button 的 GUIStyle,可以做出放開滑鼠後不跳起的按鈕開關。
    • EditorStyles 中可以呼叫內建各式元件的 GUIStyle,做出各種外觀與功能的組合。

第七章:EditorWindow

  • EditorWindow 為 ScriptableObject 的子類別,可以透過 CreateInstance () 來產生類別,也允許複數個相同視窗存在。
  • 如果只允許單數視窗,可以利用 Singleton pattern 或者使用 EditorWindow.GetWindow () 這個 API。
  • 其他有關開啟 EditorWindow 的 API:
    • ShowUtility () 將使視窗無法被拖動成為 tab。
    • ShowPopup () 會使視窗沒有上方工具列 (關閉視窗的按鈕等),需自行實作關閉視窗的手段。
    • ShowAsDropDown () 如選單般會自動調整位置,保證視窗整體都在螢幕內顯示。
  • 其他視窗類別:
    • ShowAuxWindow 是與 EditorWindow.ShowUtility () 效果相同的一個視窗類別。
    • PopupWindowContent 是一個可以繼承並作為彈出視窗的類別。
    • ScriptableWizard 會自動為類別中的 Serialized Field 提供編輯欄位,並不使用 OnGUI 作為 GUI 設定。
  • PreferenceItem 是一個用於添加選項至設定視窗的 attribute,對應的方法中直接編寫 GUI。
  • IHasCustomMenu 是一個增加選項至視窗右上方 menu 的 interface
  • 其他 API:
    • EditorWindow.minSize / maxSize 限制視窗的調整。
    • EditorWindow.titleContent 可以在標題處加上 icon。
  • 可用 Resources.FindObjectsOfTypeAll 取得其他視窗實體。
  • 因為 EditorWindow 是 ScriptableObject 的子類別,所以可以在腳本的 inspector 窗口設定 Serialized Field 的預設值。

第八章:MenuItem

  • MenuItem 是一個 attribute,對應到 static function,用於在 Unity Editor 的各個部分加上新的選單選項。
  • 依照添加的路徑,自訂的選項會顯示在不同地方:
    • 以 Assets 為開頭,會同時增加選項至上方工具列、project 視窗的右鍵選單。
    • 以 GameObject 為開頭,會同時增加選項至上方工具列、hierarchy 視窗的右鍵選單。
    • 以 CONTEXT 為開頭,會增加選項至 component 的右上齒輪選單。
  • priority 的設置:
    • 小的數字在上方。
    • 差距超過 11 的選項中間會出現分隔線。
  • Menu.GetChecked / SetChecked 可以實現選項前方的小勾勾。
  • MenuCommand 可以在 component 的右上選單的實作上取得更多資料 (來自何 component 之類的)。