AssetBundle
AB包是什麼?
AssetBundle又稱AB包,是Unity提供的一種用於儲存資源的資源壓縮包。
Unity中的AssetBundle系統是對資源管理的一種擴充套件,透過將資源分佈在不同的AB包中可以最大程度地減少執行時的記憶體壓力,可以動態地載入和解除安裝AB包,繼而有選擇地載入內容。
AB包的優勢有哪些?
- AB包的儲存位置自定義。可以放入可讀可寫的路徑下便於實現熱更。
- 可以自定義壓縮方式。對於壓縮方式可以選擇不壓縮或者LZMA和LZ4等不同的壓縮方式壓縮,滿足不同的網路傳輸需求。
- 資源可以分佈在不同的AB包體中,可以最大程度減少執行時候的記憶體壓力,做到即用即載入,針對性的載入。
- AB包支援後期進行動態更新。支援熱更,可以顯著減小初始安裝包的大小,非必要的核心關卡可以跟隨使用者闖關進度來進行資源下載,提高使用者的體驗。
AB包與Resources的比較?
AB包 | Resource |
---|---|
資源可分佈在多個包中 | 所有資源打成一個大包 |
儲存位置可自定義 | 必須放在Resources目錄下 |
壓縮方式靈活 | 資源全部壓縮成二進位制 |
支援後期進行動態更新 | 打包後資源只讀無法動態更改 |
AB包的特點與要求
- AB包無法直接儲存C#指令碼。程式碼的熱更需要使用lua這類指令碼語言,或者儲存編譯後的DLL檔案。
- AB包不能重複進行載入。AB包已經載入進記憶體後必須解除安裝後才能重新載入。
- AB包之間是存在依賴關係的,在載入當前AB包時需要一併載入其所依賴的包。
- 打包完成後,會自動生成一個主包(主包名稱隨平臺不同而不同),主包的manifest下會儲存有版本號、校驗碼(CRC)、所有其它包的相關資訊(名稱、依賴關係)
AB包打包實操
-
下載匯入Asset Bundles 資源包 【】
-
將需要打包的資源進行分組分類
- 開啟AssetBundle 打包視窗進行設定 Build 出包
AB包的檔案內容分為兩類:
一類是資原始檔(無字尾名稱的)
另一類為mainfest檔案 儲存AB包體的資訊和載入時候所需的關鍵資訊、資源資訊、版本資訊、依賴關係等等
關鍵AB包(與目錄名同名)為主包 和 AB包依賴的關鍵資訊
載入AB包中的資源
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
namespace LearnAssetBundle
{
public class LoadAsset : MonoBehaviour
{
private AssetBundle ab;
private Image _image;
private void Awake()
{
//獲取AB包 打包的檔案已經複製到streamingAssets檔案下 從此位置載入
//注意!AB包不能重複載入
ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath +"/"+"model");
_image = GameObject.Find("Canvas/Image").GetComponent<Image>();
}
void Start()
{
GameObject cube = ab.LoadAsset<GameObject>("cube");
Instantiate(cube);
//使用非同步載入圖片資源
StartCoroutine(LoadPicRes("pic", "bk"));
//釋放掉 true 包括場景中的資源
ab.Unload(false);
}
private IEnumerator LoadPicRes(string AbName, string picName)
{
AssetBundleCreateRequest picAb = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + AbName);
AssetBundleRequest abERes = picAb.assetBundle.LoadAssetAsync(picName, typeof(Sprite));
yield return abERes;
_image.sprite = abERes.asset as Sprite;
}
void Update()
{
//AB包資源的解除安裝
if (Input.GetKeyDown(KeyCode.Space))
{
//解除安裝所有載入的AB包
// true 包括場景中正在使用的資源 謹慎使用
// false 僅解除安裝ab包的資源 場景中的資源不受影響
AssetBundle.UnloadAllAssetBundles(false);
}
}
}
}