Unity 專案中 *.meta 做什麼用
最近團隊有人詢問 Unity 的 GUID 機制,在思考回答的過程中,順便把它整理成這篇筆記。如果要尋找能夠與工程團隊合作的 Unity 工程師,我想這一題應該會列在考題之中,meta 檔是做什麼用的?如果能回答出 Unity GUID 追蹤資源的機制,相信已經能夠滿足團隊合作的其中一項條件 (或是進入團隊後再教學)。
編輯器前置設定
在每次建立新專案後,都應該重新檢查以下設定,Edit > Project Settings > Editor:
Version control mode 修改成 Visible meta files,確保專案中 Unity 會為每一個在 Assets 資料夾裡頭的資源 (Assets),建立其可見對應的 *.meta。注意:版本控制使用 SVN, Git 通常是使用 Visible meta。
Asset serialization mode 修改為 Force text,確保可進行版本控制比較,以及可以讓第三方編輯器編輯資源檔案。
Meta 放些什麼資料
以下整理分兩大塊,GUID 以及資源的匯入參數 (Importer settings)。
- GUID
Unity 是利用 GUID 來追蹤每項資源 (Assets) 的參照 (Reference),因此會為每項資源建立專案中唯一的 GUID,並紀錄在該資源的 meta 檔案中 (必須搭配前置設定)。
GUID 若因為人為操作失當,例如在檔案總管複製遊戲專案中的資料夾,而導致專案中出現相同 GUID 的資源,Unity 會根據其資源最後修改的時間,將較新的資源重新賦予新的唯一 GUID,並且在編輯器中跳出警告訊息:
The GUID for Assets/ExampleA.png is already in use by Assets/ExampleB.png. Assigning a new guid.
若專案資料夾透過 Symbolic link 引用其他資料夾檔案,Unity 也會很貼心丟出提示訊息:
Assets/Example is a symbolic link. Using symlinks in Unity projects may cause your project to become corrupted if you create multiple references to the same asset, use recursive symlinks or use symlinks to share assets between projects used with different versions of Unity. Make sure you know what you are doing.
在 Unity 中使用 GUID 來取得資源路徑以及資源實體參照的相關 API 整理:
- string AssetDatabase.GUIDToAssetPath(string guid)
- string AssetDatabase.AssetPathToGUID(string path)
- T AssetDatabase.LoadAssetAtPath
(string path) - string AssetDatabase.GetAssetPath(object assetObject)
可以用以下關係圖表示:
- 匯入參數 (Importer settings)
各式資源匯入到 Unity 中的使用參數,例如貼圖資源 (Textures),其 meta 紀錄在各個平臺 (Platforms),該貼圖要是用什麼貼圖壓縮格式。
較常見共同參數例如 AssetbundleName 以及 AssetBundleVariants,除了使用 Unity editor 進行編輯以外,也可以透過第三方的編輯器編輯 (必須搭配前置設定),例如使用 Notepad++ 搭配 Regex 取代指定資料夾中所有 meta 的資料。
另外匯入參數可以使用 Script 來修改,更多細節可以參考 Unity ScriptReference: AssetPostprocessor。
其他注意事項
- 修改資源檔名
Unity 為每項資源建立其 meta 檔,其 meta 檔案名稱為 [AssetFileName.Extension].meta,若 Unity 找不到資源對應的 meta 檔案則會自動建立,並給予一組新的 GUID 以及該資源類型預設的參數。若 Unity 找不到 meta 檔案對應的資源,則會自動移除該 meta 檔案。
一般而言,都只會在 Unity 編輯器 Project window 中,點選資源修改其檔名,Unity 會自動連同 .meta 檔名一同修改。若要使用第三方的編輯器修改資源檔名 (e.x. Windows explorer),務必連同 .meta 檔名一同修改,避免 .meta 資料遺失,導致該資源 GUID 遺失,進而導致遊戲參照變成 Missing。
- 版本控制
除了資源以外,務必將 .meta 一併加入到版本控制中,否則由於 Unity meta 檔機制關係,其他組員使用版本控制同步專案且開啟後,Unity 會因為找不到 meta 檔案,而自動產生新的 meta 檔,除了拿不到原先上傳組員所設定的匯入參數外,其資源 GUID 也有可能不同,進而導致參照遺失 (Reference missing)。
更多請參考 Unity 文件 Using External Version Control Systems with Unity。
沒有留言: