溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Unity AssetBundle入門知識點(diǎn)有哪些

發(fā)布時(shí)間:2022-01-11 15:50:39 來源:億速云 閱讀:188 作者:iii 欄目:大數(shù)據(jù)

今天小編給大家分享一下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è)資訊頻道。

向AI問一下細(xì)節(jié)

免責(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)容。

AI