Unity AssetBundle 相關(guān)操作和Api及注意事項(xiàng)(一)(整理siki學(xué)院AB包課程筆記)

  • 什么是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
截圖2.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)簽,即可打包。

如圖
截圖3.png

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


效果2.gif

現(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)行看看

效果3.gif

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容