什么是AssetBundle:
1,它是一個(gè)存在于硬盤上的文件。可以稱之為壓縮包。這個(gè)壓縮包可以認(rèn)為是一個(gè)文件夾,里面包含了多個(gè)文件。這些文件可以分為兩類:serialized file 和 resource files。(序列化文件和源文件)
serialized file:資源被打碎放在一個(gè)對(duì)象中,最后統(tǒng)一被寫進(jìn)一個(gè)單獨(dú)的文件(只有一個(gè))
resource files:某些二進(jìn)制資源(圖片、聲音)被單獨(dú)保存,方便快速加載
2,它是一個(gè)AssetBundle對(duì)象,我們可以通過代碼從一個(gè)特定的壓縮包加載出來的對(duì)象。這個(gè)對(duì)象包含了所有我們當(dāng)初添加到這個(gè)壓縮包里面的內(nèi)容,我們可以通過這個(gè)對(duì)象加載出來使用。那么它和Resource有什么區(qū)別呢:
首先Resource是unity中的一個(gè)特殊文件夾,只要你放入此文件夾的文件,在打包時(shí),不管是否用到,unity都會(huì)講起打入包中(即游戲安裝包的資源中)
Resources是動(dòng)態(tài)內(nèi)部調(diào)用,Resources在編輯環(huán)境下是project窗口的一個(gè)文件夾,調(diào)用里面的資源,可以用Resources類,比如Resources.Load,打包后這個(gè)文件夾是不存在的,會(huì)統(tǒng)一生成assets資源,AssetBundle 是外部調(diào)用,要用AssetBundle 首先要先把資源打包為.assetbundle文件,再動(dòng)態(tài)的去加載這個(gè)文件,本地或者[網(wǎng)絡(luò)服務(wù)器]都可以。
簡(jiǎn)單說,Resources資源的加載是動(dòng)態(tài)加載內(nèi)部的,AssetBundle 是動(dòng)態(tài)加載外部的(此段轉(zhuǎn)自百度知道:https://zhidao.baidu.com/question/1576110979640330500.html)
-
下面介紹打包前的準(zhǔn)備工作:
首先需要對(duì)需要打包的資源進(jìn)行設(shè)置,如圖所:截圖1.png

圖1為資源的默認(rèn)狀態(tài),圖2為設(shè)置bundle標(biāo)簽后的狀態(tài)。(注意bundle標(biāo)簽不區(qū)分大小寫)到此我們的準(zhǔn)備工作就準(zhǔn)備好了!
- 下面是打包的代碼:
[MenuItem("AssetBundleDoom/PakcBOundle")]
static void BuildAllAsstBundles()
{
string dir = "AsstBundles";
//如果該路徑不存在,則創(chuàng)建
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
}
如上代碼就是打包的代碼。(注意Directory需要引入命名空間<using System.IO>)
此腳本為編輯器腳本,需要放入Editor文件夾后才能讓此功能加入菜單欄
然后點(diǎn)擊此選項(xiàng),即可打包。
- 下面是對(duì)Bundle包的解壓
void Start ()
{
AssetBundle model = AssetBundle.LoadFromFile("AsstBundles/eri.gril");
AssetBundle materials = AssetBundle.LoadFromFile("AsstBundles/materials.gril");
GameObject wallPrefab = model.LoadAsset<GameObject>("Eri_sweather");
Instantiate(wallPrefab);
}
上面代碼就是解壓和使用bundle包的代碼,具體運(yùn)行效果等明天我錄制好gif在進(jìn)行上傳吧?。?018.5.30 23.29)
-
效果
效果1.gif
分割線
-------------------------------------------------------------------------------------------------------------------------------------------
如上所述,直接給予bundle標(biāo)記之后即可打包,但是有個(gè)問題,這樣打包的資源,unity會(huì)直接把該資源所依賴的資源一起打包,加入我有多個(gè)模型依賴的同樣的貼圖和材質(zhì),這樣就會(huì)導(dǎo)致打包的資源冗余,那么我們可以將它們所依賴的資源也給予bundle標(biāo)簽,即可打包。

那么,我們現(xiàn)在進(jìn)行打包,在打包好以后,同樣進(jìn)行解壓:

現(xiàn)在我們會(huì)發(fā)現(xiàn),模型的材質(zhì)丟失了,這是為什么呢?
因?yàn)槲覀儗?duì)模型依賴的材質(zhì)進(jìn)行了打包,所以同樣也需要解壓
void Start () {
AssetBundle model = AssetBundle.LoadFromFile("AsstBundles/eri.gril");
//這句就是剛剛添加的代碼
AssetBundle materials = AssetBundle.LoadFromFile("AsstBundles/materials.gril");
GameObject wallPrefab = model.LoadAsset<GameObject>("Eri_sweather");
Instantiate(wallPrefab);
}
在添加這句代碼之后,我們?cè)谶\(yùn)行看看

當(dāng)當(dāng)當(dāng),現(xiàn)在就好了,效果正常了?。。?!

