Beispiel #1
0
        /// <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);
        }