Unity資源清理工具

Unity Global Support部門製作了一些實用的小工具免費供大家使用,前面已經分享過了處理資源的AssetGraph,今天繼續爲大家推薦用於批量清理資源的小工具:Asset Cleaner。
Unity Global Support部門主要負責對使用Unity引擎的企業級VIP客戶提供技術支持,大中華區已實現全面覆蓋,目前包括騰訊,網易,巨人,完美世界等公司已屬於Unity的企業級VIP客戶。 Asset Cleaner主要用於查找並刪除沒有被引用的資源,簡單易用,且具有高度可擴展性。

項目背景:
在Unity項目中,我們習慣將所有的資源統稱爲Asset。Asset一般存放在Assets目錄及其子目錄。隨着項目的研發進度,Asset數量也會爆發式地增長,資源管理面臨很大的挑戰。如何查找並區分有效和無效的資源,是很多項目管理者非常重視的事情。本文介紹的這個工具可以自動分析查找項目中未使用到的資源,在選擇刪除的時候還可以將這些文件打包備份,確保資源的安全性、提高項目管理的效率。

實現原理:
該工程只有四個CS文件,需存放在Editor目錄下。
這裏寫圖片描述
FindUnusedAssets 是這個工具的主要入口,實現了編輯器的擴展菜單及其內部調用。
AssetCollector 是總的工具類,用來收集所有的asset文件
ClassReferenceCollection 用來收集所有的.cs腳本文件。
ShaderReferenceCollection 用來收集所有的Shader文件。

AssetCollector
AssetCollector實現了這個工具的核心代碼,點擊菜單時會調用定義在它內部的Collection函數。AssetCollector中聲明瞭兩個變量,useCodeStrip和saveEditorExtensions。useCodeStrip用來控制要不要刪除未使用的腳本文件,saveEditorExtensions用來控制檢測資源是否被Editor腳本引用。工具中提供了三個菜單項,分別是only resource、unused by editor、unused by game。這三個菜單項執行的代碼就是通過設置useCodeStrip和saveEditorExtensions爲不同的值來控制過濾的方式。

public bool useCodeStrip = true;
public bool saveEditorExtensions = true;

資源蒐集

Collection函數內實現了各種類型資源文件的搜索過濾。
Directory.GetFiles()獲取“Asset”目錄及其子目錄下所有相關資源的名字,通過Linq語法進行過濾,獲取需要的文件類型。

var files = Directory.GetFiles
(
    "Assets", "*.*", SearchOption.AllDirectories
)
        .Where (item => Path.GetExtension (item) != ".meta")
        .Where (item => Path.GetExtension (item) != ".js")
        .Where (item => Path.GetExtension (item) != ".dll")
        .Where (item => Regex.IsMatch (item, "[\\/\\\\]Gizmos[\\/\\\\]") == false)
        .Where (item => Regex.IsMatch (item, "[\\/\\\\]Plugins[\\/\\\\]Android[\\/\\\\]") == false)
.Where (item => Regex.IsMatch (item, "[\\/\\\\]Plugins[\\/\\\\]iOS[\\/\\\\]") == false)
        .Where (item => Regex.IsMatch (item, "[\\/\\\\]Resources[\\/\\\\]") == false);

依賴關係獲取
通過AssetDatabase.GetDependencies獲取當前有效的場景文件及場景依賴文件。

var scenes = EditorBuildSettings.scenes
                                .Where (item => item.enabled == true)
                                        .Select (item => item.path)
                                        .ToArray ();
foreach (var path in AssetDatabase.GetDependencies (scenes)) 
{
//剔除被依賴的文件
}

使用介紹:

首先我們要保證當前工程中存在有效的場景文件,因爲Asset資源的有效性依賴於是否被場景引用。
這裏寫圖片描述
使用時需要找到這個菜單項Assets->Delete Unused Assets,如下圖所示。
這裏寫圖片描述
Delete Unused Assets下有三個選項,分別是刪除未使用的資源文件(only resource),刪除編輯器未使用的Asset(unused by editor)和刪除遊戲未使用的Asset(unused by game)。

使用方法:
在開始使用該工具時,要保證有效的EditorBuildSettings.scenes
選擇Delete Unused Assets下“only resource”選項,彈出對應的刪除列表。如下圖所示:
這裏寫圖片描述
顯示在刪除列表中文件,單擊“Delete”,列表中的文件從項目中移除,工具會把這些文件作爲一個UnityPackage導出到“../ BackupUnusedAssets/”。這個包作爲被刪除文件的備份,如果後期發現有資源丟失,可以從這個包內找到對應的資源文件重新導入。
這裏寫圖片描述

上面簡單介紹了Asset Cleaner工程的工作原理及使用方式。在實戰中,我們可以根據需求自定義查找文件的格式。
關於該工具如有任何疑問,可以評論留言提問。

下載地址:https://github.com/unity-cn/Tool-UnityAssetCleaner

文章轉載自Unity資源清理工具,感謝Unity官方提供的工具

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章