예제 #1
0
        static void BuildBundles(BuildTarget targetPlatform, string[] files)
        {
            var buildInfos = new Dictionary <string, AssetBundleBuild>();

            var filters = new List <ResAbstractBuildFilter>()
            {
                new ResPrefabBuildFilter(),
                new ResLuaBuildFilter(),
            };

            // BeforeBuild
            foreach (var filter in filters)
            {
                filter.BeforeBuild();
            }

            // Prepare build
            foreach (var file in files)
            {
                foreach (var filter in filters)
                {
                    if (filter.Filtered(file))
                    {
                        AssetBundleBuild?buildInfoNullable = filter.PrepareBuild(file);
                        if (buildInfoNullable != null)
                        {
                            var buildInfo = (AssetBundleBuild)buildInfoNullable;
                            buildInfos[file] = buildInfo;
                        }

                        if (filter.BlockOthers)
                        {
                            break;
                        }
                    }
                }
            }
            AssetDatabase.Refresh();

            try
            {
                var filteredBuildInfos = new List <AssetBundleBuild>();

                // Real build
                var overrideFilters = new HashSet <ResAbstractBuildFilter>();
                foreach (var pair in buildInfos)
                {
                    var filepath  = pair.Key;
                    var buildInfo = pair.Value;

                    var overrided = false;
                    foreach (var filter in filters)
                    {
                        overrided |= filter.OverrideBuild(filepath, buildInfo);
                        if (overrided)
                        {
                            overrideFilters.Add(filter);
                            if (filter.BlockOthers)
                            {
                                break;
                            }
                        }
                    }

                    if (overrided == false)
                    {
                        // Add dependent buildInfos
                        ResBuildUtility.AppendDependencies(buildInfo, filteredBuildInfos);

                        // Add self buildInfo
                        filteredBuildInfos.Add(buildInfo);
                    }
                }

                // Build override filters first
                foreach (var filter in overrideFilters)
                {
                    filter.DoOverrideBuild(_outPath, filteredBuildInfos);
                }

                // Build
                var options = BuildAssetBundleOptions.DeterministicAssetBundle;
                BuildPipeline.BuildAssetBundles(
                    _outPath,
                    filteredBuildInfos.ToArray(),
                    options,
                    targetPlatform
                    );
            }
            catch (Exception e)
            {
                LogManager.Error(e.Message);
            }
            finally
            {
                // After build
                foreach (var filter in filters)
                {
                    filter.AfterBuild();
                }
                AssetDatabase.RemoveUnusedAssetBundleNames();
                AssetDatabase.Refresh();
            }
        }
예제 #2
0
        static void BuildBundles(BuildTarget targetPlatform, string[] files)
        {
            var buildInfos = new Dictionary <string, AssetBundleBuild>();

            var filters = new List <ResAbstractBuildFilter>()
            {
                new ResLuaBuildFilter(),
                new ResSpriteBuildFilter(),

                // Assets contain dependence
                new ResPrefabBuildFilter(),
            };

            // 10
            var basePercent = 0f;
            var percent     = 10f;
            var index       = 0f;
            var count       = filters.Count;

            // BeforeBuild
            EditorUtility.DisplayProgressBar(
                "Building AssetBundles",
                string.Format("Before building..."),
                ((1) * percent + basePercent) / 100);
            foreach (var filter in filters)
            {
                filter.BeforeBuild();
                index++;
            }

            // 30
            basePercent = basePercent + percent;
            percent     = 20f;
            index       = 0;
            count       = files.Length * filters.Count;

            // Prepare build
            EditorUtility.DisplayProgressBar(
                "Building AssetBundles",
                string.Format("Preparing..."),
                ((1) * percent + basePercent) / 100);
            foreach (var file in files)
            {
                foreach (var filter in filters)
                {
                    index++;

                    if (filter.Filtered(file))
                    {
                        AssetBundleBuild?buildInfoNullable = filter.PrepareBuild(file);
                        if (buildInfoNullable != null)
                        {
                            var buildInfo = (AssetBundleBuild)buildInfoNullable;
                            buildInfos[file] = buildInfo;
                        }

                        if (filter.BlockOthers)
                        {
                            break;
                        }
                    }
                }
            }

            // 50
            basePercent = basePercent + percent;
            percent     = 20f;
            index       = 0;
            count       = files.Length * buildInfos.Count;

            try
            {
                var filteredBuildInfos = new List <AssetBundleBuild>();

                // Real build
                foreach (var pair in buildInfos)
                {
                    var filepath  = pair.Key;
                    var buildInfo = pair.Value;
                    {
                        // Add dependent buildInfos
                        ResBuildUtility.AppendDependencies(buildInfo, filteredBuildInfos);

                        // Add self buildInfo
                        filteredBuildInfos.Add(buildInfo);
                    }
                }

                // 60
                basePercent = basePercent + percent;
                percent     = 10f;
                index       = 0;
                count       = filters.Count;

                // Additive build
                foreach (var filter in filters)
                {
                    EditorUtility.DisplayProgressBar(
                        "Building AssetBundles",
                        string.Format(filter.GetType().Name + " override building..."),
                        ((index / count) * percent + basePercent) / 100);
                    index++;

                    filter.OverrideBuild(_outPath, filteredBuildInfos);
                }

                // 80
                basePercent = basePercent + percent;
                percent     = 20f;
                index       = 0;
                count       = filteredBuildInfos.Count;

                // Set bundle name
                EditorUtility.DisplayProgressBar(
                    "Building AssetBundles",
                    string.Format("Setting bundleNames..."),
                    ((1) * percent + basePercent) / 100);
                for (var i = 0; i < filteredBuildInfos.Count; ++i)
                {
                    index++;

                    var buildInfo = filteredBuildInfos[i];
                    ResBuildUtility.ResetBundleName(ref buildInfo);
                    filteredBuildInfos[i] = buildInfo;
                }

                // Build
                BuildPipeline.BuildAssetBundles(
                    _outPath,
                    // filteredBuildInfos.ToArray(),
                    _options,
                    targetPlatform
                    );

                // 100
                basePercent = basePercent + percent;
                percent     = 20f;
                index       = 1;
                count       = 1;

                // Build version file
                EditorUtility.DisplayProgressBar(
                    "Building AssetBundles",
                    string.Format("Building version file..."),
                    ((index / count) * percent + basePercent) / 100);

                var bundlesPath = _outPath;
                files = ResBuildUtility.GetFiles(bundlesPath);
                BuildVersionFile(files);
            }
            catch (Exception e)
            {
                LogManager.Error(e.Message);
            }
            finally
            {
                // After build
                foreach (var filter in filters)
                {
                    filter.AfterBuild();
                }
            }
        }