public static bool BuildAB(AssetBundleBuild[] assetBundleBuilds, out AssetBundleManifest assetBundleManifest) { BuildSetting setting = BuildSetting.GetInstance(); if (setting.BuildAssetBuild) { if (setting.DeleteOutputBeforeBuild && Directory.Exists(setting.GetFormatedBuildOutput())) { Directory.Delete(setting.GetFormatedBuildOutput(), true); } if (!Directory.Exists(setting.GetFormatedBuildOutput())) { Directory.CreateDirectory(setting.GetFormatedBuildOutput()); } if (File.Exists(setting.GetFormatedBundleInfoPath())) { File.Delete(setting.GetFormatedBundleInfoPath()); } string bundleMapDirectory = Path.GetDirectoryName(setting.GetFormatedBundleInfoPath()); if (!Directory.Exists(bundleMapDirectory)) { Directory.CreateDirectory(bundleMapDirectory); } if (setting.ResetBundleName) { EditorUtility.DisplayProgressBar("Builder", "BuildPipeline.BuildAssetBundles", 0); assetBundleManifest = BuildPipeline.BuildAssetBundles(setting.GetFormatedBuildOutput() , setting.BuildAssetBundleOptions , EditorUserBuildSettings.activeBuildTarget); } else { EditorUtility.DisplayProgressBar("Builder", "BuildPipeline.BuildAssetBundles", 0); assetBundleManifest = BuildPipeline.BuildAssetBundles(setting.GetFormatedBuildOutput() , assetBundleBuilds , setting.BuildAssetBundleOptions , EditorUserBuildSettings.activeBuildTarget); } return(assetBundleManifest != null); } else { assetBundleManifest = null; return(true); } }
public static AssetBundleBuild[] GenerateAssetBundle() { BuildSetting setting = BuildSetting.GetInstance(); try { string directory = Path.GetDirectoryName(setting.GetFormatedBundleBuildsPath()); if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) { Directory.CreateDirectory(directory); } } catch (Exception) { // 失败也不影响,不需要handle } AssetBundleBuild[] assetBundleBuilds = null; //启用根据AssetBundleBuilds.json文件,构建AssetBundleBuild数组,加速打包,适用于没有打包配置更改的情景 if (setting.UseCachedBuild) { try { string json = File.ReadAllText(setting.GetFormatedBundleBuildsPath()); if (!string.IsNullOrEmpty(json)) { assetBundleBuilds = JsonMapper.ToObject <AssetBundleBuild[]>(json); } } catch (Exception) { // 没有cache就重新计算,不需要handle } } if (assetBundleBuilds != null) { Dictionary <string, string> assetToBundle = new Dictionary <string, string>(); for (int iBundle = 0; iBundle < assetBundleBuilds.Length; iBundle++) { AssetBundleBuild iterBundle = assetBundleBuilds[iBundle]; for (int iAsset = 0; iAsset < iterBundle.assetNames.Length; iAsset++) { assetToBundle[iterBundle.assetNames[iAsset]] = iterBundle.assetBundleName; } } //启用设置AssetImporter更改文件BundleName和Varient if (setting.ResetBundleName) { ResetBundleName(assetToBundle); } return(assetBundleBuilds); } List <BaseRule> rules = CollectRule(); try { for (int iRule = 0; iRule < rules.Count; iRule++) { rules[iRule].Execute(ms_Context); } if (setting.ResetBundleName) { ResetBundleName(ms_Context.GetAssetToBundle()); } else { assetBundleBuilds = ms_Context.GenerateAssetBundleBuild(); } } catch (Exception e) { MDebug.LogError("AssetBundle", e.ToString()); EditorUtility.DisplayDialog("Builder" , "Build AB Failed\n" + e.ToString() , "OK"); throw e; } finally { EditorUtility.ClearProgressBar(); } try { File.WriteAllText(setting.GetFormatedBundleBuildsPath(), LitJson.JsonMapper.ToJson(assetBundleBuilds)); } catch (Exception) { // 写失败了也不影响,不需要handle } return(assetBundleBuilds); }
public override void OnGUI(string searchContext) { base.OnGUI(searchContext); BuildSetting setting = BuildSetting.GetInstance(); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("保存")) { BuildSetting.GetInstance().Save(); } if (GUILayout.Button("清除BundleName")) { Builder.ClearAllBundleName(); } if (GUILayout.Button("打包")) { BuildSetting.GetInstance().Save(); Builder.Build(); } EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); EditorGUILayout.HelpBox("打包目录和BundleName路径支持Format: \n" + "\t{Application.dataPath}\n" + "\t{BuildTarget}" , MessageType.Info); if (EGLUtility.Folder(out setting.BuildOutput , "打包目录" , setting.BuildOutput)) { m_FormatedBuildOutput = BuildSetting.GetInstance().GetFormatedBuildOutput(); } EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("打包目录", m_FormatedBuildOutput); if (GUILayout.Button("打开", GUILayout.Width(36))) { EditorUtility.RevealInFinder(m_FormatedBuildOutput); } EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); if (EGLUtility.Folder(out setting.BundleBuildsPath , "BundleName路径" , setting.BundleBuildsPath)) { m_FormatedBundleBuildsPath = BuildSetting.GetInstance().GetFormatedBundleBuildsPath(); } EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("BundleName路径", m_FormatedBundleBuildsPath); if (GUILayout.Button("打开", GUILayout.Width(36))) { EditorUtility.RevealInFinder(m_FormatedBundleBuildsPath); EditorUtility.OpenWithDefaultApp(m_FormatedBundleBuildsPath); } EditorGUILayout.EndHorizontal(); if (EGLUtility.Folder(out setting.BundleInfoPath , "BundleInfo路径" , setting.BundleInfoPath)) { m_FormatedBundleInfoPath = BuildSetting.GetInstance().GetFormatedBundleInfoPath(); } EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("BundleInfo路径", m_FormatedBundleInfoPath); if (GUILayout.Button("打开", GUILayout.Width(36))) { EditorUtility.RevealInFinder(m_FormatedBundleInfoPath); EditorUtility.OpenWithDefaultApp(m_FormatedBundleInfoPath); } EditorGUILayout.EndHorizontal(); EditorGUILayout.HelpBox("开启这个选项可以加快打包速度\n" + "如果本地有之前缓存的BundleName文件就不在打包前执行打包规则\n" + "当需要打包的资源有增加或移除,则不应开启这个选项" , MessageType.Info); setting.UseCachedBuild = EditorGUILayout.Toggle("使用缓存的BundleName", setting.UseCachedBuild); EditorGUILayout.Space(); EditorGUILayout.HelpBox("关闭这个选项可以加快打包速度\n" + "但是有些插件和调试工具必须设置BundleName才能使用\n\n" + "例如AssetBundleBrowser\n" + "可以通过这个工具设置BundleName,但是不勾选打包AB的选项。然后通过AssetBundleBrowser打包" , MessageType.Info); setting.ResetBundleName = EditorGUILayout.Toggle("设置BundleName", setting.ResetBundleName); EditorGUILayout.Space(); if (EGLUtility.Folder(out setting.AssetInfosPath , "AssetInfos路径" , setting.AssetInfosPath)) { m_FormatedAssetInfosPath = BuildSetting.GetInstance().GetFormateAssetInfosPath(); } EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("AssetInfos路径", m_FormatedAssetInfosPath); if (GUILayout.Button("打开", GUILayout.Width(36))) { EditorUtility.RevealInFinder(m_FormatedAssetInfosPath); EditorUtility.OpenWithDefaultApp(m_FormatedAssetInfosPath); } EditorGUILayout.EndHorizontal(); if (EGLUtility.Folder(out setting.AssetKeyEnumFilePath , "AssetKeyEnum路径" , setting.AssetKeyEnumFilePath)) { m_FormatedAssetKeyEnumFilePath = BuildSetting.GetInstance().GetFormateAssetKeyEnumFilePath(); } EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("AssetKeyEnum路径", m_FormatedAssetKeyEnumFilePath); if (GUILayout.Button("打开", GUILayout.Width(36))) { EditorUtility.RevealInFinder(m_FormatedAssetKeyEnumFilePath); } EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); setting.BuildAssetBundleOptions = (BuildAssetBundleOptions)EditorGUILayout.EnumFlagsField("打包选项", setting.BuildAssetBundleOptions); setting.BuildAssetBuild = EditorGUILayout.Toggle("打包AB", setting.BuildAssetBuild); setting.DeleteOutputBeforeBuild = EditorGUILayout.Toggle("打包前删除上次的AB", setting.DeleteOutputBeforeBuild); }