private void BuildAssetBundles(AssetBundleBuild[] buildMap, BuildAssetBundleOptions buildOptions, BuildTarget buildTarget)
        {
            m_BuildReport.LogInfo("Start build AssetBundles for '{0}'...", buildTarget.ToString());

            string buildTargetUrlName = GetBuildTargetName(buildTarget);

            string workingPath = string.Format("{0}{1}/", WorkingPath, buildTargetUrlName);

            m_BuildReport.LogInfo("Working path is '{0}'.", workingPath);

            string outputPackagePath = string.Format("{0}{1}/", OutputPackagePath, buildTargetUrlName);

            Directory.CreateDirectory(outputPackagePath);
            m_BuildReport.LogInfo("Output package path is '{0}'.", outputPackagePath);

            string outputZipPath = string.Format("{0}{1}/", OutputZipPath, buildTargetUrlName);

            Directory.CreateDirectory(outputZipPath);
            m_BuildReport.LogInfo("output Zip Path is '{0}'.", outputZipPath);

            // Clean working path
            List <string> validNames = new List <string>();

            foreach (AssetBundleBuild i in buildMap)
            {
                string assetBundleName = GetAssetBundleFullName(i.assetBundleName, i.assetBundleVariant);
                validNames.Add(assetBundleName);
            }

            if (Directory.Exists(workingPath))
            {
                Uri      workingUri = new Uri(workingPath, UriKind.RelativeOrAbsolute);
                string[] fileNames  = Directory.GetFiles(workingPath, "*", SearchOption.AllDirectories);
                foreach (string fileName in fileNames)
                {
                    if (fileName.EndsWith(".manifest"))
                    {
                        continue;
                    }

                    string relativeName = workingUri.MakeRelativeUri(new Uri(fileName)).ToString();
                    if (!validNames.Contains(relativeName))
                    {
                        File.Delete(fileName);
                    }
                }

                string[] manifestNames = Directory.GetFiles(workingPath, "*.manifest", SearchOption.AllDirectories);
                foreach (string manifestName in manifestNames)
                {
                    if (!File.Exists(manifestName.Substring(0, manifestName.LastIndexOf('.'))))
                    {
                        File.Delete(manifestName);
                    }
                }

                Icarus.GameFramework.Utility.Path.RemoveEmptyDirectory(workingPath);
            }

            if (!Directory.Exists(workingPath))
            {
                Directory.CreateDirectory(workingPath);
            }

            if (m_BuildEventHandler != null)
            {
                m_BuildReport.LogInfo("Execute build event handler 'PreProcessBuild' for '{0}'...", buildTarget.ToString());
                m_BuildEventHandler.PreProcessBuild(buildTarget, workingPath, outputPackagePath, outputZipPath);
            }

            // Build AssetBundles
            m_BuildReport.LogInfo("Unity start build AssetBundles for '{0}'...", buildTarget.ToString());
            AssetBundleManifest assetBundleManifest = BuildPipeline.BuildAssetBundles(workingPath, buildMap, buildOptions, buildTarget);

            if (assetBundleManifest == null)
            {
                m_BuildReport.LogError("Build AssetBundles for '{0}' failure.", buildTarget.ToString());
                return;
            }

            m_BuildReport.LogInfo("Unity build AssetBundles for '{0}' complete.", buildTarget.ToString());

            // Process AssetBundles
            for (int i = 0; i < buildMap.Length; i++)
            {
                string assetBundleFullName = GetAssetBundleFullName(buildMap[i].assetBundleName, buildMap[i].assetBundleVariant);
                if (ProcessingAssetBundle != null)
                {
                    if (ProcessingAssetBundle(assetBundleFullName, (float)(i + 1) / buildMap.Length))
                    {
                        m_BuildReport.LogWarning("The build has been canceled by user.");
                        return;
                    }
                }

                m_BuildReport.LogInfo("Start process '{0}' for '{1}'...", assetBundleFullName, buildTarget.ToString());

                ProcessAssetBundle(workingPath, outputPackagePath, outputZipPath, buildTarget, buildMap[i].assetBundleName, buildMap[i].assetBundleVariant);

                m_BuildReport.LogInfo("Process '{0}' for '{1}' complete.", assetBundleFullName, buildTarget.ToString());
            }

            //写入version.info
            _writeVersionInfoFile(outputZipPath);

            ProcessPackageList(outputPackagePath, buildTarget);
            m_BuildReport.LogInfo("Process package list for '{0}' complete.", buildTarget.ToString());

            if (m_BuildEventHandler != null)
            {
                m_BuildReport.LogInfo("Execute build event handler 'PostProcessBuild' for '{0}'...", buildTarget.ToString());
                m_BuildEventHandler.PostProcessBuild(buildTarget, workingPath, outputPackagePath, outputZipPath);
            }

            if (ProcessAssetBundleComplete != null)
            {
                ProcessAssetBundleComplete(buildTarget, "", 0, 0, 0, 0);
            }

            m_BuildReport.LogInfo("Build AssetBundles for '{0}' success.", buildTarget.ToString());
        }