【AssetBundle】七:打包生成的manifest文件
我們在之前知道了AssetBundle打包的時候除了生成AssetBundle包之外,還會生成.manifest文件,我們把它稱作配置文件。從事Android開發(fā)的同學(xué)們一定不會對.AndroidManifest文件陌生,所以我們習(xí)慣上也把AssetBundle打包的時候生成的.manifest文件成為該AssetBundle包的配置文件。
我們使用EditPlus打開配置文件看看:
我們先來看看上圖中指出的1、2、3:
1.CRC
說起CRC我們可能會有些陌生,但是說起MD5,恐怕大家都只要這玩意是干什么用的了。
MD5用于確保信息傳輸完整一致,也就是我們常說的校驗碼,CRC與MD5相同,屬于校驗文件方式的一種。資源包在使用之前首先要保證我接收到的包要完整吧,所以unity打包AssetBundle包,使用了CRC來進(jìn)行校驗。至于CRC與MD5有什么區(qū)別,我想這并不在我們討論的范圍之內(nèi),只需要了解一點:CRC用于通訊,MD5用于大容量存儲,MD5更安全,CRC效率更高。
2.Assets:
這塊區(qū)域包含的是這個AssetBundle包包含了哪些資源,我們可以看到有名為Wood texture floor_01的png圖片和名為Wood texture floor_01的材質(zhì),同時,它們的路徑也就很清楚的顯示了出來。
3.Dependencies:
這個就是我們之前說的依賴信息了,unity在打包的時候會根據(jù)資源之間的依賴關(guān)系自動向這其中插入相關(guān)信息。
上圖中因為是我們共享的圖片和素材的AssetBundle包,所以在包含了圖片和材質(zhì)的信息之后,并不需要依賴其他的資源,所以依賴信息的位置為空,我們打開prefab的AssetBundle包的配置文件:
我們可以看到球體prefab打包AssetBundle之后,配置文件中包含一個校驗碼,prefab的路徑信息,最重要的是在最下方的依賴信息中,我們可以看到它依賴了我們剛剛查看的material包。
我們再來看看另外一個問題:
假如我在開發(fā)的時候,代碼加載了AssetBundle包,但是包里依賴的資源我在工程里都存在,那么我需不需要加載依賴的包呢?
答案是需要的。
加載包并且實例化prefab對象的時候,我們只認(rèn)依賴關(guān)系,依賴關(guān)系能為我們提供精確地加載目標(biāo),而不需要在工程里面挨個檢索資源。
這就是另一個內(nèi)容:我們在加載某個AssetBundle包的時候,如果它依賴別的AssetBundle包,那么我們最好在加載并使用它之前,先把依賴的包加載出來,否則可能導(dǎo)致材質(zhì)丟失、要實例化的對象不存在等錯誤。
我們試驗下:unity工程中有了材質(zhì)和貼圖,我們來加載球體:
using System.Collections; using System.Collections.Generic; using UnityEngine;public class LoadAssetsBundlePackage : MonoBehaviour {// Use this for initializationvoid Start(){//先將資源包加載進(jìn)內(nèi)存AssetBundle assetBundle = AssetBundle.LoadFromFile("AssetBundles/sphere.assetsbundle");//然后再加載prefabGameObject prefab = assetBundle.LoadAsset<GameObject>("Sphere");Instantiate(prefab);} }結(jié)果如下:
雖然本地有著材質(zhì)和貼圖,但是球體prefab并不會使用,它認(rèn)準(zhǔn)的是資源包中依賴的材質(zhì)和貼圖。
所以我們需要在加載球體的AssetBundle包之前先將材質(zhì)和貼圖的AssetBundle對象加載進(jìn)內(nèi)存中:
using System.Collections; using System.Collections.Generic; using UnityEngine;public class LoadAssetsBundlePackage : MonoBehaviour {// Use this for initializationvoid Start(){//先將材質(zhì)和貼圖的資源包加載進(jìn)內(nèi)存AssetBundle materialAssetBundle = AssetBundle.LoadFromFile("AssetBundles/material.assetsbundle");//接著將prefab資源包加載進(jìn)內(nèi)存AssetBundle sphereAssetBundle = AssetBundle.LoadFromFile("AssetBundles/sphere.assetsbundle");//然后再加載prefabGameObject prefab = sphereAssetBundle.LoadAsset<GameObject>("Sphere");Instantiate(prefab);} }結(jié)果我們可以發(fā)現(xiàn),prefab能夠正常的加載出來了:
值得注意的是,我們在使用代碼加載AssetBundle包的時候,一定要把路徑、資源包名稱、包的后綴都寫正確,否則會找不到資源包而加載出錯。
另外,我們在剛才說最好在加載并使用它之前,先把依賴的包加載出來,并把它加了紅,這里要多說一句哦。
根據(jù)我代碼的測試,加載先后順序并不影響關(guān)系的依賴:
using System.Collections; using System.Collections.Generic; using UnityEngine;public class LoadAssetsBundlePackage : MonoBehaviour {// Use this for initializationvoid Start(){//先將prefab資源包加載進(jìn)內(nèi)存AssetBundle sphereAssetBundle = AssetBundle.LoadFromFile("AssetBundles/sphere.assetsbundle");//然后再加載prefabGameObject prefab = sphereAssetBundle.LoadAsset<GameObject>("Sphere");//實例化出一個實體Instantiate(prefab);//3秒鐘后再加載材質(zhì)和貼圖到內(nèi)存中Invoke("LoadMaterialAssetBundle",3.0f);}/// <summary>/// 加載材質(zhì)和貼圖/// </summary>void LoadMaterialAssetBundle(){AssetBundle.LoadFromFile("AssetBundles/material.assetsbundle");} }動態(tài)圖如下:
也就是說資源加載先后并沒有強(qiáng)制性要求,哪怕你是后面加載進(jìn)來的,只要我們之前存在關(guān)系,我就能順藤摸瓜找到你。
這個過程是沒有問題的,但是如果這個材質(zhì)丟失后續(xù)補(bǔ)上的過程被玩家看到,那想必是很不好的游戲體驗。所以我們知道了有這么個情況,加載順序還是按照規(guī)范來老老實實加載吧!?
?原創(chuàng)內(nèi)容,未經(jīng)許可不得擅自轉(zhuǎn)載文章部分或全部內(nèi)容。
總結(jié)
以上是生活随笔為你收集整理的【AssetBundle】七:打包生成的manifest文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CIH病毒破坏及其修复工具与方法
- 下一篇: Ogre SourceCode Comp