使用版本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
Parameters
path | Path of the file on disk See Also: WWW.assetBundle, WWW.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不能有重名的,即使路徑不一樣,不然會報錯,提示已經加載過相同的包!