什么是AssetBundle:
1牵寺,它是一個存在于硬盤上的文件柒啤。可以稱之為壓縮包爵川。這個壓縮包可以認為是一個文件夾敷鸦,里面包含了多個文件。這些文件可以分為兩類:serialized file 和 resource files寝贡。(序列化文件和源文件)
serialized file:資源被打碎放在一個對象中扒披,最后統(tǒng)一被寫進一個單獨的文件(只有一個)
resource files:某些二進制資源(圖片、聲音)被單獨保存圃泡,方便快速加載
2碟案,它是一個AssetBundle對象,我們可以通過代碼從一個特定的壓縮包加載出來的對象颇蜡。這個對象包含了所有我們當初添加到這個壓縮包里面的內(nèi)容价说,我們可以通過這個對象加載出來使用。那么它和Resource有什么區(qū)別呢:
首先Resource是unity中的一個特殊文件夾风秤,只要你放入此文件夾的文件鳖目,在打包時,不管是否用到缤弦,unity都會講起打入包中(即游戲安裝包的資源中)
Resources是動態(tài)內(nèi)部調(diào)用领迈,Resources在編輯環(huán)境下是project窗口的一個文件夾,調(diào)用里面的資源碍沐,可以用Resources類狸捅,比如Resources.Load,打包后這個文件夾是不存在的累提,會統(tǒng)一生成assets資源尘喝,AssetBundle 是外部調(diào)用,要用AssetBundle 首先要先把資源打包為.assetbundle文件斋陪,再動態(tài)的去加載這個文件朽褪,本地或者[網(wǎng)絡服務器]都可以。
簡單說无虚,Resources資源的加載是動態(tài)加載內(nèi)部的鞍匾,AssetBundle 是動態(tài)加載外部的(此段轉(zhuǎn)自百度知道:https://zhidao.baidu.com/question/1576110979640330500.html)
-
下面介紹打包前的準備工作:
首先需要對需要打包的資源進行設置,如圖所:截圖1.png
圖1為資源的默認狀態(tài)骑科,圖2為設置bundle標簽后的狀態(tài)橡淑。(注意bundle標簽不區(qū)分大小寫)到此我們的準備工作就準備好了!
- 下面是打包的代碼:
[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文件夾后才能讓此功能加入菜單欄
然后點擊此選項,即可打包符糊。
- 下面是對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包的代碼凫海,具體運行效果等明天我錄制好gif在進行上傳吧!(2018.5.30 23.29)
-
效果
效果1.gif
分割線
-------------------------------------------------------------------------------------------------------------------------------------------
如上所述男娄,直接給予bundle標記之后即可打包行贪,但是有個問題,這樣打包的資源模闲,unity會直接把該資源所依賴的資源一起打包建瘫,加入我有多個模型依賴的同樣的貼圖和材質(zhì),這樣就會導致打包的資源冗余尸折,那么我們可以將它們所依賴的資源也給予bundle標簽啰脚,即可打包。
那么实夹,我們現(xiàn)在進行打包橄浓,在打包好以后,同樣進行解壓:
現(xiàn)在我們會發(fā)現(xiàn)亮航,模型的材質(zhì)丟失了荸实,這是為什么呢?
因為我們對模型依賴的材質(zhì)進行了打包缴淋,所以同樣也需要解壓
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);
}
在添加這句代碼之后准给,我們在運行看看
當當當,現(xiàn)在就好了宴猾,效果正常了!5鹦3鸲摺!