文章目錄
AssetBundle從入門到掌握
1. AssetBundle的定義和作用
2. 什麼是AssetBundle?
3. AssetBundle使用步驟
4. 代碼打包AssetBundle
5. AssetBundle的加載和卸載
AB的加載
AB的卸載
6. AssetBundle分組策略總結
邏輯實體分組
注意
7. Manifest文件
什麼是Manifest文件
通過Manifest文件得到某個包的依賴
8. 文件校驗
9. AssetBundles瀏覽工具
1. AssetBundle的定義和作用
AssetBundle(簡稱AB包)是一個資源壓縮包,包含模型、貼圖、預製體、聲音、甚至整個場景,可以在遊戲運行的時候被加載;
AssetBundle自身保存著互相的依賴關係;
壓縮包可以使用LZMA和LZ4壓縮算法,減少包大小,更快的進行網絡傳輸;
把一些可以下載內容放在AssetBundle裡面,可以減少安裝包的大小;
2. 什麼是AssetBundle?
它是一個存在於硬碟上的文件。可以稱之為壓縮包。這個壓縮包可以認為是一個文件夾,裡面包含了多個文件。這些文件可以分為兩類:serialized file 和 resource files。(序列化文件和源文件)
serialized file:資源被打碎放在一個對象中,最後統一被寫進一個單獨的文件(只有一個)
resource files:某些二進位資源(圖片、聲音)被單獨保存,方便快速加載,可以Editor上讀取,方便查看
它是一個AssetBundle對象,我們可以通過代碼從一個特定的壓縮包加載出來的對象。這個對象包含了所有我們當初添加到這個壓縮包裡面的內容,我們可以通過這個對象加載出來使用。
3. AssetBundle使用步驟
指定資源的AssetBundle屬性
(xxxa/xxx)這裡xxxa會生成目錄,名字為xxx。』/'可以用於目錄劃分,Remove UnUsed name 可以移除沒有使用的屬性名
構建AssetBundle包
上傳AB包
加載AB包和包裡面的資源
4. 代碼打包AssetBundle
使用編輯器擴展方法,將打包按鈕Build AssetBundles放於Asset菜單下
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); } BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64); }}壓縮方式
Build的路徑(隨意只要是在硬碟上都可以的)
BuildAssetBundleOptions
BuildAssetBundleOptions.None:使用LZMA算法壓縮,壓縮的包更小,但是加載時間更長。使用之前需要整體解壓。一旦被解壓,這個包會使用LZ4重新壓縮。使用資源的時候不需要整體解壓。在下載的時候可以使用LZMA算法,一旦它被下載了之後,它會使用LZ4算法保存到本地上。
BuildAssetBundleOptions.UncompressedAssetBundle:不壓縮,包大,加載快
BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4壓縮,壓縮率沒有LZMA高,但是我們可以加載指定資源而不用解壓全部。
注意:使用LZ4壓縮,可以獲得可以跟不壓縮想媲美的加載速度,而且比不壓縮文件要小。
依賴打包
將需要同時加載的資源放在同一個包裡,各個包之間會保存相互依賴的信息
5. AssetBundle的加載和卸載
AB的加載
在開發階段將AB包放在本地,開發結束後再上傳到伺服器
public class LoadFromLocal : MonoBehaviour{ private void Start() { AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/scene/wall.jy"); GameObject obj = ab.LoadAsset<GameObject>("wall"); Instantiate(obj); }}private void Start(){ AssetBundle ab = AssetBundle.LoadFromMemory(File.ReadAllBytes("AssetBundles/scene/cube.jy")); GameObject obj = ab.LoadAsset<GameObject>("Cube(Clone)"); Instantiate(obj);}IEnumerator Start(){ AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes("AssetBundles/scene/cube.jy")); yield return request; AssetBundle ab = request.assetBundle; GameObject obj = ab.LoadAsset<GameObject>("Cube(Clone)"); Instantiate(obj);}IEnumerator Start(){ while (Caching.ready == false) { yield return null; }
WWW www = WWW.LoadFromCacheOrDownload(@"file://E:\U3D-Projects\Test2017.2.0\AssetBundles\scene\cube.jy", 1); yield return www; if (!string.IsNullOrEmpty(www.error)) { Debug.Log(www.error); yield break; } AssetBundle ab = www.assetBundle; GameObject obj = ab.LoadAsset<GameObject>("Cube(Clone)"); Instantiate(obj);}IEnumerator Start(){ string url = @"file:///E:\U3D-Projects\Test2017.2.0\AssetBundles\scene\cube.jy"; UnityWebRequest request = UnityWebRequest.GetAssetBundle(url); yield return request.SendWebRequest(); AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle; GameObject obj = ab.LoadAsset<GameObject>("Cube(Clone)"); Instantiate(obj);}AB加載方式:
AssetBundle.LoadFromFile 從本地加載
AssetBundle.LoadFromMemory 從內存加載
WWW.LoadFromCacheOrDownload 下載後放在緩存中備用(該方法逐漸被棄用)
UnityWebRequest 從伺服器下載
從AB中加載資源:
AssetBundle.LoadAsset(assetName)
AssetBundle.LoadAllAssets() 加載AB包中所有的對象,不包含依賴的包
AssetBundle.LoadAssetAsync() 異步加載,加載較大資源的時候
AssetBundle.LoadAllAssetsAsync() 異步加載全部資源
AssetBundle.LoadAssetWithSubAssets 加載資源及其子資源
AB的卸載
減少內存的使用
有可能導致丟失
在切換場景,或者確定不使用的時候卸載
AssetBundle.Unload(true) 卸載所有資源,包含其中正被使用的資源
AssetBundle.Unload(false) 卸載所有沒被使用的資源
Resources.UnloadUnusedAssets 卸載個別未使用的資源
6. AssetBundle分組策略總結
邏輯實體分組
一個UI界面或者所有UI界面一個包(這個界面裡面的貼圖和布局信息一個包)
一個角色或者所有角色一個包(這個角色裡面的模型和動畫一個包)
所有的場景所共享的部分一個包(包括貼圖和模型)
按照類型分組
所有聲音資源打成一個包,所有shader打成一個包,所有模型打成一個包,所有材質打成一個包
按照使用分組
把在某一時間內使用的所有資源打成一個包。可以按照關卡分,一個關卡所需要的所有資源包括角色、貼圖、聲音等打成一個包。也可以按照場景分,一個場景所需要的資源一個包
注意
經常更新的資源放在一個單獨的包裡面,跟不經常更新的包分離
把需要同時加載的資源放在一個包裡面
可以把其他包共享的資源放在一個單獨的包裡面
把一些需要同時加載的小資源打包成一個包
如果對於一個同一個資源有兩個版本,可以考慮通過後綴來區分,例如v1、v2、v3
7. Manifest文件
什麼是Manifest文件
crc為校驗碼,通過其檢查是否完整
Assets 表示包裡包含多少資源
Dependencies 表示包有哪些依賴
注意:在加載這些包之前,也需要加載依賴的包,不然會丟失這部分內容,顯示效果不正確
通過Manifest文件得到某個包的依賴
可以注意到scene/cube.jy依賴於material.jy,而material.jy依賴於texture.jy
AssetBundle manifestAB = AssetBundle.LoadFromFile("AssetBundles/AssetBundles");AssetBundleManifest manifest = manifestAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");string[] strs = manifest.GetAllDependencies("scene/cube.jy");foreach (var item in strs){ Debug.Log(item); AssetBundle.LoadFromFile("AssetBundles/" + item);}如此,對象的材質也加載顯示出來:
8. 文件校驗
CRC、MD5、SHA1都是通過對數據進行計算,來生成一個校驗值,該校驗值用來校驗數據的完整性。
CRC一般用於通信數據的校驗,MD5和SHA1用於安全領域,例如文件校驗,密碼加密等
9. AssetBundles瀏覽工具
GitHub下載地址
工具面板如下:
Build Target 用於設置AB包的目標平臺
OutPut Path 設置AB的輸出路徑
Build 一鍵打包
————————————————
聲明:發布此文是出於傳遞更多知識以供交流學習之目的。若有來源標註錯誤或侵犯了您的合法權益,請作者持權屬證明與我們聯繫,我們將及時更正、刪除,謝謝。
作者:虛擬喵
來源:https://blog.csdn.net/qq_35361471/article/details/82854560
More:【微信公眾號】 u3dnotes