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

閱讀《Unity のエディター拡張》後所留下的簡單筆記,第一到五章。 這是日本 Unity 技術人員 安藤圭吾 針對 Unity Editor 所寫的一本電子書,可透過下方連結看到原文。

第一章:簡介

  • 諸多 Editor 相關的 API 位於 UnityEditor 這個 namespace 下,是只能在 Unity Editor 中使用,無法用於專案輸出。
  • 如果使用了 UnityEditor 這個 namespace 下的 API,腳本放在名為 Editor指定名稱資料夾中,避免專案進行輸出時出現錯誤。
  • Editor 資料夾可以為複數個,也沒限定位置。
  • 另外也可利用 UNITY_EDITOR 這個 Symbol 來防止專案進行輸出時出現錯誤。
  • 另有指定名稱 Editor Default Resources 的資料夾,限制必須位於最上層。
  • Editor Default Resources 本來是用於置換預設資源的資料夾,但也可做為 Editor 的資源資料夾,用 EditorGUIUtility.Load 來讀取。
  • EditorGUIUtility.Load 必須使用以 “Assets/…” 為開頭,包含檔案副檔名的完整路徑,與 Resources.Load 需做區分。

第二章:用 Inspector 的內建 Attribute 修改編輯器

  • 參數部分
    • Range 針對單一數值給予範圍限制,編輯器多一條拉桿。
    • Multiline / TextArea 替換 string 的編輯器為多行版本。
    • ContextMenuItem 為參數增加右鍵選單。
    • ColorUsage 更改與限制 Color 參數的編輯器樣式。
  • 編輯器顯示部分
    • Header 加上一段粗體小標題。
    • Space 加上一段指定高度大小的空白。
    • Tooltip 游標停在參數上會顯示一段文字的浮動窗。
    • HideInInspector 隱藏對應參數在編輯器的顯示。
  • Component 部分
    • RequireComponent 要求該 Component 需依賴於其他特定 Component 才能使用,也可防止被依賴的 Component 被移除。
    • DisallowMultipleComponent 不允許一個物件上有多個相同的指定 Component。
  • 其他
    • FormerlySerializedAs 用於指定 Serialize 參數對應的資料名稱,即使變數名稱被修改也不會遺失原本的設定值。
    • AddComponentMenu 讓自訂的 Component 可在 AddComponent 的選單中顯示。
    • ExecuteInEditMode 使部分 Message 函式在 Non-Play 模式也會被運行。
    • ContextMenu 在 Component 的右鍵選單中增加選項。
    • SelectionBase 讓對應的物件在場景中更優先被選擇。

第三章:資料的保存

  • 共用於所有專案,關於 Unity Editor 的設定,會保存在電腦某個地方。
  • EditorPrefs.Get / SetXXX 可以用來讀取或寫入這份設定檔。
  • 專屬於專案的設定檔,會保存在 Library/EditorUserSettings.asset,而且有簡單加密。
  • EditorUserSettings.Set / GetConfigValue 可以用來讀取或寫入這份設定檔。
  • ScriptableObject 可以將一個類別與其成員的值,儲存為一個獨立 Asset 在專案之中。
  • 5.3版的新功能 JsonUtility,使用上有限制,且效能不好建議少用。

第四章:ScriptableObject

  • ScriptableObject 是一種可自訂的 Asset。
  • ScriptableObject 同時也在編輯器中無所不在,GameView、EditorWindows 都是其子類別。
  • 必須使用 ScriptableObject.CreateInstance 來實例化,才能註冊到 Unity 的管理機制中運作。
  • 相關 API
    • AssetDatabase.CreateAsset 將實例儲存為專案資源檔。
    • 儲存後需要用 AssetDatabase.ImportAsset 或 AssetDatabase.Refresh 註冊資源檔的資訊。
    • AssetDatabase.LoadAssetAtPath 從資源檔案讀取 ScriptableObject。
    • AssetDatabase.AddObjectToAsset 可以操作檔案間的 關聯 (Referance,可想成拖曳檔案至 Inspector 對應變數欄位中的這個動作)。
  • 建立親子關係的 ScriptableObject,在 Project 視窗也會呈現階層的結構,此時可以使用 hideFlags = HideFlags.HideInHierarchy 將子物件隱藏。
  • 在 Gizmos 資料夾中,以 **[類別名稱] Icon **命名圖片,會自動作為對應 ScriptableObject 的 icon。

第五章:SerializedObject

  • SerializedObject 是 UnityEngine.Object 與資源檔案的中間橋梁,作為檔案時將資訊以 meta 檔儲存。
  • 關於 Serialized:https://docs.unity3d.com/Manual/script-Serialization.html
  • 在 Editor 中,Undo 與 Selection 皆是透過 SerializedObject 來實現。
  • 在 Editor 中,透過存取 SerializedObject 中的 SerializedProperty,來進行專案內容的編輯與控制。
    • (反過來說,不是 SerializeField 是無法透過 Editor 控制的)
  • 如果開啟了一個 Editor Windows,則對於專案的 UnityEngine.Object 會透過另一個獨立的 SerializedObject 控制,不同 Editor Windows 之間,或者自訂 Editor 與原生 Editor 之間的同步需要注意。
    • serializedObject.Update () 可以重新進行資料更新。
    • serializedObject.ApplyModifiedProperties () 可以對資料更動進行寫入。
    • SerializedObject.GetIterator () 用於處理陣列。

小筆記

  • 第五章感覺只算是簡單帶過,很多細節並沒有深入解釋,可能因為本書以 Editor 為主題,如何操作優先於解說實際底層。