public static AssetBundleBuildsManifest BuildAssetBundles(string outputDir, BuildAssetBundleOptions buildOption, BuildTarget targetPlatform)
        {
#if ASSET_BUNDLE_BUILD_TIME_CHECK
            float startTime = Time.realtimeSinceStartup;
#endif

            AssetBundleBuildsManifest manifest = new AssetBundleBuildsManifest();

            AssetBundleManifest unityManifest = null;
            // append
            AllAssetBundleInformation allAssetBundleInfo = GetAllAssetBundleInfoList();
            int allAssetBundleCount = AssetDatabase.GetAllAssetBundleNames().Length;
            //
            List <AssetBundleBuild> buildTargetBuffer = new List <AssetBundleBuild>();

#if ASSET_BUNDLE_BUILD_TIME_CHECK
            float groupingComplete = Time.realtimeSinceStartup;
#endif


            /// Build NoDependAssetBundles
            int idx = 0;
            foreach (var noDependAssetBundle in allAssetBundleInfo.noDependList)
            {
                string assetBundleName = noDependAssetBundle.assetBundleName;
                buildTargetBuffer.Add(CreateAssetBundleBuildFromAssetBundleName(assetBundleName));
                if (buildTargetBuffer.Count > BulkConvertNum)
                {
#if ASSET_BUNDLE_GROUPING_DEBUG
                    DebugPrintBuildPipeline(buildTargetBuffer);
#endif
                    unityManifest = BuildPipeline.BuildAssetBundles(outputDir, buildTargetBuffer.ToArray(), buildOption, targetPlatform);
                    manifest.AddUnityManifest(unityManifest);
                    buildTargetBuffer.Clear();
                }
                ++idx;
                EditorUtility.DisplayProgressBar("process no dependence bundles", assetBundleName, (float)idx / (float)allAssetBundleCount);
            }
            if (buildTargetBuffer.Count > 0)
            {
#if ASSET_BUNDLE_GROUPING_DEBUG
                DebugPrintBuildPipeline(buildTargetBuffer);
#endif
                unityManifest = BuildPipeline.BuildAssetBundles(outputDir, buildTargetBuffer.ToArray(), buildOption, targetPlatform);
                manifest.AddUnityManifest(unityManifest);
                buildTargetBuffer.Clear();
            }

            // group set
            var dependGroupList = new List <List <AssetBundleInfoWithDepends> >(allAssetBundleInfo.dependGroup.Values);
            int length          = dependGroupList.Count;

            for (int i = 0; i < length; ++i)
            {
                string assetBundleName = "";
                foreach (var assetBundle in dependGroupList[i])
                {
                    assetBundleName = assetBundle.assetBundleName;
                    buildTargetBuffer.Add(CreateAssetBundleBuildFromAssetBundleName(assetBundleName));
                    ++idx;
                }
                bool buildFlag = false;
                buildFlag |= (buildTargetBuffer.Count > BulkConvertNum);
                buildFlag |= (i == length - 1);
                if (i < length - 1)
                {
                    buildFlag |= (dependGroupList[i + 1].Count > BulkConvertNum);
                }

                if (buildFlag)
                {
#if ASSET_BUNDLE_GROUPING_DEBUG
                    DebugPrintBuildPipeline(buildTargetBuffer);
#endif
                    unityManifest = BuildPipeline.BuildAssetBundles(outputDir, buildTargetBuffer.ToArray(), buildOption, targetPlatform);
                    manifest.AddUnityManifest(unityManifest);
                    buildTargetBuffer.Clear();
                }
                EditorUtility.DisplayProgressBar("process dependence", "group " + i + " " + assetBundleName, (float)idx / (float)allAssetBundleCount);
            }
            EditorUtility.ClearProgressBar();
#if ASSET_BUNDLE_BUILD_TIME_CHECK
            float buildCompleteTime = Time.realtimeSinceStartup;

            UnityEngine.Debug.Log("All BuildTime:" + (buildCompleteTime - startTime) + "sec\n" +
                                  "GroupingTime:" + (groupingComplete - startTime) + "sec\n" +
                                  "AssetBundleBuild:" + (buildCompleteTime - groupingComplete) + "sec\n");
#endif
            return(manifest);
        }
        public static void BuildSingleManifest(string outputBundleDir, string outputAssetDir, string manifestBundleName, AssetBundleBuildsManifest manifest, BuildAssetBundleOptions buildOption, BuildTarget targetPlatform)
        {
            string manifestAssetPath = System.IO.Path.Combine(outputAssetDir, manifestBundleName);

            manifestAssetPath += ".asset";
            AssetDatabase.CreateAsset(manifest, manifestAssetPath);
            AssetDatabase.SaveAssets();
            AssetBundleBuild build = new AssetBundleBuild();

            build.assetBundleName = manifestBundleName;
            build.assetNames      = new string[] { manifestAssetPath };
            BuildPipeline.BuildAssetBundles(outputBundleDir, new AssetBundleBuild[] { build }, buildOption, targetPlatform);
        }