Exemple #1
0
    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);
    }