Unity 熱更--AssetBundle學習筆記 0.7

畅知發表於2024-05-01

AssetBundle

AB包是什麼?

AssetBundle又稱AB包,是Unity提供的一種用於儲存資源的資源壓縮包

Unity中的AssetBundle系統是對資源管理的一種擴充套件,透過將資源分佈在不同的AB包中可以最大程度地減少執行時的記憶體壓力,可以動態地載入和解除安裝AB包,繼而有選擇地載入內容。

AB包的優勢有哪些?

  1. AB包的儲存位置自定義。可以放入可讀可寫的路徑下便於實現熱更。
  2. 可以自定義壓縮方式。對於壓縮方式可以選擇不壓縮或者LZMA和LZ4等不同的壓縮方式壓縮,滿足不同的網路傳輸需求。
  3. 資源可以分佈在不同的AB包體中,可以最大程度減少執行時候的記憶體壓力,做到即用即載入,針對性的載入。
  4. AB包支援後期進行動態更新。支援熱更,可以顯著減小初始安裝包的大小,非必要的核心關卡可以跟隨使用者闖關進度來進行資源下載,提高使用者的體驗。

AB包與Resources的比較?

AB包 Resource
資源可分佈在多個包中 所有資源打成一個大包
儲存位置可自定義 必須放在Resources目錄下
壓縮方式靈活 資源全部壓縮成二進位制
支援後期進行動態更新 打包後資源只讀無法動態更改

image-20240501205016476

AB包的特點與要求

  1. AB包無法直接儲存C#指令碼。程式碼的熱更需要使用lua這類指令碼語言,或者儲存編譯後的DLL檔案。
  2. AB包不能重複進行載入。AB包已經載入進記憶體後必須解除安裝後才能重新載入。
  3. AB包之間是存在依賴關係的,在載入當前AB包時需要一併載入其所依賴的包。
  4. 打包完成後,會自動生成一個主包(主包名稱隨平臺不同而不同),主包的manifest下會儲存有版本號、校驗碼(CRC)、所有其它包的相關資訊(名稱、依賴關係)

AB包打包實操

  1. 下載匯入Asset Bundles 資源包 【】

    img

  2. 將需要打包的資源進行分組分類

img

  1. 開啟AssetBundle 打包視窗進行設定 Build 出包

image-20240501210647890

img

AB包的檔案內容分為兩類:

一類是資原始檔(無字尾名稱的)

另一類為mainfest檔案 儲存AB包體的資訊和載入時候所需的關鍵資訊、資源資訊、版本資訊、依賴關係等等

關鍵AB包(與目錄名同名)為主包 和 AB包依賴的關鍵資訊

image-20240501212511657

載入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);
            }
        }
    }
}

相關文章