1. 程式人生 > >Assetbundle打包、載入和提取資源的方式

Assetbundle打包、載入和提取資源的方式

打包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

關於記憶體管理,看下邊這個部落格,這裡面有詳細的記憶體管理解釋