日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【AssetBundle】七:打包生成的manifest文件

發(fā)布時間:2024/3/26 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【AssetBundle】七:打包生成的manifest文件 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我們在之前知道了AssetBundle打包的時候除了生成AssetBundle包之外,還會生成.manifest文件,我們把它稱作配置文件。從事Android開發(fā)的同學們一定不會對.AndroidManifest文件陌生,所以我們習慣上也把AssetBundle打包的時候生成的.manifest文件成為該AssetBundle包的配置文件。

我們使用EditPlus打開配置文件看看:

我們先來看看上圖中指出的1、2、3:

1.CRC

說起CRC我們可能會有些陌生,但是說起MD5,恐怕大家都只要這玩意是干什么用的了。

MD5用于確保信息傳輸完整一致,也就是我們常說的校驗碼,CRC與MD5相同,屬于校驗文件方式的一種。資源包在使用之前首先要保證我接收到的包要完整吧,所以unity打包AssetBundle包,使用了CRC來進行校驗。至于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ù)資源之間的依賴關系自動向這其中插入相關信息。

上圖中因為是我們共享的圖片和素材的AssetBundle包,所以在包含了圖片和材質(zhì)的信息之后,并不需要依賴其他的資源,所以依賴信息的位置為空,我們打開prefab的AssetBundle包的配置文件:

我們可以看到球體prefab打包AssetBundle之后,配置文件中包含一個校驗碼,prefab的路徑信息,最重要的是在最下方的依賴信息中,我們可以看到它依賴了我們剛剛查看的material包。

我們再來看看另外一個問題:

假如我在開發(fā)的時候,代碼加載了AssetBundle包,但是包里依賴的資源我在工程里都存在,那么我需不需要加載依賴的包呢?

答案是需要的。

加載包并且實例化prefab對象的時候,我們只認依賴關系,依賴關系能為我們提供精確地加載目標,而不需要在工程里面挨個檢索資源。

這就是另一個內(nèi)容:我們在加載某個AssetBundle包的時候,如果它依賴別的AssetBundle包,那么我們最好在加載并使用它之前,先把依賴的包加載出來,否則可能導致材質(zhì)丟失、要實例化的對象不存在等錯誤。

我們試驗下:unity工程中有了材質(zhì)和貼圖,我們來加載球體:

using System.Collections; using System.Collections.Generic; using UnityEngine;public class LoadAssetsBundlePackage : MonoBehaviour {// Use this for initializationvoid Start(){//先將資源包加載進內(nèi)存AssetBundle assetBundle = AssetBundle.LoadFromFile("AssetBundles/sphere.assetsbundle");//然后再加載prefabGameObject prefab = assetBundle.LoadAsset<GameObject>("Sphere");Instantiate(prefab);} }

結(jié)果如下:

雖然本地有著材質(zhì)和貼圖,但是球體prefab并不會使用,它認準的是資源包中依賴的材質(zhì)和貼圖。

所以我們需要在加載球體的AssetBundle包之前先將材質(zhì)和貼圖的AssetBundle對象加載進內(nèi)存中:

using System.Collections; using System.Collections.Generic; using UnityEngine;public class LoadAssetsBundlePackage : MonoBehaviour {// Use this for initializationvoid Start(){//先將材質(zhì)和貼圖的資源包加載進內(nèi)存AssetBundle materialAssetBundle = AssetBundle.LoadFromFile("AssetBundles/material.assetsbundle");//接著將prefab資源包加載進內(nèi)存AssetBundle sphereAssetBundle = AssetBundle.LoadFromFile("AssetBundles/sphere.assetsbundle");//然后再加載prefabGameObject prefab = sphereAssetBundle.LoadAsset<GameObject>("Sphere");Instantiate(prefab);} }

結(jié)果我們可以發(fā)現(xiàn),prefab能夠正常的加載出來了:

值得注意的是,我們在使用代碼加載AssetBundle包的時候,一定要把路徑、資源包名稱、包的后綴都寫正確,否則會找不到資源包而加載出錯。

另外,我們在剛才說最好在加載并使用它之前,先把依賴的包加載出來,并把它加了紅,這里要多說一句哦。

根據(jù)我代碼的測試,加載先后順序并不影響關系的依賴:

using System.Collections; using System.Collections.Generic; using UnityEngine;public class LoadAssetsBundlePackage : MonoBehaviour {// Use this for initializationvoid Start(){//先將prefab資源包加載進內(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)圖如下:

也就是說資源加載先后并沒有強制性要求,哪怕你是后面加載進來的,只要我們之前存在關系,我就能順藤摸瓜找到你。

這個過程是沒有問題的,但是如果這個材質(zhì)丟失后續(xù)補上的過程被玩家看到,那想必是很不好的游戲體驗。所以我們知道了有這么個情況,加載順序還是按照規(guī)范來老老實實加載吧!?

?原創(chuàng)內(nèi)容,未經(jīng)許可不得擅自轉(zhuǎn)載文章部分或全部內(nèi)容。

總結(jié)

以上是生活随笔為你收集整理的【AssetBundle】七:打包生成的manifest文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。