public static IEnumerator BuildAssetBundle(BuildTarget targetPlatform, bool rebuild = false, Action callback = null) { BuildConfig.ClearLogs(); yield return(null); var tmp = EditorUserBuildSettings.activeBuildTarget; var t = DateTime.Now; try { var outDir = BundleOutDir + TargetName(targetPlatform); if (rebuild && Directory.Exists(outDir)) { Directory.Delete(outDir, true); } if (!Directory.Exists(outDir)) { Directory.CreateDirectory(outDir); } // backup old manifest var oldManifestPath = outDir + "/" + TargetName(targetPlatform); if (File.Exists(oldManifestPath)) { File.Copy(oldManifestPath, oldManifestPath + ".old", true); } BuildConfig.Instance().RefreshGroups(); yield return(null); AssetDatabase.Refresh(); yield return(null); AssetDatabase.SaveAssets(); yield return(null); // this is the right time to update LastBuildTime if i continue edit lua while BuildAssetBundle BuildConfig.Instance().LastBuildTime = DateTime.Now.ToFileTimeUtc(); var options = (BuildAssetBundleOptions)BuildConfig.Instance().BundleBuildOptions; if (rebuild) { options |= BuildAssetBundleOptions.ForceRebuildAssetBundle; } var manifest = BuildPipeline.BuildAssetBundles(outDir, options, targetPlatform); yield return(null); // zip var version = BuildConfig.Instance().Version.ToString(); var outRoot = BundleOutDir + TargetName(targetPlatform) + "/" + version; AssetBundleManifest oldManifest = null; if (File.Exists(oldManifestPath + ".old")) { oldManifest = AssetBundle.LoadFromFile(oldManifestPath + ".old").LoadAsset <AssetBundleManifest>("AssetBundleManifest"); } var allAssetBundles = manifest.GetAllAssetBundles().ToList(); allAssetBundles.Add(TargetName(targetPlatform)); // collect news var n = 0; foreach (var i in allAssetBundles) { var finfo = new FileInfo(outDir + "/" + i); // compare hash var hash = manifest.GetAssetBundleHash(i); var oldhash = default(Hash128); if (oldManifest != null) { oldhash = oldManifest.GetAssetBundleHash(i); } var path = outDir + "/" + i; var lzmaPath = path + BuildConfig.CompressedExtension; if (hash != oldhash || !File.Exists(lzmaPath)) { EditorUtility.DisplayCancelableProgressBar("compressing ...", i, (float)(++n) / allAssetBundles.Count); AppLog.d(Tag, "{0} {2} => {1}", i, hash, oldhash); // TODO: encode bundle BundleHelper.CompressFileLZMA(path, lzmaPath); var bundleInfo = BuildConfig.Instance().GetBundleInfo(i); if (bundleInfo != null) { bundleInfo.Size = (ulong)finfo.Length; bundleInfo.Hash = hash.ToString(); bundleInfo.Version = version; } } // copy var outPath = outRoot + "/" + i + BuildConfig.CompressedExtension; var dir = Path.GetDirectoryName(outPath); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } File.Copy(lzmaPath, outPath, true); yield return(null); } } finally { AssetDatabase.Refresh(); EditorUtility.ClearProgressBar(); AppLog.d(Tag, "BuildAssetBundle coast: {0}", DateTime.Now - t); } yield return(null); if (callback != null) { callback(); } yield return(null); }