Assetbundle打包、載入和提取資源的方式
阿新 • • 發佈:2019-02-01
打包AB的方式
注意:unity2017和5.X的版本API已經不一樣了,一個AB包裡可以有多個資源>
- BuildPipeline.BuildAssetBundles
- 會把所有標記的資源打包到指定目錄
- 一般情況下,我們會打包到StreamingAssetPath+“平臺名稱”;
- 會把所有標記的資源打包到指定目錄
- BuilPipeline.BuildAssetBundle
- 這個API比較靈活,可以讓我們定細緻的去打包
- 對應一個AB,建立AssetBundleBuild[]陣列,它有兩個重要屬性:
- assetNames:要打包到一個AB中的資源路徑:“Assets/Prefabs/Cube.prefab”,是一個string[];
- assetbundleName:對應的是要打包的AB的名稱,注意小寫
注意到:打包AB時,會生成另外兩個檔案,一個是AB,一個是清單,檔名稱對應的是當前打包的輸出目錄的名稱,這個AB,是總清單AB.裡面記錄著,所有AB的資訊,包括Hash值,依賴關係等..
實際開發中,我們會用編輯器工具,幫我們自動化的打包AB,這個下節講
載入AB的方式
載入本地的AB
載入AB指的是從硬碟上的檔案中,或者網路伺服器中,或者流中,或者記憶體的位元組陣列中,加載出AB到程式記憶體中
- AssetBundle的相關API
- LoadFromFile:同步載入
- LoadFromFileAsync:非同步載入
- WWW類
- 對於移動平臺來說,只有這個類,可以幫我們讀取本地的檔案資源
載入外部伺服器上的AB
- WWW類
- www物件,在接收到資料後,在記憶體中是一股資料流,我們一般稱為web流
- 當執行www.assetbundle這句時,會從這股web流中,加載出來我們的AB.
- 這個WWW類下載的方式,每次執行,都會從伺服器上下載資料.記憶體開銷比較大
- WWW.LoadFromCacheOrDownload()
- 這個方法,需要傳入一個代表版本與的引數
- 第一次向伺服器下載資料時,會把下載的資料,快取到本地的硬碟中,並保留版本的記錄
- 再次執行這個方法進行下載時,會先判斷傳入的版本號,與快取中的AB的版本號,是否一致,如果一致,則直接從硬碟的快取中載入AB到記憶體中,如果不一致,則重新從伺服器下載,並且,在記憶體,不會有web流的佔用;
從AB中提取我們的資源
- AssetBundle相關API
- LoadAsset(AssetName):同步提取資源
- Object[] loadAllAssets();同步提取所有的資源
- 對應的都有非同步載入
AB依賴關係
- 打包時注意的依賴關係
- 當你打包一個資源時,它會把它引用的資源,一起打包到一個AB中
- 如果A依賴C,B依賴C,不單獨給C打包,會導致生成的A包和B包裡都有C資源的資料,導致空間浪費
- 使用包時注意的依賴關係
- 當載入一個資源時,如果它所依賴的資源的AB沒有在記憶體中,則會出現資源丟失
- 只要所依賴的資源的AB包在記憶體中,我們不需要從中提取資源,就可以直接使用,因為當你加一個資源時,它會自動檢索記憶體中是否有依賴包的AB。如果有,則自動幫我們建造這個資源的關聯,自動幫我們提取依賴的資源
AssetBundleBrowser的使用,可以方便我們檢視AB的關係和資源組織方式等,2017版本上的手冊上有使用方式,下方是文件的路徑
-Working in Unity>Advanced Development> AssetBundles>Unity Asset Bundle Browser too