/// <summary> /// 打包AssetBundle /// </summary> public static void BuildAllAssetBundlesToTarget(BuildTarget target , BuildAssetBundleOptions options) { string manifest_file = EditorCommon.BUILD_PATH + "/" + Common.MAIN_MANIFEST_FILE_NAME; AssetBundleManifest old_manifest = Common.LoadMainManifestByPath(manifest_file); if (!Directory.Exists(EditorCommon.BUILD_PATH)) { Directory.CreateDirectory(EditorCommon.BUILD_PATH); } BuildPipeline.BuildAssetBundles(EditorCommon.BUILD_PATH, options, target); AssetDatabase.Refresh(); AssetBundleManifest new_manifest = Common.LoadMainManifestByPath(manifest_file); ComparisonAssetBundleManifest(old_manifest, new_manifest); ExportResourcesManifestFile(new_manifest); string resoures_manifest_file = EditorCommon.BUILD_PATH + "/" + Common.RESOURCES_MANIFEST_FILE_NAME; ResourcesManifest resoureces_manifest = Common.LoadResourcesManifestByPath(resoures_manifest_file); CompressAssetBundles(resoureces_manifest, ref resoureces_manifest); resoureces_manifest.Save(resoures_manifest_file); CopyNativeAssetBundleToStreamingAssets(resoureces_manifest); EditorUtility.ClearProgressBar(); AssetDatabase.Refresh(); }
/// <summary> /// 初始化 /// </summary> IEnumerator Preprocess() { //创建资源根目录 if (!Directory.Exists(Common.PATH)) { Directory.CreateDirectory(Common.PATH); } //判断主资源文件是否存在,不存在则拷贝备份资源至资源根目录 bool do_initial_copy = false; string resources_manifest_file = Common.GetFileFullName(Common.RESOURCES_MANIFEST_FILE_NAME); if (!File.Exists(resources_manifest_file)) { do_initial_copy = true; } else { // 拷贝安装包初始化目录中的ResourcesManifest,并判断是否重新拷贝初始化目录下的所有文件 string full_name = Common.GetFileFullName(Common.RESOURCES_MANIFEST_FILE_NAME); string initial_full_name = Common.GetInitialFileFullName(Common.RESOURCES_MANIFEST_FILE_NAME); string cache_full_name = Common.GetCacheFileFullName(Common.RESOURCES_MANIFEST_FILE_NAME); yield return(Common.StartCopyFile(initial_full_name, cache_full_name)); //判断安装包初始目录是否完整 ResourcesManifest initial = Common.LoadResourcesManifestByPath(cache_full_name); if (initial == null) { Error(emErrorCode.PreprocessError , "Initial path don't contains " + Common.RESOURCES_MANIFEST_FILE_NAME + "!"); yield break; } ResourcesManifest current = Common.LoadResourcesManifestByPath(full_name); if (current == null) { do_initial_copy = true; } else if (current.Data.Version < initial.Data.Version) { do_initial_copy = true; } //删除缓存中的文件 if (File.Exists(cache_full_name)) { File.Delete(cache_full_name); } } if (do_initial_copy) { yield return(CopyAllInitialFiles()); } PreprocessFinished(); }
/// <summary> /// 更新AssetBundle /// </summary> IEnumerator StartUpdateAssetBundle() { if (ErrorCode != emErrorCode.None) { yield break; } UpdateCompleteValue(0f, 0f); //载入新的ResourcesManifest ResourcesManifest old_resource_manifest = AssetBundleManager.Instance.ResourcesManifest; string file = Common.GetCacheFileFullName(Common.RESOURCES_MANIFEST_FILE_NAME); ResourcesManifest new_resources_manifest = Common.LoadResourcesManifestByPath(file); if (new_resources_manifest == null) { Error(emErrorCode.LoadNewResourcesManiFestFailed, "Can't load new verion ResourcesManifest!"); yield break; } //载入MainManifest AssetBundleManifest manifest = AssetBundleManager.Instance.MainManifest; file = Common.GetCacheFileFullName(Common.MAIN_MANIFEST_FILE_NAME); AssetBundleManifest new_manifest = Common.LoadMainManifestByPath(file); if (new_manifest == null) { Error(emErrorCode.LoadNewMainManifestFailed, "Can't find new version MainManifest!"); yield break; } //获取需下载的资源列表与删除的资源的列表 List <string> download_files = new List <string>(); List <string> delete_files = new List <string>(); CompareAssetBundleDifference(ref download_files, ref delete_files, manifest, new_manifest, old_resource_manifest, new_resources_manifest); //删除已废弃的文件 if (delete_files.Count > 0) { for (int i = 0; i < delete_files.Count; ++i) { string full_name = Common.GetFileFullName(delete_files[i]); if (File.Exists(full_name)) { File.Delete(full_name); yield return(0); } } } //更新所有需下载的资源 ab_download_ = new AssetBundleDownloader(current_url_); ab_download_.Start(Common.PATH, download_files, new_resources_manifest); while (!ab_download_.IsDone) { UpdateCompleteValue(ab_download_.CompletedSize, ab_download_.TotalSize); yield return(0); } if (ab_download_.IsFailed) { Error(emErrorCode.DownloadAssetBundleFailed); yield break; } }
/// <summary> /// 更新AssetBundle /// </summary> IEnumerator UpdatingUpdateAssetBundle() { if (ErrorCode != emErrorCode.None) { yield break; } UpdateCompleteValue(0f, 0f); //载入新的ResourcesManifest ResourcesManifest old_resource_manifest = AssetBundleManager.Instance.ResManifest; string file = Common.UPDATER_CACHE_PATH + "/" + Common.RESOURCES_MANIFEST_FILE_NAME; ResourcesManifest new_resources_manifest = Common.LoadResourcesManifestByPath(file); if (new_resources_manifest == null) { Error(emErrorCode.LoadNewResourcesManiFestFailed , "Can't load new verion ResourcesManifest!"); yield break; } //载入MainManifest AssetBundleManifest manifest = AssetBundleManager.Instance.MainManifest; file = Common.UPDATER_CACHE_PATH + "/" + Common.MAIN_MANIFEST_FILE_NAME; AssetBundleManifest new_manifest = Common.LoadMainManifestByPath(file); if (new_manifest == null) { Error(emErrorCode.LoadNewMainManifestFailed , "Can't find new version MainManifest!"); yield break; } //获取需下载的资源列表与删除的资源的列表 List <string> download_files = new List <string>(); List <string> delete_files = new List <string>(); ComparisonUtils.CompareAndCalcDifferenceFiles(ref download_files, ref delete_files , manifest, new_manifest , old_resource_manifest, new_resources_manifest , ComparisonUtils.emCompareMode.All); // 进度控制 float totalProgress = delete_files.Count + download_files.Count; float currentProgress = 0; //载入下载缓存数据, 过滤缓存中已下载的文件 DownloadCache download_cache = new DownloadCache(); download_cache.Load(Common.DOWNLOADCACHE_FILE_PATH); if (!download_cache.HasData()) { download_cache = null; } if (download_cache != null) { var cache_itr = download_cache.Data.AssetBundles.GetEnumerator(); while (cache_itr.MoveNext()) { DownloadCacheData.AssetBundle elem = cache_itr.Current.Value; string name = elem.AssetBundleName; string full_name = Common.GetFileFullName(name); if (File.Exists(full_name)) { string cache_hash = elem.Hash; string new_hash = new_manifest.GetAssetBundleHash(name).ToString(); if (!string.IsNullOrEmpty(cache_hash) && cache_hash.CompareTo(new_hash) == 0) { download_files.Remove(name); ++currentProgress; UpdateCompleteValue(currentProgress, totalProgress); yield return(null); } } } } //删除已废弃的文件 if (delete_files.Count > 0) { for (int i = 0; i < delete_files.Count; ++i) { string full_name = Common.GetFileFullName(delete_files[i]); if (File.Exists(full_name)) { File.Delete(full_name); ++currentProgress; UpdateCompleteValue(currentProgress, totalProgress); yield return(null); } } } //更新所有需下载的资源 ab_download_ = new AssetBundleDownloader(current_url_); ab_download_.Start(Common.PATH, download_files, new_resources_manifest); while (!ab_download_.IsDone) { UpdateCompleteValue(currentProgress + ab_download_.CompleteDownloadList.Count, totalProgress); yield return(null); } if (ab_download_.IsFailed) { Error(ab_download_.ErrorCode); yield break; } }