1. 程式人生 > >AssetBundle打包與建立(學習筆記)

AssetBundle打包與建立(學習筆記)

AssetBundle打包與建立

一、需求分析

(一)、AssetBundle是Unity自帶的一種檔案儲存機制

  • 將不同的功能存放
  • 主要學習AssetBundle的使用,為後面的熱更新做準備。

二、知識點

(一)、原理知識

1、AssetBundle的定義和作用

  • 作用

    1. AssetBundle是一個壓縮包,裡面可以包含模型、貼圖、Prefab、聲音、場景等;可以在遊戲執行的時候被載入。
    2. AssetBundle自身儲存著相互的依賴關係
    3. 壓縮包可以使用LZMA和LZ4壓縮演算法,減少包的大小,更快的進行網路傳輸
    4. 把一些可以下載的內容放在AssetBundle裡面,可以減少安裝包的大小。
  • AssetBundle是什麼

    • 就是一個檔案,可以看做資料夾或者壓縮包,主要分為serialized file(序列化檔案)和resource files(原始檔)。
      • serialized file :資源被打碎放在一個物件中,最後統一被寫進一個單獨的檔案(只有一個)
      • resource file:某些二進位制資源(圖片、聲音)被單獨儲存,方便快速載入
  • AssetBundle是一個我們可以通過程式碼從一個特定的壓縮包加載出來的物件,裡面包含了我們當初新增到壓縮包裡面的所有的內容,我們可以通過這個物件加載出來使用。

2、AssetBundle使用流程圖

在這裡插入圖片描述

3、AssetBundle使用流程

  1. 指定資源的AssetBundle屬性
    • (xxxa/xxx)這裡xxxa會生成目錄檔案,名字為xxx
  2. 構建AssetBundle包
  3. 上傳AB包到伺服器
  4. 載入AB包和包裡面的資源

4、AssetBundle分組策略(僅供參考)

  1. 邏輯實體分組
    • 一個UI介面或者所有UI介面一個包(這個介面裡面的貼圖和佈局資訊一個包)
    • 一個角色或者所有角色一個包(這個角色裡面的模型和動畫一個包)
    • 所有的場景所共享的部分一個包(包括特圖和模型)
  2. 按照型別分組
    • 所有聲音資源打包成一個包,所有shader打包成一個包,所有模型打包成一個包,所有材質打包成一個包。
  3. 按照使用分組
    • 把在某一個時間使用的所有資源打包成一個包,可以按照關卡,關卡內的所有東西都打包,也可以按照場景來劃分,一個場景所需的所有資源一個包。
  4. 最後:每個專案的需求不一樣可以按照策劃提供的需求,或者遊戲本身的需求來進行打包、

5、 AssetBundle分組策略——總結

  1. 把經常更新的資源放在一個單獨的包裡面,跟不經常更新的包分離
  2. 把需要同時載入的資源放在一個包裡面
  3. 可以把其他包共享的資源放在一個單獨的包裡面
  4. 把一些需要同時載入的小資源打成一個包
  5. 如果對於同一個資源有兩個版本,可以考慮通過後綴來區分

6、依賴打包

  • 如果兩個prefab使用的是同一個材質和貼圖,可以把材質和貼圖獨立打包,prefab獨立打包,兩個prefab公用一個材質貼圖,然後載入的時候分別進行載入

  • 依賴包重複問題

    • 把需要共享的資源打包在一起
    • 分割包,這些包不是在同一時間使用的
    • 把分享部分打包成一個單獨的包

7、關於檔案校驗

  • CRC、MD5、SHA1
  • 相同點:都是通過對資料進行計算,來生成一個校驗值,該校驗值用來校驗資料的完整性
  • 不同點
    1. 演算法不同;CRC採用多項式除法,MD5和SHA1使用替代、輪轉等方法
    2. 校驗的值的長度不同;CRC校驗位的長度跟其多項式有關係,一般為16位或32位;MD5是16個位元組(128位);SHA1是20個位元組(160位);
    3. 校驗值的稱呼不同。CRC一般叫做CRC值;MD5和SHA1一般叫做雜湊值(Hash)或雜湊值;
    4. 安全性不同。這裡的安全性是指檢錯的能力,即資料的錯誤能通過校驗位檢測出來。CRC的安全性跟多項式有很大關係,相對於MD5和SHA1要弱很多;MD5的安全性很高,不過大概在04年的時候被山東大學的王小云破解了;SHA1的安全性最高。
    5. 效率不同,CRC的計算效率很高;MD5和SHA1比較慢。
    6. 用途不同。CRC一般用作通訊資料的校驗;MD5和SHA1用於安全(Security)領域,比如檔案校驗、數字簽名等。

(二)、外掛知識

1、Unity Asset Bundle Browser Tool外掛

  • 該外掛是GitHup上面的一個開源外掛

(三)、操作知識

1、AssetBundle在Unity編輯器裡面的位置

在這裡插入圖片描述

(四)、程式碼相關

1、AssetBundle使用相關API

 //Buildpipeline 構建  管道
//BuildAssetBundlees   打包所以標記為AssetBundle的物品
//引數一:地址  引數二:Optionas  打包型別  引數三:平臺
BuildPipeline.BuildAssetBundles(dir,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);

//讀取檔案
AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/scene/wall.unity3d");
GameObject wallPrefab = ab.LoadAsset<GameObject>("CubeWall");
Instantiate(wallPrefab);

2、build AssetBundle先關

  • build的路徑(隨意只要是在硬碟上面都可以)

    • BuildAssetBundleOptions
    • BuildAssetBundleOptions.None:使用LZMA演算法壓縮,壓縮的包更小,但是載入時間更長。使用之前需要整體解壓。一旦被解壓,這個包會使用LZ4重新壓縮。使用資源的時候不需要整體解壓。在下載的時候可以使用LZMA演算法,一旦它被下載了之後,它會使用LZ4演算法儲存到本地上。
    • BuildAssetBundleOptions.UncompressedAssetBundle:不壓縮,包大,載入快
    • BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4壓縮,壓縮率沒有LZMA高,但是我們可以載入指定資源而不用解壓全部。
    • 注意使用LZ4壓縮,可以獲得可以跟不壓縮想媲美的載入速度,而且比不壓縮檔案要小。
  • BuildTarget

    • 選擇build出來的AB包要使用的平臺
    • 在這裡插入圖片描述
  • The Manifest File

    • 是打包出來的提示文件
    • 重要引數有:CRC檔案校驗碼;Asset依賴包
  • AB依賴

    • 就是如果兩個prefab使用的是同一個材質和貼圖,可以把材質和貼圖獨立打包,prefab獨立打包,兩個prefab公用一個材質貼圖,然後載入的時候分別進行載入

3、AssetBundles的使用

  1. AssetBundle.LoadFromMemoryAsync

  2. AssetBundl.LoadFormFile

    • using UnityEngine;
      using System.Collections;
      using System.IO;
      
      public class LoadFromFileExample : MonoBehaviour
      {
          void Start()
          {
              var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "myassetBundle"));
              if (myLoadedAssetBundle == null)
              {
                  Debug.Log("Failed to load AssetBundle!");
                  return;
              }
      
              var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("MyObject");
              Instantiate(prefab);
      
              myLoadedAssetBundle.Unload(false);
          }
      }
      
  3. WWW.LoadFromCacheOrDownload(新的Unity版本已經棄用)

  4. UnityWebRequest

4、Loading Asset from AssetBundles

  • 一般

    T objectFromBundle = bundleObject.LoadAsset<T>(assetName);
    
  • GameObject

    GameObject  gameObject = loadedAssetBundle.LoadAsset<GameObject>(assetname);
    
  • 所有資源

    Unity.Object[] objectArret = loadedAssetBundle.LodAllAssets();
    

5、載入Manifests

  • 載入Manifests檔案可以處理資源的依賴

    AssetBundle assetBundle = AssetBundle.LoadFromFile(manifestFilePath);
    AssetBundleManifest manifest = 
    assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
    string[] dependencies = manifest.GetAllDependencies("assetBundle"); //Pass the name of the bundle you want the dependencies for.
    foreach(string dependency in dependencies)
    {
        AssetBundle.LoadFromFile(Path.Combine(assetBundlePath, dependency));
    }
    

6、AssetBundle的解除安裝

  • 減少記憶體使用
  • 有可能導致丟失
  • AssetBundle.Unload(true)解除安裝所有資源,即使有資源被使用著
    • 在切換、場景
    • 資源沒有被用的時候 呼叫
  • AssetBundle.Unload(false)解除安裝所有沒有被用到資源
  • 個別資源的解除安裝
    • 通過Resources.UnloadUnusedAssets
    • 場景切換的時候

三、最後總結

1、對課程學到的東西的描述

  • 該課程主要是為後面的熱更新打基礎的,通過介紹什麼是AssetBundle,和使用方法等,還有從搭建本地伺服器來載入AssetBundle要進行演示。

  • 還有使用了官方的外掛來進行學習AssetBundle,來更快捷的管理需要打包的資源