/// <summary> /// 压缩AssetBundle /// </summary> public static bool CompressAssetBundles(ResourcesManifest old_resources_manifest , ref ResourcesManifest resources_manifest) { if (resources_manifest == null) { return(false); } // 通过记录新旧版本中压缩标记 // 判定资源是否需要压缩、删除压缩包 Dictionary <string, int> dic = new Dictionary <string, int>(); int old_version_bit = 0x1; // 旧版本中压缩 int new_version_bit = 0x2; // 新版本中压缩 var itr = old_resources_manifest.Data.AssetBundles.GetEnumerator(); while (itr.MoveNext()) { if (itr.Current.Value.IsCompress) { string name = itr.Current.Value.AssetBundleName; if (!dic.ContainsKey(name)) { dic.Add(name, old_version_bit); } else { dic[name] |= old_version_bit; } } } itr = resources_manifest.Data.AssetBundles.GetEnumerator(); while (itr.MoveNext()) { if (itr.Current.Value.IsCompress) { string name = itr.Current.Value.AssetBundleName; if (!dic.ContainsKey(name)) { dic.Add(name, new_version_bit); } else { dic[name] |= new_version_bit; } } } float current = 0f; float total = resources_manifest.Data.AssetBundles.Count; var itr1 = dic.GetEnumerator(); while (itr1.MoveNext()) { string name = itr1.Current.Key; int mask = itr1.Current.Value; //过滤主AssetBundle文件 if (name == Common.MAIN_MANIFEST_FILE_NAME) { continue; } string action; string file_name = EditorCommon.PATH + "/" + name; if ((mask & old_version_bit) > 0 && (mask & new_version_bit) == 0) { // 旧版本中存在,新版本不存在 // 删除压缩包 string compress_file = Compress.GetCompressFileName(file_name); File.Delete(compress_file); File.Delete(compress_file + Common.NATIVE_MANIFEST_EXTENSION); //重写ResourcesManifest数据 var ab = resources_manifest.Data.AssetBundles[name]; ab.CompressSize = 0; action = "Delete Compress"; } else if ((mask & new_version_bit) > 0) { //新版本中存在,压缩文件 Compress.CompressFile(file_name); //重写ResourcesManifest数据 var ab = resources_manifest.Data.AssetBundles[name]; ab.CompressSize = zcode.FileHelper.GetFileSize(Compress.GetCompressFileName(file_name)); action = "Compress"; } else { action = "Ignore"; } //更新进度条 if (ShowProgressBar("", action + " " + name, current / total)) { EditorUtility.ClearProgressBar(); return(false); } } EditorUtility.ClearProgressBar(); return(true); }