【Unity】 細說AssetBundle


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM