Unity3d AssetBundle依賴關係獲取

PS:本文將從“打包之前”和“打包之後”兩個方面去說明如何獲取依賴關係

獲取AB包依賴的作用

衆所周知,如果一個AB包(我們稱之爲C)裏面的資源引用到的其他資源(我們成爲R)並沒有被打包成AB包,那麼C裏面就會多出一份資源R的備份,如果只是一個C裏面多了一個R的備份那還好,但是如果有很多其他AB包Cx都備份了一個R,那麼這就是資源的冗餘,沒有必要,這也就提示了我們應該把R打包成AB包(我們稱爲D),那麼這些Cx就只會多出一個依賴於D包的依賴,不會多出那麼多資源。
而AB包在加載還原的時候,如果依賴了其他AB包,那麼我們就必須先加載這些被依賴的AB包,那樣才能保證AB包資源正常顯示,更不要說那些被依賴的包還可能依賴於其他包,這就涉及到一個遞歸遍歷的問題了。
加載依賴包資源是要佔用內存的,如果打包不合理,會導致同一時間加載很多沒用的資源去耗內存,這是遊戲開發的大忌,所以理清楚打包的依賴關係很重要。

打包前AB包依賴的獲取

通常老方法使用AssetBundle系統(最新的更推薦使用Addressable系統)進行打包操作有兩個方法:

  1. 手動設置AB包名和後綴:這是最常見的方法,本文的依賴關係獲取也是基於這種方法實現的,這種方式會在資源的.meta文件裏面留下該資源所屬的AB包名,這也是我實現依賴關係獲取的基礎。
  2. 通過AssetBundleBuild代碼去動態設置:這種方法在資源量很大的項目中會出現,好處肯定是省事,畢竟不用自己挨個去設置每個資源的AB路徑,但是這也就意味這要麼我們找到它的配置文件,要麼就只有自己去追溯代碼,而且還涉及到如何判斷項目採用的是不是這一種方法,所以這種情況比較複雜,暫且不論。

如果是通過方法1的AB打包策略,那麼我們只需要使用Unity提供的AssetDatabase對象就可以實現,具體的操作如下:

var allAssetBundleNamesInProject = AssetDatabase.GetAllAssetBundleNames();
var unusedAssetBundleNamesInProject = AssetDatabase.GetUnusedAssetBundleNames();
var abAllDependencies = AssetDatabase.GetAssetBundleDependencies(assetBundleName, true);
var abDirectDependencies = AssetDatabase.GetAssetBundleDependencies(assetBundleName, false);

看變量名應該就能知道意思了,就這幾個接口就能夠獲得AB包名、AB包直接依賴和AB包所有依賴。

這裏就解釋一下那個所有依賴是指AB包C直接依賴的包Dx還會可能有依賴的包Ex,這個所有依賴是包括了Dx直接依賴和這之上的Ex等所有包。

還有就是我們分析依賴肯定是分析使用到的AB包的依賴,所以上面需要求一個差集來獲得使用到的AB包的名字

var usedAssetBundleNamesInProject = allAssetBundleNamesInProject.Except(unusedAssetBundleNamesInProject).ToArray();

PS:有了這些依賴其實可以做很多事情了,比如構建一個AB包關係的有向無環圖,再對這個圖進行連通子圖劃分,劃分出哪些AB包是在一個組內互相依賴等,這一部分應用後續看情況分享一下

打包後AB包依賴的獲取

這個就比較簡單了,無論你使用的是哪一種打包AB的方式,你打包出AB後必然有一個記錄了AB包信息的總的文件(文件名根據你打包的路徑文件夾名而定),那麼我們只需要把這個文件的.manifest文件加載出來,就可以獲取和打包前一樣的信息了。

var assetBundle = AssetBundle.LoadFromFile(path);
var manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
var abNames = manifest.GetAllAssetBundles();
var abDirectDependencies = manifest.GetDirectDependencies(abName)
var abAllDependencies = manifest.GetAllDependencies(abName)

PS:記得unload一下加載的AB資源,不然後面你再想load的話會報錯

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