예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
        }