小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

再詳細(xì)的介紹一下Unity5的AssetBundle

 雪柳花明 2016-05-15
之前曾經(jīng)寫了一篇博客介紹Unity5的AssetBundle,結(jié)果似乎很受關(guān)注。不過似乎很多人看了之后都不懂,主要是因?yàn)椴惶靼譇ssetBundle是什么,它的依賴關(guān)系和結(jié)構(gòu)是什么的,就直接想拿代碼去用,而導(dǎo)致了很多人說看不懂啊,說什么有錯(cuò)誤啊,諸如此類。我想了一下,還是應(yīng)該從最基礎(chǔ)的東西說起,不厭其煩的說,才會(huì)省去大家加我QQ問問題了,畢竟平時(shí)上班忙,看到一些人把我當(dāng)翻譯詞典查,我肯定會(huì)態(tài)度不好的。

一、什么是AssetBundle
估計(jì)很多人只知道Unity的模型之類的東西可以導(dǎo)出成一種叫做AssetBundle的文件,然后打包后可以在Unity程序運(yùn)行的時(shí)候再加載回來用。
那么AssetBundle是一個(gè)什么樣的東西呢?其實(shí)AssetBundle只是一種使用LZMA壓縮方式壓縮的資源文件。具體LZMA是什么請(qǐng)百度,你可以理解成就是一種壓縮文件就行了,至于它的后綴名是什么,一點(diǎn)關(guān)系都沒有,你可以自己定。
AssetBundle打包的時(shí)候,你可以指定一個(gè)mainAsset,那么加載完之后就可以通過AssetBundle.mainAsset來獲取到了。你也可以不指定mainAsset,直接打包一堆內(nèi)容進(jìn)去,然后加載后通過AssetBundle.LoadAsset指定名字的讀取出來。
在資源之間,存在著依賴的關(guān)系。你可以把資源拆分得很細(xì),比如一個(gè)模型,由網(wǎng)格模型、材質(zhì)、貼圖構(gòu)成,你可以把每一個(gè)小部分都拆開,各自打包成壓縮文件。當(dāng)Unity需要加載使用的時(shí)候,把該模型的所有依賴的小資源都加載起來,然后根據(jù)依賴關(guān)系組裝,就變回了我們看到的資源了。

二、AssetBundle的依賴結(jié)構(gòu)
要說明依賴關(guān)系結(jié)構(gòu),我們還是使用上面的例子,一個(gè)模型,分為了網(wǎng)格模型、材質(zhì)、貼圖。那么他們是怎樣依賴的呢?然后在Unity5的打包里面,他們是怎樣表現(xiàn)出依賴關(guān)系的呢?
接下來做一個(gè)小小的實(shí)驗(yàn):
我準(zhǔn)備了4張貼圖,分別叫做t1、t2、t3、t4,然后建立了兩個(gè)材質(zhì)球,分別是m1、m2,m1材質(zhì)使用了t1、t2、t3三張貼圖,m2材質(zhì)使用了t4貼圖。
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
 再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
 
最后建立兩個(gè)模型,我就使用unity內(nèi)置的模型了。obj1是一個(gè)cube,obj2是一個(gè)quad。obj1使用了m1材質(zhì),obj2使用了m2材質(zhì)。然后obj1和obj2都做成了預(yù)設(shè),放在了Assets/Resources/Obj/下面
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
 
那么現(xiàn)在他們的結(jié)構(gòu)應(yīng)該是這樣的:
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
接下來,先只設(shè)置obj1的assetBundleName,然后導(dǎo)出
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
導(dǎo)出之后,我們看看AssetBundle.manifest
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
里面只有一個(gè)Info,就是剛才我們命名的obj1.ab,而obj1.ab下面的Dependencies是空的,也就是它沒有任何依賴了。
再看看obj1.ab.manifest
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
 它里面包含了類型的哈希碼、Assets資源的路徑,和依賴。這里它的依賴還是空的。

接下來把obj2也賦予AssetBundleName:
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
再導(dǎo)出,會(huì)發(fā)現(xiàn)除了剛才的文件以外,會(huì)多了2個(gè)文件,就是obj2.ab和obj2.ab.manifest。

還是打開AssetBundle.manifest看看,會(huì)發(fā)現(xiàn)
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
這次的Info變成了2個(gè),分別是obj1.ab和obj2.ab

打開obj1.ab.manifest
 再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
發(fā)現(xiàn)和剛才沒什么變化。
再看看obj2.ab.manifest
  再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
 它的結(jié)構(gòu)和obj1.ab.manifest差不多。

剛才只是把2個(gè)模型設(shè)置了導(dǎo)出AssetBundle,接下來我會(huì)把兩個(gè)材質(zhì)和四張貼圖都設(shè)置導(dǎo)出
不厭其煩的把圖貼上來:
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
 
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
 
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
 
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
 
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
 
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
 
這時(shí)候?qū)С?,我們的所有依賴關(guān)系都應(yīng)該存在了。導(dǎo)出之后,多了很多文件,是這樣的:
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
 
再來看AssetBundle.manifest
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
 這次看到的Info有7個(gè)了,其實(shí)我們?cè)O(shè)置了多少個(gè)AssetBundleName導(dǎo)出,它就應(yīng)該有多少個(gè)Info。

obj1.ab.manifest
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
 這次看到它的Dependencies,會(huì)看到有依賴了,寫的是一個(gè)本地的地址。有人會(huì)說,這個(gè)絕對(duì)路徑有問題啊,我把這個(gè)文件放到cdn上面,路徑就會(huì)不對(duì)啊。這個(gè)先不急,下面會(huì)說明是什么回事。

看m1.ab.manifest
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
會(huì)發(fā)現(xiàn)結(jié)構(gòu)差不多,但依賴列表里面會(huì)有三個(gè)地址,就是我們?nèi)龔堎N圖的地址了。

看obj2.ab.manifest 和 m2.ab.manifest情況會(huì)差不多
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
 
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙

接下來,要做最后一步試驗(yàn)了,比如剛才我已經(jīng)是整個(gè)項(xiàng)目的導(dǎo)出了,現(xiàn)在我突然需要改動(dòng)其中的一個(gè)小部分,現(xiàn)在我就把t4不導(dǎo)出了。
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
那么現(xiàn)在我們?cè)僬麄€(gè)項(xiàng)目的AssetBundle導(dǎo)出,會(huì)怎樣?
導(dǎo)出完之后,看目錄,會(huì)發(fā)現(xiàn)文件和剛才是一樣多的,t4.ab并沒有被刪掉。
再看AssetBundle.manifest
 再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
Info變成6個(gè)了,而里面某些項(xiàng)的依賴列表變了
看obj1.ab.manifest
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
 和剛才沒有變化

看obj2.ab.manifest
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
 和剛才也是沒有變化的
看m2.ab.manifest
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
 這里的依賴列表沒有了。

這其實(shí)就是AssetBundle的鏈?zhǔn)浇Y(jié)構(gòu)和增量打包了。一個(gè)小的部分改變了,它將會(huì)改變的地方只有總的AssetBundle.manifest,還有直接依賴于它本身的manifest。其他不依賴的部分是不需要重新打包的。
還有一點(diǎn)需要注意的地方是,除了manifest文件以外,還有一個(gè)沒有后綴名稱的AssetBundle文件。這個(gè)文件其實(shí)才是包含了所有的依賴關(guān)系的總的依賴關(guān)系配置文件,剛才我們能用txt打開的manifest文件,都只是用來做本地依賴關(guān)系和增量打包的時(shí)候用的。我們加載AssetBundle的時(shí)候,完全不需要加載那些manifest文件的,只需要那個(gè)沒有后綴名稱的AssetBundle文件(具體名字和你導(dǎo)出的文件夾有關(guān))就行了,它代表的是該項(xiàng)目的所有AssetBundle的依賴關(guān)系。
所以,剛才我們看到manifest里面用的都是本地的絕對(duì)路徑,那是針對(duì)你本地打包時(shí)用的,和加載無關(guān)。 
 

三、導(dǎo)出AssetBundle和自動(dòng)設(shè)置名稱
剛才我們都是直接的輸入AssetBundleName來導(dǎo)出AssetBundle的,其實(shí)這一步可以使用代碼自動(dòng)完成
在Unity項(xiàng)目內(nèi)部,每一個(gè)小的資源(網(wǎng)格、材質(zhì)、貼圖、聲音等),都會(huì)有一個(gè)唯一的哈希Id的,是一串很長的字母和數(shù)字組合。我們可以通過AssetDatabase.AssetPathToGUID來獲得這個(gè)ID。
那么自動(dòng)設(shè)置就變得簡單了,可以通過以下的代碼,我們可以設(shè)置一個(gè)總的prefab的AssetBundleName,然后自動(dòng)獲得它身上的所有依賴,然后獲得每個(gè)依賴資源的唯一Id,再賦予AssetBundleName就行了
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
 

四、加載AssetBundle的步驟
通過上面導(dǎo)出AssetBundle的說明,估計(jì)現(xiàn)在想要把它加載起來就變得簡單了。
首先需要明白一個(gè)規(guī)則,資源的依賴關(guān)系組裝是unity本身會(huì)自動(dòng)完成的。比如一個(gè)資源A,它是依賴于資源B和資源C的,那么如果我們需要加載資源A進(jìn)來并正確的顯示出來,我們必須先把資源B和資源C加載,然后再加載資源A。當(dāng)資源A加載進(jìn)來之后,發(fā)現(xiàn)內(nèi)存里面已經(jīng)有資源B和資源C了,它會(huì)自動(dòng)的組裝起來。
那么再看看加載的步驟了:
1、獲得總的依賴配置
剛才已經(jīng)說明了,真的有用的依賴配置文件是沒有后綴名稱的AssetBundle文件,所以我們需要加載的就是這個(gè)文件了。
string mUrl = Cdn + "AssetBundle";
然后www加載。
之后很多人看不懂,說我這個(gè)Cdn是什么東西,“AssetBundle”又是什么東西,現(xiàn)在應(yīng)該明白了吧?Cdn就是你的資源服務(wù)器路徑,“AssetBundle”就是文件名,它沒有后綴,具體的名字是和你導(dǎo)出的文件夾一樣的。
加載后,通過AssetBundle.LoadAsset("AssetBundleManifest"),就可以把剛才那個(gè)沒有后綴名的文件轉(zhuǎn)成AssetBundleManifest對(duì)象mainfest。
2、根據(jù)名稱找到目標(biāo)加載資源的所有依賴
獲得了AssetBundleManifest對(duì)象mainfest之后,比如我們實(shí)際上是需要加載obj1.ab的,這在剛才的AssetBundle.manifest里面可以知道,它的Info里面就有obj1.ab。然后我們通過
string[] dps = mainfest.GetAllDependencies("obj1.ab");
就可以獲取到obj1.ab的所有依賴了,包括了子依賴,比如它依賴于m1.ab,然后m1.ab依賴于t1.ab、t2.ab、t3.ab,那么這里獲取到的就應(yīng)該是4個(gè)依賴了。分別是m1.ab、t1.ab、t2.ab、t3.ab。
3、加載所有依賴的資源
獲取到obj1.ab的所有依賴之后,就應(yīng)該逐個(gè)的去加載他們了。分別www加載他們,然后保存他們的AssetBundle。
4、加載目標(biāo)加載資源
當(dāng)加載了所有的依賴資源之后,就可以光明正大 的去加載目標(biāo)資源了,這里我們的目標(biāo)資源就是obj1.ab。
5、實(shí)例化顯示
obj1.ab加載完之后,你愛怎樣用都可以,直接實(shí)例化出來吧。
再詳細(xì)的介紹一下Unity5的AssetBundle - 阿趙 - 窮到掉渣的超級(jí)奶爸阿趙
由于AssetBundle是不能重復(fù)加載的,如果你需要多次加載一個(gè)資源,你有2個(gè)選擇,要么加載了就Unload(false)卸載了它。要么你可以把它存起來,當(dāng)需要相同名字的AssetBundle的時(shí)候,直接取出來。

五、最后的建議
1、Unity5的新版AssetBundle好像是一套全新的系統(tǒng),其實(shí)和舊系統(tǒng)的差別并沒有很大,只是自動(dòng)生成了依賴配置文件而已。這一個(gè)步驟實(shí)際上完全可以自己實(shí)現(xiàn)的,那些配置文件可以用自己喜歡的格式生成,然后加載的時(shí)候再自己想辦法把依賴關(guān)系找回來就行了。
2、個(gè)人覺得把AssetBundle拆得太碎并不是一件好事情。為什么這么說呢?用過電腦的人都知道,拷貝文件的時(shí)候是一個(gè)個(gè)碎的文件拷貝快?還是把一堆文件壓縮成一個(gè)包,然后拷貝快?如果加載一個(gè)模型,需要分別加載十幾次依賴資源,才能顯示,這個(gè)過程中發(fā)送這么多的www或者h(yuǎn)ttp請(qǐng)求,過程有點(diǎn)危險(xiǎn)。至于說冗余文件的問題,自己考慮一下分布策略吧。
2、 一般來說,這種東西都需要配合著一套資源管理的系統(tǒng)來用的,所以在上一篇博客里面,我只是介紹新AssetBundle的特性,不太可能整一套系統(tǒng)都搬出來,只寫了幾句有代表性的關(guān)鍵方法當(dāng)做偽代碼來說明。結(jié)果很多人要么就說亂,要么就說有錯(cuò)誤。其實(shí)說來說去,就是自己沒搞懂原理,又急著拿別人的代碼來用……做人還是踏實(shí)一點(diǎn)的好。 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多