[閱讀筆記] 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 為主題,如何操作優先於解說實際底層。