diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs index b026ff35..a23dd021 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs @@ -30,7 +30,7 @@ namespace YooAsset.Editor // 创建新补丁清单 PackageManifest manifest = new PackageManifest(); - manifest.FileVersion = YooAssetSettings.ManifestFileVersion; + manifest.FileVersion = ManifestDefine.FileVersion; manifest.EnableAddressable = buildMapContext.Command.EnableAddressable; manifest.LocationToLower = buildMapContext.Command.LocationToLower; manifest.IncludeAssetGUID = buildMapContext.Command.IncludeAssetGUID; diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogDefine.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogDefine.cs new file mode 100644 index 00000000..918e7718 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogDefine.cs @@ -0,0 +1,21 @@ + +namespace YooAsset +{ + internal class CatalogDefine + { + /// + /// 文件极限大小(100MB) + /// + public const int FileMaxSize = 104857600; + + /// + /// 文件头标记 + /// + public const uint FileSign = 0x133C5EE; + + /// + /// 文件格式版本 + /// + public const string FileVersion = "1.0.0"; + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogDefine.cs.meta b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogDefine.cs.meta new file mode 100644 index 00000000..f03166e5 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogDefine.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c6be7b8be0b51784997c959b370193e9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogTools.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogTools.cs new file mode 100644 index 00000000..0d45e132 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogTools.cs @@ -0,0 +1,102 @@ +using System; +using System.IO; +using System.Collections.Generic; +using UnityEngine; + +namespace YooAsset +{ + internal static class CatalogTools + { + /// + /// 序列化(JSON文件) + /// + public static void SerializeToJson(string savePath, DefaultBuildinFileCatalog catalog) + { + string json = JsonUtility.ToJson(catalog, true); + FileUtility.WriteAllText(savePath, json); + } + + /// + /// 反序列化(JSON文件) + /// + public static DefaultBuildinFileCatalog DeserializeFromJson(string jsonContent) + { + return JsonUtility.FromJson(jsonContent); + } + + /// + /// 序列化(二进制文件) + /// + public static void SerializeToBinary(string savePath, DefaultBuildinFileCatalog catalog) + { + using (FileStream fs = new FileStream(savePath, FileMode.Create)) + { + // 创建缓存器 + BufferWriter buffer = new BufferWriter(CatalogDefine.FileMaxSize); + + // 写入文件标记 + buffer.WriteUInt32(CatalogDefine.FileSign); + + // 写入文件版本 + buffer.WriteUTF8(CatalogDefine.FileVersion); + + // 写入文件头信息 + buffer.WriteUTF8(catalog.PackageName); + buffer.WriteUTF8(catalog.PackageVersion); + + // 写入资源包列表 + buffer.WriteInt32(catalog.Wrappers.Count); + for (int i = 0; i < catalog.Wrappers.Count; i++) + { + var fileWrapper = catalog.Wrappers[i]; + buffer.WriteUTF8(fileWrapper.BundleGUID); + buffer.WriteUTF8(fileWrapper.FileName); + } + + // 写入文件流 + buffer.WriteToStream(fs); + fs.Flush(); + } + } + + /// + /// 反序列化(二进制文件) + /// + public static DefaultBuildinFileCatalog DeserializeFromBinary(byte[] binaryData) + { + // 创建缓存器 + BufferReader buffer = new BufferReader(binaryData); + + // 读取文件标记 + uint fileSign = buffer.ReadUInt32(); + if (fileSign != CatalogDefine.FileSign) + throw new Exception("Invalid catalog file !"); + + // 读取文件版本 + string fileVersion = buffer.ReadUTF8(); + if (fileVersion != CatalogDefine.FileVersion) + throw new Exception($"The catalog file version are not compatible : {fileVersion} != {CatalogDefine.FileVersion}"); + + DefaultBuildinFileCatalog catalog = new DefaultBuildinFileCatalog(); + { + // 读取文件头信息 + catalog.FileVersion = fileVersion; + catalog.PackageName = buffer.ReadUTF8(); + catalog.PackageVersion = buffer.ReadUTF8(); + + // 读取资源包列表 + int fileCount = buffer.ReadInt32(); + catalog.Wrappers = new List(fileCount); + for (int i = 0; i < fileCount; i++) + { + var fileWrapper = new DefaultBuildinFileCatalog.FileWrapper(); + fileWrapper.BundleGUID = buffer.ReadUTF8(); + fileWrapper.FileName = buffer.ReadUTF8(); + catalog.Wrappers.Add(fileWrapper); + } + } + + return catalog; + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogTools.cs.meta b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogTools.cs.meta new file mode 100644 index 00000000..ca5dd4b7 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogTools.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cf87ffe3b3de69942ac16640a330dd37 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileCatalog.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileCatalog.cs index aad797bf..6c59e986 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileCatalog.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileCatalog.cs @@ -15,14 +15,13 @@ namespace YooAsset { public string BundleGUID; public string FileName; - - public FileWrapper(string bundleGUID, string fileName) - { - BundleGUID = bundleGUID; - FileName = fileName; - } } + /// + /// 文件版本 + /// + public string FileVersion; + /// /// 包裹名称 /// diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs index 06ea1ae6..313a739e 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs @@ -336,9 +336,9 @@ namespace YooAsset string fileName = YooAssetSettingsData.GetManifestBinaryFileName(PackageName, packageVersion); return PathUtility.Combine(_packageRoot, fileName); } - public string GetCatalogFileLoadPath() + public string GetCatalogBinaryFileLoadPath() { - return PathUtility.Combine(_packageRoot, DefaultBuildinFileSystemDefine.BuildinCatalogFileName); + return PathUtility.Combine(_packageRoot, DefaultBuildinFileSystemDefine.BuildinCatalogBinaryFileName); } /// diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs index c5a76264..8ac5b494 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs @@ -84,6 +84,7 @@ namespace YooAsset // 创建内置清单实例 var buildinFileCatalog = new DefaultBuildinFileCatalog(); + buildinFileCatalog.FileVersion = CatalogDefine.FileVersion; buildinFileCatalog.PackageName = packageName; buildinFileCatalog.PackageVersion = packageVersion; @@ -97,7 +98,8 @@ namespace YooAsset $"{packageName}_{packageVersion}.hash", $"{packageName}_{packageVersion}.json", $"{packageName}_{packageVersion}.report", - DefaultBuildinFileSystemDefine.BuildinCatalogFileName + DefaultBuildinFileSystemDefine.BuildinCatalogJsonFileName, + DefaultBuildinFileSystemDefine.BuildinCatalogBinaryFileName }; // 记录所有内置资源文件 @@ -114,7 +116,9 @@ namespace YooAsset string fileName = fileInfo.Name; if (fileMapping.TryGetValue(fileName, out string bundleGUID)) { - var wrapper = new DefaultBuildinFileCatalog.FileWrapper(bundleGUID, fileName); + var wrapper = new DefaultBuildinFileCatalog.FileWrapper(); + wrapper.BundleGUID = bundleGUID; + wrapper.FileName = fileName; buildinFileCatalog.Wrappers.Add(wrapper); } else @@ -123,16 +127,20 @@ namespace YooAsset } } - // 创建输出目录 - string saveFilePath = $"{pacakgeDirectory}/{DefaultBuildinFileSystemDefine.BuildinCatalogFileName}"; - if (File.Exists(saveFilePath)) - File.Delete(saveFilePath); - // 创建输出文件 - File.WriteAllText(saveFilePath, JsonUtility.ToJson(buildinFileCatalog, false)); - UnityEditor.AssetDatabase.Refresh(); + string jsonFilePath = $"{pacakgeDirectory}/{DefaultBuildinFileSystemDefine.BuildinCatalogJsonFileName}"; + if (File.Exists(jsonFilePath)) + File.Delete(jsonFilePath); + CatalogTools.SerializeToJson(jsonFilePath, buildinFileCatalog); - Debug.Log($"Succeed to save buildin file catalog : {saveFilePath}"); + // 创建输出文件 + string binaryFilePath = $"{pacakgeDirectory}/{DefaultBuildinFileSystemDefine.BuildinCatalogBinaryFileName}"; + if (File.Exists(binaryFilePath)) + File.Delete(binaryFilePath); + CatalogTools.SerializeToBinary(binaryFilePath, buildinFileCatalog); + + UnityEditor.AssetDatabase.Refresh(); + Debug.Log($"Succeed to save buildin file catalog : {binaryFilePath}"); return true; } } diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemDefine.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemDefine.cs index 5a70375b..59a67980 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemDefine.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemDefine.cs @@ -4,8 +4,13 @@ namespace YooAsset internal class DefaultBuildinFileSystemDefine { /// - /// 内置清单文件名称 + /// 内置清单JSON文件名称 /// - public const string BuildinCatalogFileName = "BuildinCatalog.json"; + public const string BuildinCatalogJsonFileName = "BuildinCatalog.json"; + + /// + /// 内置清单二进制文件名称 + /// + public const string BuildinCatalogBinaryFileName = "BuildinCatalog.bytes"; } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinCatalogFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinCatalogFileOperation.cs index 2cd635cb..08ba4196 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinCatalogFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinCatalogFileOperation.cs @@ -1,5 +1,4 @@ using System; -using UnityEngine; namespace YooAsset { @@ -14,10 +13,8 @@ namespace YooAsset } private readonly DefaultBuildinFileSystem _fileSystem; - private UnityWebTextRequestOperation _webTextRequestOp; + private UnityWebDataRequestOperation _webDataRequestOp; private ESteps _steps = ESteps.None; - private string _textData = null; - internal LoadBuildinCatalogFileOperation(DefaultBuildinFileSystem fileSystem) { @@ -34,45 +31,36 @@ namespace YooAsset if (_steps == ESteps.RequestData) { - if (_webTextRequestOp == null) + if (_webDataRequestOp == null) { - string filePath = _fileSystem.GetCatalogFileLoadPath(); + string filePath = _fileSystem.GetCatalogBinaryFileLoadPath(); string url = DownloadSystemHelper.ConvertToWWWPath(filePath); - _webTextRequestOp = new UnityWebTextRequestOperation(url); - _webTextRequestOp.StartOperation(); - AddChildOperation(_webTextRequestOp); + _webDataRequestOp = new UnityWebDataRequestOperation(url); + _webDataRequestOp.StartOperation(); + AddChildOperation(_webDataRequestOp); } - _webTextRequestOp.UpdateOperation(); - if (_webTextRequestOp.IsDone == false) + _webDataRequestOp.UpdateOperation(); + if (_webDataRequestOp.IsDone == false) return; - if (_webTextRequestOp.Status == EOperationStatus.Succeed) + if (_webDataRequestOp.Status == EOperationStatus.Succeed) { _steps = ESteps.LoadCatalog; - _textData = _webTextRequestOp.Result; } else { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _webTextRequestOp.Error; + Error = _webDataRequestOp.Error; } } if (_steps == ESteps.LoadCatalog) { - if (string.IsNullOrEmpty(_textData)) - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = $"Buildin catalog file content is empty !"; - return; - } - try { - var catalog = JsonUtility.FromJson(_textData); + var catalog = CatalogTools.DeserializeFromBinary(_webDataRequestOp.Result); if (catalog.PackageName != _fileSystem.PackageName) { _steps = ESteps.Done; diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs index b632a628..22d9b5d8 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs @@ -198,9 +198,9 @@ namespace YooAsset string fileName = YooAssetSettingsData.GetManifestBinaryFileName(PackageName, packageVersion); return PathUtility.Combine(FileRoot, fileName); } - public string GetCatalogFileLoadPath() + public string GetCatalogBinaryFileLoadPath() { - return PathUtility.Combine(_webPackageRoot, DefaultBuildinFileSystemDefine.BuildinCatalogFileName); + return PathUtility.Combine(_webPackageRoot, DefaultBuildinFileSystemDefine.BuildinCatalogBinaryFileName); } /// diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/internal/LoadWebServerCatalogFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/internal/LoadWebServerCatalogFileOperation.cs index 93cf1482..d9aaeb64 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/internal/LoadWebServerCatalogFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/internal/LoadWebServerCatalogFileOperation.cs @@ -2,7 +2,6 @@ using System.IO; using System.Collections; using System.Collections.Generic; -using UnityEngine; namespace YooAsset { @@ -17,9 +16,8 @@ namespace YooAsset } private readonly DefaultWebServerFileSystem _fileSystem; - private UnityWebTextRequestOperation _webTextRequestOp; + private UnityWebDataRequestOperation _webDataRequestOp; private ESteps _steps = ESteps.None; - private string _textData = null; internal LoadWebServerCatalogFileOperation(DefaultWebServerFileSystem fileSystem) { @@ -36,45 +34,36 @@ namespace YooAsset if (_steps == ESteps.RequestData) { - if (_webTextRequestOp == null) + if (_webDataRequestOp == null) { - string filePath = _fileSystem.GetCatalogFileLoadPath(); + string filePath = _fileSystem.GetCatalogBinaryFileLoadPath(); string url = DownloadSystemHelper.ConvertToWWWPath(filePath); - _webTextRequestOp = new UnityWebTextRequestOperation(url); - _webTextRequestOp.StartOperation(); - AddChildOperation(_webTextRequestOp); + _webDataRequestOp = new UnityWebDataRequestOperation(url); + _webDataRequestOp.StartOperation(); + AddChildOperation(_webDataRequestOp); } - _webTextRequestOp.UpdateOperation(); - if (_webTextRequestOp.IsDone == false) + _webDataRequestOp.UpdateOperation(); + if (_webDataRequestOp.IsDone == false) return; - if (_webTextRequestOp.Status == EOperationStatus.Succeed) + if (_webDataRequestOp.Status == EOperationStatus.Succeed) { _steps = ESteps.LoadCatalog; - _textData = _webTextRequestOp.Result; } else { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _webTextRequestOp.Error; + Error = _webDataRequestOp.Error; } } if (_steps == ESteps.LoadCatalog) { - if (string.IsNullOrEmpty(_textData)) - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = $"Buildin catalog file content is empty !"; - return; - } - try { - var catalog = JsonUtility.FromJson(_textData); + var catalog = CatalogTools.DeserializeFromBinary(_webDataRequestOp.Result); if (catalog.PackageName != _fileSystem.PackageName) { _steps = ESteps.Done; diff --git a/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs b/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs index ffb7b5e1..c5a28ba5 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs @@ -8,7 +8,6 @@ namespace YooAsset { internal static class ManifestTools { -#if UNITY_EDITOR /// /// 序列化(JSON文件) /// @@ -160,7 +159,7 @@ namespace YooAsset InitManifest(manifest); return manifest; } -#endif + #region 解析资源清单辅助方法 public static void InitManifest(PackageManifest manifest)