0.引用:
https://www.cnblogs.com/ybgame/p/3973177.html
一。概念
1.定義和作用:
AssetBundle (簡稱AB包) 是一個資源壓縮包,包含模型、貼圖、預制體、聲音、甚至整個場景,可以在游戲運行的時候被加載;
AssetBundle自身保存着 互相依賴 的關系;
壓縮包可以使用 LZMA和LZ4壓縮算法,減少包大小,更快的進行網絡傳輸;
把一些可以下載內容放在AssetBundle里面,可以減少安裝包的大小;
2.壓縮方式
BuildAssetBundleOptions
BuildAssetBundleOptions.None:使用 LZMA 算法壓縮,壓縮的包更小,但是加載時間更長。使用之前需要整體解壓。一旦被解壓,這個包會使用 LZ4 重新壓縮。使用資源的時候不需要整體解壓。在下載的時候可以使用LZMA算法,一旦它被下載了之后,它會使用LZ4算法保存到本地上。
BuildAssetBundleOptions.UncompressedAssetBundle:不壓縮,包大,加載快
BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4壓縮,壓縮率沒有LZMA高,但是我們可以加載指定資源而不用解壓全部。
注意: 使用LZ4壓縮,可以獲得與 不壓縮 相媲美的加載速度,而且比不壓縮文件要小。
3. AssetBundle分組策略總結
依賴打包:將需要同時加載的資源放在同一個包里,各個包之間會保存相互依賴的信息。
(1)邏輯實體分組
- 一個UI界面 或者 所有UI界面一個包(這個界面里面的貼圖和布局信息一個包)
- 一個角色 或者 所有角色一個包(這個角色里面的模型和動畫一個包)
- 所有的場景所共享的部分一個包(包括貼圖和模型)
(2)按照類型分組
所有聲音資源打成一個包,所有shader打成一個包,所有模型打成一個包,所有材質打成一個包。
(3)按照使用分組
把在某一時間內使用的所有資源打成一個包。可以 按照關卡 分,一個關卡所需要的所有資源包括角色、貼圖、聲音等打成一個包。也可以按照場景分,一個場景所需要的資源一個包。
注意
經常更新的資源放在一個單獨的包里面,跟不經常更新的包分離;
把需要同時加載的資源放在一個包里面;
可以把其他包共享的資源放在一個單獨的包里面;
把一些需要同時加載的小資源打包成一個包;
如果對於一個同一個資源有兩個版本,可以考慮通過后綴來區分,例如v1、v2、v3。
4. Manifest 文件
crc為校驗碼,通過其檢查是否完整
Assets 表示包里包含多少資源
Dependencies 表示包有哪些依賴
注意:在加載這些包之前,也需要加載依賴的包,不然會丟失這部分內容,顯示效果不正確
通過Manifest文件得到某個包的依賴:
可以注意到scene/cube.jy依賴於material.jy,而material.jy依賴於texture.jy
5. 文件校驗
CRC、MD5、SHA1都是通過對數據進行計算,來生成一個校驗值,該校驗值用來校驗數據的完整性。
CRC一般用於通信數據的校驗,MD5和SHA1用於安全領域,例如文件校驗,密碼加密等
二. 操作詳解
1. 代碼打包AssetBundle (BuildPipeline.BuildAssetBundles)
using UnityEditor; using System.IO; public class CreateAssetBundles { [MenuItem("Assets/Build AssetBundles")] static void BuildAllAssetBundles() { string dir = "AssetBundles"; if (Directory.Exists(dir) == false) { Directory.CreateDirectory(dir); } //BuildTarget 選擇build出來的AB包要使用的平台 BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64); } }
2.通過Manifest文件得到某個包的依賴
AssetBundle manifestAB = AssetBundle.LoadFromFile("AssetBundles/AssetBundles"); AssetBundleManifest manifest = manifestAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest"); //GetAllDependencies獲取到所有的依賴對象 string[] strs = manifest.GetAllDependencies("scene/cube.jy"); //將所有依賴對象依次加載出來 foreach (var item in strs) { Debug.Log(item); AssetBundle.LoadFromFile("AssetBundles/" + item); }
00