Unity3D工程全資源自動檢測系統
阿新 • • 發佈:2018-11-09
是什麼
這系統到底是個啥
本系統主要用於自動監測與檢測各型別資源是否正常及滿足指定規範,並在第一時間把出現的問題輸出到控制檯與儲存到檔案,以供對應的負責人及時修正。
為什麼
你可能經常遇到的問題
- 資源名字或路徑不規範?
- 資源丟引用?
- 特效丟材質或貼圖?
- 預設丟元件或指令碼?
- 動作控制器丟動畫?
- 等等很多各類美術程式資源引用的丟失都可檢測到
- 檔案有衝突?
- 典型的是meta衝突導致各種資源BUG
- 元件屬性設定有誤?
- 特效OrderInLayer不合適?
- UILabel層級不對?
- 用了不該用的元件或資源?
- 用了系統的材質/貼圖/Shader?
- JSON填錯導致格式掛掉了?
- Shader用了不相容或不合適的語句?
- 資源效能資料不滿足要求?
- 突然發現模型骨骼/面數/頂點數超了?
-
貼圖大小或格式設定不對?
- 等等
- 策劃測試發現資源有問題卻不知該找誰?
- More!還有很多功能已有或可以很方便地擴充套件。
- 你可能需要定時或按心情來手動檢測專案中某個路徑或某種資源有什麼問題
- 別的專案組想用你的類似工具,卻要做很多的修改和合並。
- 為了新增加一個新的檢測型別,你可能得修改很多原來的檢測程式碼。
-
你可能得修改類檔案來應付諸如“策劃修改了某類資源的路徑”或“策劃增加了對某類資源的命名的檢測”
- 你可能過載了很多 OnPostprocessAllAssets ,導致資源匯入很慢,或經常不知道什麼地方修改了資源匯入的設定。
- 耦合性很低,直接拷貝對應的檔案目錄過來即可。
- 你可能需要修改下配置表,以增減或修改一些功能或路徑來適應你的專案
- 預設會自動啟用資源的自動檢測,當然你也可以隨時在編輯器介面或配置中關閉它
- 繼承 AssetValidateBase
- 過載 bool OnAssetTypeCheck(string assetPath) 以判斷是否是你要檢測的資源型別
- 過載 bool OnAssetvalidate(string assetPath) 對資源進行你想要的檢測
- 它是怎麼捕獲到資源的修改的
- 繼承 Unity3D 的 AssetPostprocessor ,過載它的 OnPostprocessAllAssets
- 附上官網API說明
- https://docs.unity3d.com/2018.2/Documentation/ScriptReference/AssetPostprocessor.OnPostprocessAllAssets.html
- 這樣當有新增/修改/刪除資源時你都可以 Hook 到,並進行自己的判斷。
- 怎麼不修改原來的程式碼來新增子校驗器
- 把子校驗器的類名配置到配置表中
- 通過反射來獲取對應類名的校驗器子類,執行其基類的相關方法即可
- 你可以查閱反射相關的API,也可以借鑑這段程式碼
- Assembly
- https://docs.microsoft.com/zh-cn/dotnet/api/system.reflection.assembly?view=netframework-4.7.2
- Type.GetType();
- https://docs.microsoft.com/zh-cn/dotnet/api/system.type.gettype?view=netframework-4.7.2
- CreateInstance
- https://docs.microsoft.com/zh-cn/dotnet/api/system.reflection.assembly.createinstance?view=netframework-4.7.2
- 不同校驗器需要的資料的資料結構不一樣,如何不修改原始碼來動態獲取
- 這是通過JSON來實現的
- 編輯器下你可以用U3D自帶的JSON處理類來處理JSON
- JsonUtility
- https://docs.unity3d.com/2018.2/Documentation/ScriptReference/JsonUtility.html
- 如何知道某個GUID對應的資源是否存在?
- 你可以通過U3D的API,獲取到對應GUID對應的Path,判斷它是否為空,且檔案存在,且不是預設資源,來判斷這個資源是否存在。
- UnityEditor.AssetDatabase.GUIDToAssetPath()
- https://docs.unity3d.com/2018.2/Documentation/ScriptReference/AssetDatabase.GUIDToAssetPath.html
- 這些路徑為內建資源路徑
- "Resources/unity_builtin_extra"
- "Library/"
- 如果通過這個API返回的路徑為空,也可能是內建資源
- AssetDatabase.GetAssetOrScenePath
- https://docs.unity3d.com/2018.2/Documentation/ScriptReference/AssetDatabase.GetAssetOrScenePath.html
- 如何判斷資源是否丟引用的
- 你可以通過讀文字的方式讀取資源的文字形式
- 這點很簡單,但很有用,U3D很多資源都是有一定的格式的,包括meta檔案等,善於利用這一點可以做很多事
- 再通過正則等方式匹配到資源的GUID/Type/Name/FileID等資訊
- 你可能需要對C#正則表示式有一定的瞭解
- https://docs.microsoft.com/zh-cn/dotnet/api/system.text.regularexpressions.regex.-ctor?view=netframework-4.7.2#System_Text_RegularExpressions_Regex__ctor_System_String_
- 送上解析資源文字中的絕大部分GUID等資訊的正則表示式
- private const string REG_TO_MATCH_FILEDS = @"\s(?<FieldName>[a-zA-Z_]+?)(\s)*?\:(\s)*?-*(\s)*?\{(\s)*?fileID(\s)*?\:(\s)*?(?<FileID>[0-9]+?)(\s)*?\,(\s)*?guid(\s)*?\:(\s)*?(?<GUID>[a-zA-Z0-9]+?)(\s)*?\,(\s)*?type(\s)*?\:(\s)*?(?<Type>[0-9])(\s)*?\}";
- 再去校驗這些GUID是否存在。
- 確實有很多細節,不論是功能實現,還是技術細節,限於篇幅,只能粗略提下了。
- 已實現且建議實現的功能包括但不限於:
- 你得把一次檢測或監測到的問題記錄到文字,方便查閱和修正
- 你得有個編輯器介面去很好地控制這個系統,包括但不限於控制整個系統及所有小校驗器的開啟和關閉。
- 你得很好地設計你的系統,讓每個問題都繫結給對應的負責人(比如業務開發程式/引擎開發程式/動作美術/場景美術/特效美術/劇情策劃/系統策劃等)
- 需要注意,這個系統的核心是基於U3D資源庫的檔案的變動回撥的,請儘量不要在系統中修改資源,否則可能跟你工程中其他對這個資源有修改的操作衝突,導致死迴圈。
- 也請知悉,剛用這類工具時,可能會檢測出很多資源問題,這代表著,你可能會頻繁去找很多其他組員或其他組的成員的問題,請保證你比他們強壯...