private static GF.Asset.AssetInfo[] GenerateAssetMapAndAssetKeyEnumFile(Dictionary <string, int> bundleNameToIndex = null) { StringBuilder assetKeyEnumBuilder = new StringBuilder(); assetKeyEnumBuilder.Append("namespace GF.Asset\n"); assetKeyEnumBuilder.Append("{\n"); assetKeyEnumBuilder.Append("\tpublic enum AssetKey\n"); assetKeyEnumBuilder.Append("\t{\n"); Dictionary <string, AssetInfo> assetKeyToAssetInfo = ms_Context.GetAssetKeyToAssetInfo(); GF.Asset.AssetInfo[] assetInfos = new GF.Asset.AssetInfo[assetKeyToAssetInfo.Count]; int iAsset = 0; foreach (KeyValuePair <string, AssetInfo> kv in assetKeyToAssetInfo) { assetInfos[iAsset++] = new GF.Asset.AssetInfo(kv.Value.AssetPath , bundleNameToIndex != null ? bundleNameToIndex[kv.Value.BundleName] : 0); assetKeyEnumBuilder.Append($"\t\t{GF.Common.Utility.StringUtility.FormatToVariableName(kv.Key)},\n"); } assetKeyEnumBuilder.Append("\t}\n") .Append("}"); File.WriteAllText(BuildSetting.GetInstance().GetFormateAssetInfosPath(), JsonMapper.ToJson(assetInfos)); File.WriteAllText(BuildSetting.GetInstance().GetFormateAssetKeyEnumFilePath(), assetKeyEnumBuilder.ToString()); return(assetInfos); }
public static void Build() { bool success = false; try { ms_Context = new Context(); AssetBundleBuild[] assetBundleBuild = GenerateAssetBundle(); success = BuildAB(assetBundleBuild, out AssetBundleManifest assetBundleManifest); if (success) { GenerateAssetMapAndAssetKeyEnumFile(); } if (success && BuildSetting.GetInstance().BuildAssetBuild) { GenerateBundleInfosAndAssetInfosAndAssetKeyEnumFile(assetBundleManifest); } } catch (Exception e) { MDebug.LogError("AssetBundle", "Build AssetBundle Exception:\n" + e.ToString()); } finally { ms_Context = null; EditorUtility.ClearProgressBar(); EditorUtility.DisplayDialog("AssetBundle" , "Build AB " + (success ? "Success" : "Failed") , "OK"); } }
public BuildSettingProvider(string path, SettingsScope scopes, IEnumerable <string> keywords = null) : base(path, scopes, keywords) { m_FormatedBuildOutput = BuildSetting.GetInstance().GetFormatedBuildOutput(); m_FormatedBundleBuildsPath = BuildSetting.GetInstance().GetFormatedBundleBuildsPath(); m_FormatedAssetInfosPath = BuildSetting.GetInstance().GetFormateAssetInfosPath(); m_FormatedBundleInfoPath = BuildSetting.GetInstance().GetFormatedBundleInfoPath(); m_FormatedAssetKeyEnumFilePath = BuildSetting.GetInstance().GetFormateAssetKeyEnumFilePath(); }
private static void GenerateBundleInfosAndAssetInfosAndAssetKeyEnumFile(AssetBundleManifest assetBundleManifest) { string[] assetBundles = assetBundleManifest.GetAllAssetBundles(); BundleInfo[] bundleInfos = new BundleInfo[assetBundles.Length]; List <int> bundleDependenceIndexsCache = new List <int>(); HashSet <int> alreadyAddedBundleDependencesCache = new HashSet <int>(); Dictionary <string, string[]> bundleDependencesMap = new Dictionary <string, string[]>(); Dictionary <string, int> bundleNameToIndex = new Dictionary <string, int>(assetBundles.Length); for (int assetBundlesIndex = 0; assetBundlesIndex < assetBundles.Length; assetBundlesIndex++) { bundleNameToIndex.Add(assetBundles[assetBundlesIndex], assetBundlesIndex); } for (int iBundle = 0; iBundle < assetBundles.Length; iBundle++) { string bundleName = assetBundles[iBundle]; bundleDependencesMap.Add(bundleName, assetBundleManifest.GetDirectDependencies(bundleName)); } for (int iBundle = 0; iBundle < assetBundles.Length; iBundle++) { alreadyAddedBundleDependencesCache.Clear(); bundleDependenceIndexsCache.Clear(); string bundleName = assetBundles[iBundle]; AddBundleDependence(bundleName, bundleDependencesMap, bundleNameToIndex, bundleDependenceIndexsCache, alreadyAddedBundleDependencesCache); bundleDependenceIndexsCache.RemoveAt(bundleDependenceIndexsCache.Count - 1); bundleInfos[iBundle].BundleName = assetBundles[iBundle]; bundleInfos[iBundle].DependencyBundleIndexs = bundleDependenceIndexsCache.ToArray(); } GF.Asset.AssetInfo[] assetInfos = GenerateAssetMapAndAssetKeyEnumFile(bundleNameToIndex); Dictionary <int, List <int> > bundleToAssets = new Dictionary <int, List <int> >(assetBundles.Length); for (int iAsset = 0; iAsset < assetInfos.Length; iAsset++) { int bundleIndex = assetInfos[iAsset].BundleIndex; if (!bundleToAssets.TryGetValue(bundleIndex, out List <int> assets)) { assets = new List <int>(); bundleToAssets[bundleIndex] = assets; } assets.Add(iAsset); } foreach (KeyValuePair <int, List <int> > kv in bundleToAssets) { bundleInfos[kv.Key].DirectyReferenceAssets = kv.Value.ToArray <int>(); } string formatedBundleMapPath = BuildSetting.GetInstance().GetFormatedBundleInfoPath(); string bundleMapJson = JsonMapper.ToJson(bundleInfos); File.WriteAllText(formatedBundleMapPath, bundleMapJson); }
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); }