(Unity4.7)assetbundle 坑爹總結


使用版本Unity4.7

一、關於依賴打包

1、當一個被打包的資源A引用了其他的資源B,並且沒有被打成一個包時,要選用【BuildAssetBundleOptions.CollectDependencies 收集依賴關系】或者【BuildAssetBundleOptions.CompleteAssets 完整資源】(兩者並不沖突可以全選)來進行打包,否則打包的時候unity也會發出警告:A上的組件丟失。

當選擇了BuildAssetBundleOptions.CollectDependencies時,果然你沒有將A依賴的資源B使用BuildPipeline.PushAssetDependencies() 和BuildPipeline.PopAssetDependencies()來進行依賴打包,那么A會把其引用的資源都打包到自己的assetbundle 中。如果引用的資源是圖片、sprite或自定義的shader(內置的shader不會打包,這里的自定義shader被unity看作是一種資源,打包處理的時候也是如同資源來處理的),那么會打包到assetbundle 中。如果引用的是代碼,那么會打包一個對工程中代碼的引用,也就是說引用的代碼必須存在於工程中,這樣當c被加載到本地的時候才可以和本地的代碼進行關聯,如果本地沒有這個代碼,則會丟失對這個腳本的引用。如圖所示可以看到打包的資源(圖片和NGUI中自帶的shader)和腳本代碼的引用:

 

當只選擇BuildAssetBundleOptions.CompleteAssets進行打包的時候,則不會將A引用的資源打包進來,通過調試也可以查看到包比使用CollectDependencies的小很多,斷點后也發現不包括依賴的資源。我的理解是等於我們告訴了unity我已經把所有資源放進資源包了,所以它也不會報錯。據官方文檔說在打包模型和動畫的時候這個選擇會起作用,還需要進一步的實踐驗證(驗證結果是使用CompleteAssets時,會把模型的所有動畫剪輯打包進去,包括在animationController中沒有使用到的)。如果只是用CompleteAssets而不使用CollectDependencies打包,那么由於資源包中不帶引用的信息,即使是引用的腳本(或資源)在本地工程存在,也會在assetbundle 被加載下來后丟失掉對腳本(或資源)的引用。

二、關於依賴資源鏈式查找的機制猜想

三、關於Unload

四、關於B(依賴A)重新打包,A是否要重新打包。即依賴資源更新,被依賴的資源是否需要重新打包的問題

五、關於GraphicsSettings和shader的打包

1、如果單獨打包一個資源c,c引用了一個NGUI自定義shader Unlit/Transparent Colored,選擇了BuildAssetBundleOptions.CollectDependencies,那么這個shader會打包到這個資源包中

2、如果不選擇BuildAssetBundleOptions.CollectDependencies,那么shader則不會打包。那么這個資源包在加載到本地的時候是否會自動關聯到本地的shader呢?這個要分為兩種情況討論。

第一種,就是如圖 5.1,將shader Unlit/Transparent Colored加入到GraphicsSettings中,這樣設置之后再打包,即使沒有選擇BuildAssetBundleOptions.CollectDependencies,當資源包加載到本地的時候也可以自動關聯這個shader。(需要保證shader會被打包到安裝包,要放在 Resource文件夾下

 

                   圖 5.1

第二種,就是如圖 5.2,沒有在GraphicsSettings中設置這個shader,然后打包,那么資源包加載到本地的時候是不能自動關聯這個shader的,結果如圖 5.3。

                                                    

                 圖 5.2

                圖 5.3

 

3、如果選擇BuildAssetBundleOptions.CollectDependencies,包shader打包成基礎包,c去依賴這個shader基礎包又分為兩種情況

3.1 c用到的shader都在shader基礎包中,那么一切正常。

3.2 c用到的shader一部分在shader包中,那么這一部分正常,不在基礎中的shader c並不會打包到自己身上,而回在在被加載回來后在本地尋找GraphicsSettings列表,找不到測丟失shader。(但是內置shader是可以自動關聯)

 

 

六、關於循環打包

在做打包工具的時候我們要對多個預設已經依賴打包。

比如打包BCDEF,他們都依賴A

你以為可以這樣寫:

push

build A

push

for BCDEF列表 

build 

pop

pop

然后你發現腳本各種丟失。。。

實際上應該這樣:

push

build A

push

for BCDEF列表 

push

build 

pop

pop

pop

 

這層push pop一定要寫,表示BCDEF是不互相依賴的並列關系~

七、關於AssetBundle.CreateFromFile

文檔如下:

AssetBundle.CreateFromFile

 
public static  AssetBundle  CreateFromFile(string path);

Parameters

path Path of the file on disk

 

See Also: WWW.assetBundleWWW.LoadFromCacheOrDownload.

Description

Loads an asset bundle from a disk.

Only uncompressed(只支持不壓縮的,打包的使用需要選擇uncompressed,默認是壓縮的) asset bundles are supported by this function. This is the fastest way to load an asset bundle

還有一個非常肯定的地方,用這兒方法加載的assetbundle不能有重名的,即使路徑不一樣,不然會報錯,提示已經加載過相同的包!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM