unity5.4.3p2里面的AssetBundle打包流程,相比之前unity4.x的打包簡單了許多,Unity4.X中打包的時候需要自己去管理依賴關系,各種BuildPipeline.PushAssetDependencies()和BuildPipeline.PopAssetDependencies(),一不小心手一抖,依賴關系就慘不忍睹。下面簡單說說一下unity5.4的步驟。
1.在工程里新建兩個prefab,分別為ui1.prefab和ui2.prefab,如下圖:
???
?? 然后選中ui1,在右下角的AssetBundle Setting中,設置ui1的AssetBundleName為ui1,一樣的步驟將ui2的AssetBundleName設置為ui2。注意:當把AssetBundleName設置為同一個的時候,將會打進同一個包,這里分開打包。
??? 2.在ui1中引用ui2,具體引用操作很簡單,在ui1上掛個腳本,腳本里弄個publish GameObject prefab就好,如下圖:

??? 然后將AssetBundle目錄下的資源進行打包,打包過程其實很簡單(BuildAssetBundleOptions選擇不同的壓縮格式,壓縮比不一樣,在Profiler中SerializedFile大小也不一樣,加載后加壓的速度也不一樣,可酌情考慮使用),過程如下:
- using?UnityEngine;??
- using?System.Collections;??
- using?UnityEditor;??
- public?class?CreateAssetBundles?:?Editor??
- {??
- ????[MenuItem("Tools/Build?AssetBundles")]??
- ????static?void?BuildAllAssetBundles()??
- ????{??
- ????????BuildPipeline.BuildAssetBundles(Application.dataPath?+?"/AssetBundles",?BuildAssetBundleOptions.UncompressedAssetBundle,BuildTarget.Android);??
- ????????AssetDatabase.SaveAssets();??
- ????????AssetDatabase.Refresh();??
- ????????Debug.LogWarning("打包成功");??
- ????}??
- }??
打包后的結果如下:

打包的時候,在輸出的bundle所在的文件夾內還會生成一個總的manifest文件,叫做[文件夾名].manifest,我們看看都生成了什么文件,

前面三個文件和后面三個文件是新生成的,其實我們用到的也就是這幾個文件。在AssetBundles.manifest中我們看到

這里記錄了我們打包的所有的assetBundle的信息,其中info_0中記錄了ui1中引用了ui2。再看看ui1.manifest文件,

這里也記錄了ui1引用了哪些assetBundle。
3.加載assetBundle
?? 前面提到ui1中引用到了ui2的資源,所以這里分兩種方式加載,一種是先加載ui1再加載ui2,另一種是先加載ui2再加載ui1,看看這兩種方式有什么區別。
?(1)先加載ui1后加載ui2
- void?Load()??
- ???{??
- ?????????
- ???????AssetBundle?assetBundleManifest?=?AssetBundle.LoadFromFile(Application.dataPath?+?"/AssetBundles/AssetBundles");??
- ???????if?(assetBundleManifest?!=?null)????
- ???????{??
- ???????????AssetBundleManifest?manifest?=?(AssetBundleManifest)assetBundleManifest.LoadAsset("AssetBundleManifest");??
- ??
- ?????????????
- ???????????AssetBundle?bundle?=?AssetBundle.LoadFromFile(Application.dataPath?+?"/AssetBundles/ui1");??
- ???????????GameObject?obj?=?bundle.LoadAsset("ui1")?as?GameObject;??
- ???????????if?(obj?!=?null)??
- ???????????{??
- ???????????????Instantiate(obj);??
- ???????????}??
- ?????????????
- ???????????string[]?depends?=?manifest.GetAllDependencies("ui1");??
- ???????????AssetBundle[]?dependsAssetbundle?=?new?AssetBundle[depends.Length];??
- ???????????for?(int?index?=?0;?index?<?depends.Length;?index++)??
- ???????????{??
- ???????????????dependsAssetbundle[index]?=?AssetBundle.LoadFromFile(Application.dataPath?+?"/AssetBundles/"?+?depends[index]);??
- ???????????}??
- ???????}????
- ???}????
結果如下圖:

所以這里先加載ui1后加載ui1的依賴文件ui2,Relation中的prefab居然沒有missing
。我可記得在4.X的版本中必須先要加載依賴文件才行的啊
(2)在加載依賴文件ui2再加載ui1,
- void?Load()??
- ???{??
- ?????????
- ???????AssetBundle?assetBundleManifest?=?AssetBundle.LoadFromFile(Application.dataPath?+?"/AssetBundles/AssetBundles");??
- ???????if?(assetBundleManifest?!=?null)????
- ???????{??
- ???????????AssetBundleManifest?manifest?=?(AssetBundleManifest)assetBundleManifest.LoadAsset("AssetBundleManifest");??
- ?????????????
- ???????????string[]?depends?=?manifest.GetAllDependencies("ui1");??
- ???????????AssetBundle[]?dependsAssetbundle?=?new?AssetBundle[depends.Length];??
- ???????????for?(int?index?=?0;?index?<?depends.Length;?index++)??
- ???????????{??
- ???????????????dependsAssetbundle[index]?=?AssetBundle.LoadFromFile(Application.dataPath?+?"/AssetBundles/"?+?depends[index]);??
- ???????????}??
- ?????????????
- ???????????AssetBundle?bundle?=?AssetBundle.LoadFromFile(Application.dataPath?+?"/AssetBundles/ui1");??
- ???????????GameObject?obj?=?bundle.LoadAsset("ui1")?as?GameObject;??
- ???????????if?(obj?!=?null)??
- ???????????{??
- ???????????????Instantiate(obj);??
- ???????????}??
- ?????????????
- ???????}????
- ???}????????????????????????????????????????????

這種情況ui2出來可以正常理解了。
(3)只加載ui1,不加載依賴文件ui2
- void?Load()??
- ????{??
- ??????????
- ????????AssetBundle?assetBundleManifest?=?AssetBundle.LoadFromFile(Application.dataPath?+?"/AssetBundles/AssetBundles");??
- ????????if?(assetBundleManifest?!=?null)????
- ????????{??
- ????????????AssetBundleManifest?manifest?=?(AssetBundleManifest)assetBundleManifest.LoadAsset("AssetBundleManifest");??
- ??????????????
- ??????????????
- ??????????????
- ??????????????
- ??????????????
- ??????????????
- ??????????????
- ??????????????
- ????????????AssetBundle?bundle?=?AssetBundle.LoadFromFile(Application.dataPath?+?"/AssetBundles/ui1");??
- ????????????GameObject?obj?=?bundle.LoadAsset("ui1")?as?GameObject;??
- ????????????if?(obj?!=?null)??
- ????????????{??
- ????????????????Instantiate(obj);??
- ????????????}??
- ??????????????
- ????????}????
- ????}????
這種情況必須missing啊。
so,問題出來了,本測試中使用的是unity5.4.3p2,為何步驟(1)中ui1依賴的文件ui2后加載也能出來?
,暫時不知為何,看官如果知道可否指點一二
。