AssetBundle打包與建立(學習筆記)
阿新 • • 發佈:2018-12-15
AssetBundle打包與建立
一、需求分析
(一)、AssetBundle是Unity自帶的一種檔案儲存機制
- 將不同的功能存放
- 主要學習AssetBundle的使用,為後面的熱更新做準備。
二、知識點
(一)、原理知識
1、AssetBundle的定義和作用
-
作用
- AssetBundle是一個壓縮包,裡面可以包含模型、貼圖、Prefab、聲音、場景等;可以在遊戲執行的時候被載入。
- AssetBundle自身儲存著相互的依賴關係
- 壓縮包可以使用LZMA和LZ4壓縮演算法,減少包的大小,更快的進行網路傳輸
- 把一些可以下載的內容放在AssetBundle裡面,可以減少安裝包的大小。
-
AssetBundle是什麼
- 就是一個檔案,可以看做資料夾或者壓縮包,主要分為serialized file(序列化檔案)和resource files(原始檔)。
- serialized file :資源被打碎放在一個物件中,最後統一被寫進一個單獨的檔案(只有一個)
- resource file:某些二進位制資源(圖片、聲音)被單獨儲存,方便快速載入
- 就是一個檔案,可以看做資料夾或者壓縮包,主要分為serialized file(序列化檔案)和resource files(原始檔)。
-
AssetBundle是一個我們可以通過程式碼從一個特定的壓縮包加載出來的物件,裡面包含了我們當初新增到壓縮包裡面的所有的內容,我們可以通過這個物件加載出來使用。
2、AssetBundle使用流程圖
3、AssetBundle使用流程
- 指定資源的AssetBundle屬性
- (xxxa/xxx)這裡xxxa會生成目錄檔案,名字為xxx
- 構建AssetBundle包
- 上傳AB包到伺服器
- 載入AB包和包裡面的資源
4、AssetBundle分組策略(僅供參考)
- 邏輯實體分組
- 一個UI介面或者所有UI介面一個包(這個介面裡面的貼圖和佈局資訊一個包)
- 一個角色或者所有角色一個包(這個角色裡面的模型和動畫一個包)
- 所有的場景所共享的部分一個包(包括特圖和模型)
- 按照型別分組
- 所有聲音資源打包成一個包,所有shader打包成一個包,所有模型打包成一個包,所有材質打包成一個包。
- 按照使用分組
- 把在某一個時間使用的所有資源打包成一個包,可以按照關卡,關卡內的所有東西都打包,也可以按照場景來劃分,一個場景所需的所有資源一個包。
- 最後:每個專案的需求不一樣可以按照策劃提供的需求,或者遊戲本身的需求來進行打包、
5、 AssetBundle分組策略——總結
- 把經常更新的資源放在一個單獨的包裡面,跟不經常更新的包分離
- 把需要同時載入的資源放在一個包裡面
- 可以把其他包共享的資源放在一個單獨的包裡面
- 把一些需要同時載入的小資源打成一個包
- 如果對於同一個資源有兩個版本,可以考慮通過後綴來區分
6、依賴打包
-
如果兩個prefab使用的是同一個材質和貼圖,可以把材質和貼圖獨立打包,prefab獨立打包,兩個prefab公用一個材質貼圖,然後載入的時候分別進行載入
-
依賴包重複問題
- 把需要共享的資源打包在一起
- 分割包,這些包不是在同一時間使用的
- 把分享部分打包成一個單獨的包
7、關於檔案校驗
- CRC、MD5、SHA1
- 相同點:都是通過對資料進行計算,來生成一個校驗值,該校驗值用來校驗資料的完整性
- 不同點
- 演算法不同;CRC採用多項式除法,MD5和SHA1使用替代、輪轉等方法
- 校驗的值的長度不同;CRC校驗位的長度跟其多項式有關係,一般為16位或32位;MD5是16個位元組(128位);SHA1是20個位元組(160位);
- 校驗值的稱呼不同。CRC一般叫做CRC值;MD5和SHA1一般叫做雜湊值(Hash)或雜湊值;
- 安全性不同。這裡的安全性是指檢錯的能力,即資料的錯誤能通過校驗位檢測出來。CRC的安全性跟多項式有很大關係,相對於MD5和SHA1要弱很多;MD5的安全性很高,不過大概在04年的時候被山東大學的王小云破解了;SHA1的安全性最高。
- 效率不同,CRC的計算效率很高;MD5和SHA1比較慢。
- 用途不同。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的使用
-
AssetBundle.LoadFromMemoryAsync
-
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); } }
-
-
WWW.LoadFromCacheOrDownload(新的Unity版本已經棄用)
-
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,來更快捷的管理需要打包的資源