您好,登錄后才能下訂單哦!
今天小編給大家分享一下Unity AssetBundle入門知識點(diǎn)有哪些的相關(guān)知識點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
1. AssetBundle的定義和作用
AssetBundle(簡稱AB包)是一個(gè)資源壓縮包,包含模型、貼圖、預(yù)制體、聲音、甚至整個(gè)場景,可以在游戲運(yùn)行的時(shí)候被加載;
AssetBundle自身保存著互相的依賴關(guān)系;
壓縮包可以使用LZMA和LZ4壓縮算法,減少包大小,更快的進(jìn)行網(wǎng)絡(luò)傳輸;
把一些可以下載內(nèi)容放在AssetBundle里面,可以減少安裝包的大??;
2. 什么是AssetBundle?
它是一個(gè)存在于硬盤上的文件??梢苑Q之為壓縮包。這個(gè)壓縮包可以認(rèn)為是一個(gè)文件夾,里面包含了多個(gè)文件。這些文件可以分為兩類:serialized file 和 resource files。(序列化文件和源文件)
serialized file:資源被打碎放在一個(gè)對象中,最后統(tǒng)一被寫進(jìn)一個(gè)單獨(dú)的文件(只有一個(gè))
resource files:某些二進(jìn)制資源(圖片、聲音)被單獨(dú)保存,方便快速加載,可以Editor上讀取,方便查看
它是一個(gè)AssetBundle對象,我們可以通過代碼從一個(gè)特定的壓縮包加載出來的對象。這個(gè)對象包含了所有我們當(dāng)初添加到這個(gè)壓縮包里面的內(nèi)容,我們可以通過這個(gè)對象加載出來使用。
3. AssetBundle使用步驟
指定資源的AssetBundle屬性
(xxxa/xxx)這里xxxa會(huì)生成目錄,名字為xxx?!?'可以用于目錄劃分,Remove UnUsed name 可以移除沒有使用的屬性名
構(gòu)建AssetBundle包
上傳AB包
加載AB包和包里面的資源
4. 代碼打包AssetBundle
使用編輯器擴(kuò)展方法,將打包按鈕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算法壓縮,壓縮的包更小,但是加載時(shí)間更長。使用之前需要整體解壓。一旦被解壓,這個(gè)包會(huì)使用LZ4重新壓縮。使用資源的時(shí)候不需要整體解壓。在下載的時(shí)候可以使用LZMA算法,一旦它被下載了之后,它會(huì)使用LZ4算法保存到本地上。
BuildAssetBundleOptions.UncompressedAssetBundle:不壓縮,包大,加載快
BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4壓縮,壓縮率沒有LZMA高,但是我們可以加載指定資源而不用解壓全部。
注意:使用LZ4壓縮,可以獲得可以跟不壓縮想媲美的加載速度,而且比不壓縮文件要小。
依賴打包
將需要同時(shí)加載的資源放在同一個(gè)包里,各個(gè)包之間會(huì)保存相互依賴的信息
5. AssetBundle的加載和卸載
AB的加載
在開發(fā)階段將AB包放在本地,開發(fā)結(jié)束后再上傳到服務(wù)器
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 從內(nèi)存加載
WWW.LoadFromCacheOrDownload 下載后放在緩存中備用(該方法逐漸被棄用)
UnityWebRequest 從服務(wù)器下載
從AB中加載資源:
AssetBundle.LoadAsset(assetName)
AssetBundle.LoadAllAssets() 加載AB包中所有的對象,不包含依賴的包
AssetBundle.LoadAssetAsync() 異步加載,加載較大資源的時(shí)候
AssetBundle.LoadAllAssetsAsync() 異步加載全部資源
AssetBundle.LoadAssetWithSubAssets 加載資源及其子資源
AB的卸載
減少內(nèi)存的使用
有可能導(dǎo)致丟失
在切換場景,或者確定不使用的時(shí)候卸載
AssetBundle.Unload(true) 卸載所有資源,包含其中正被使用的資源
AssetBundle.Unload(false) 卸載所有沒被使用的資源
Resources.UnloadUnusedAssets 卸載個(gè)別未使用的資源
6. AssetBundle分組策略總結(jié)
邏輯實(shí)體分組
一個(gè)UI界面或者所有UI界面一個(gè)包(這個(gè)界面里面的貼圖和布局信息一個(gè)包)
一個(gè)角色或者所有角色一個(gè)包(這個(gè)角色里面的模型和動(dòng)畫一個(gè)包)
所有的場景所共享的部分一個(gè)包(包括貼圖和模型)
按照類型分組
所有聲音資源打成一個(gè)包,所有shader打成一個(gè)包,所有模型打成一個(gè)包,所有材質(zhì)打成一個(gè)包
按照使用分組
把在某一時(shí)間內(nèi)使用的所有資源打成一個(gè)包??梢园凑贞P(guān)卡分,一個(gè)關(guān)卡所需要的所有資源包括角色、貼圖、聲音等打成一個(gè)包。也可以按照場景分,一個(gè)場景所需要的資源一個(gè)包
注意
經(jīng)常更新的資源放在一個(gè)單獨(dú)的包里面,跟不經(jīng)常更新的包分離
把需要同時(shí)加載的資源放在一個(gè)包里面
可以把其他包共享的資源放在一個(gè)單獨(dú)的包里面
把一些需要同時(shí)加載的小資源打包成一個(gè)包
如果對于一個(gè)同一個(gè)資源有兩個(gè)版本,可以考慮通過后綴來區(qū)分,例如v1、v2、v3
7. Manifest文件
什么是Manifest文件
crc為校驗(yàn)碼,通過其檢查是否完整
Assets 表示包里包含多少資源
Dependencies 表示包有哪些依賴
注意:在加載這些包之前,也需要加載依賴的包,不然會(huì)丟失這部分內(nèi)容,顯示效果不正確
通過Manifest文件得到某個(gè)包的依賴
可以注意到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);}
如此,對象的材質(zhì)也加載顯示出來:
8. 文件校驗(yàn)
CRC、MD5、SHA1都是通過對數(shù)據(jù)進(jìn)行計(jì)算,來生成一個(gè)校驗(yàn)值,該校驗(yàn)值用來校驗(yàn)數(shù)據(jù)的完整性。
CRC一般用于通信數(shù)據(jù)的校驗(yàn),MD5和SHA1用于安全領(lǐng)域,例如文件校驗(yàn),密碼加密等
9. AssetBundles瀏覽工具
GitHub下載地址
工具面板如下:
Build Target 用于設(shè)置AB包的目標(biāo)平臺
OutPut Path 設(shè)置AB的輸出路徑
Build 一鍵打包
以上就是“Unity AssetBundle入門知識點(diǎn)有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。