1. 程式人生 > >Unity AssetBundle -- AssetBundle打包

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”)即可。