您好,登錄后才能下訂單哦!
今天小編給大家分享一下Unity AssetBundle入門知識點有哪些的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
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); } //BuildTarget 選擇build出來的AB包要使用的平臺 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 = DownloadHandlerAssetBundle.GetContent(request); //方式二 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");//GetAllDependencies獲取到所有的依賴對象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 一鍵打包
以上就是“Unity AssetBundle入門知識點有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。