Unity AssetBundle -- AssetBundle打包
關於AssetBundle的打包,Unity提供了新的打包方法BuildPipeline.BuildAssetBundles()和它的過載,之前的BuildPipeline.BuildAssetBundle()已經棄用了
一、BuildPipeline.BuildAssetBundles(path, option, platform)
該方法可以將需要打包的資源單獨打成assetbundle檔案和對應的manifest檔案,但前提是該資源需要進行手動設定assetbundle的名稱
[MenuItem("AssetBundle/Build AssetBundle (Single)")] static void BuildAssetBundleSingle() { BuildPipeline.BuildAssetBundles(Application.dataPath + "/StreamingAssetsSingle", BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64); AssetDatabase.Refresh(); }
建立一個下拉選單,名為"AssetBundle/Build AssetBundle (Single)",然後使用BuildPipeline.BuildAssetBundles(path, option, platform)。path是打包到的路徑,option是個列舉,表示操作型別,platform同樣是列舉,表示打包成哪個平臺的檔案。
之後將需要打包的檔案手動設定assetbundle名稱後,就可以進行打包
二、BuildPipeline.BuildAssetBundles(path, builds, option, platform)
第二種打包方式是第一種擴充套件,該方法會將引數builds下提供的路徑下的資源全部打到一個assetbundle中。
相對與第一個方法,第二個方法額外提供了一個AssetBundleBuild[]型別的結構體builds,一般情況下,只需要提供builds下面的assetBundleName欄位值和assetNames欄位值即可進行打包。
這裡提供一個簡單的合併打包的例子
[MenuItem("AssetBundle/Build AssetBundle(Co-All)")] static List<string> allAssets = new List<string>(); static void BuildAssetBundleAll() { AssetBundleBuild[] buildMap = new AssetBundleBuild[1]; buildMap[0].assetBundleName = "AllBundle"; GetAssets(); buildMap[0].assetNames = allAssets.ToArray(); BuildPipeline.BuildAssetBundles(Application.dataPath + "/StreamingAssetsAll", buildMap, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64); AssetDatabase.Refresh(); } private static void GetAssets() { GetAssetPath("Materials"); GetAssetPath("Prefabs"); GetAssetPath("Textures"); } private static void GetAssetPath(string file) { string fullPath = Application.dataPath + "/" + file; string replaceStr = Application.dataPath.Replace("/", "\\"); if (Directory.Exists(fullPath)) { DirectoryInfo direction = new DirectoryInfo(fullPath); FileInfo[] files = direction.GetFiles("*", SearchOption.AllDirectories); if (files.Length <= 0) { Debug.LogWarning("files is null! : " + fullPath); } for (int i = 0; i < files.Length; i++) { if (files[i].Name.EndsWith(".meta")) { continue; } allAssets.Add(files[i].FullName.Replace(replaceStr, "Assets")); } } else { Debug.LogError(fullPath + " is not exist!"); } }
通過GetAssets()方法中提供的資料夾中的資源來獲取該資源的路徑,需要注意的是files.FullName提供的是絕對路徑,builds中的assetNames欄位需要的是Assets下的相對路徑,需要簡單的轉換。
將所有獲取到的相對路徑提供給assetNames欄位,最後呼叫方法進行打包。之後新增新資源或者新資料夾,只需將資源放到對應的目錄中,並在GetAssets()方法中新增GetAssetPath(“FileName”)即可。