From 227f2332a96bb22de218ea6bcfb624b9993d26bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E5=86=A0=E5=B3=B0?= Date: Mon, 4 Aug 2025 17:26:57 +0800 Subject: [PATCH] =?UTF-8?q?refactor=20:=20=E9=87=8D=E6=9E=84=E5=86=85?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=E7=9A=84=E5=8A=A0=E8=BD=BD=E5=92=8C?= =?UTF-8?q?=E6=8B=B7=E8=B4=9D=E9=80=BB=E8=BE=91=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优先使用File类拷贝文件 --- .../DownloadSystem/DownloadSystemHelper.cs | 4 + .../Operation/DBFSInitializeOperation.cs | 131 +++++++++++-- .../internal/CopyBuildinFileOperation.cs | 102 +++++++++++ ....meta => CopyBuildinFileOperation.cs.meta} | 2 +- .../CopyBuildinPackageManifestOperation.cs | 173 ------------------ .../LoadBuildinCatalogFileOperation.cs | 46 +++-- .../LoadBuildinPackageManifestOperation.cs | 26 ++- .../RequestBuildinPackageHashOperation.cs | 48 +++-- .../RequestBuildinPackageVersionOperation.cs | 48 +++-- 9 files changed, 345 insertions(+), 235 deletions(-) create mode 100644 Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/CopyBuildinFileOperation.cs rename Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/{CopyBuildinPackageManifestOperation.cs.meta => CopyBuildinFileOperation.cs.meta} (83%) delete mode 100644 Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/CopyBuildinPackageManifestOperation.cs diff --git a/Assets/YooAsset/Runtime/DownloadSystem/DownloadSystemHelper.cs b/Assets/YooAsset/Runtime/DownloadSystem/DownloadSystemHelper.cs index 602ab9de..dcc50e99 100644 --- a/Assets/YooAsset/Runtime/DownloadSystem/DownloadSystemHelper.cs +++ b/Assets/YooAsset/Runtime/DownloadSystem/DownloadSystemHelper.cs @@ -37,6 +37,10 @@ namespace YooAsset string url; // 获取对应平台的URL地址 + // 说明:苹果不同设备上操作系统不同。 + // 说明:iPhone和iPod对应的是iOS系统。 + // 说明:iPad对应的是iPadOS系统。 + // 说明:AppleTV对应的是tvOS系统。 #if UNITY_EDITOR_OSX url = StringUtility.Format("file://{0}", path); #elif UNITY_EDITOR diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/DBFSInitializeOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/DBFSInitializeOperation.cs index c6eebf61..657b7b6d 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/DBFSInitializeOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/DBFSInitializeOperation.cs @@ -8,14 +8,18 @@ namespace YooAsset private enum ESteps { None, - CopyBuildinManifest, + LoadBuildinPackageVersion, + CopyBuildinPackageHash, + CopyBuildinPackageManifest, InitUnpackFileSystem, LoadCatalogFile, Done, } private readonly DefaultBuildinFileSystem _fileSystem; - private CopyBuildinPackageManifestOperation _copyBuildinPackageManifestOp; + private RequestBuildinPackageVersionOperation _requestBuildinPackageVersionOp; + private CopyBuildinFileOperation _copyBuildinHashFileOp; + private CopyBuildinFileOperation _copyBuildinManifestFileOp; private FSInitializeFileSystemOperation _initUnpackFIleSystemOp; private LoadBuildinCatalogFileOperation _loadBuildinCatalogFileOp; private ESteps _steps = ESteps.None; @@ -32,7 +36,7 @@ namespace YooAsset Error = $"{nameof(DefaultBuildinFileSystem)} is not support WEBGL platform !"; #else if (_fileSystem.CopyBuildinPackageManifest) - _steps = ESteps.CopyBuildinManifest; + _steps = ESteps.LoadBuildinPackageVersion; else _steps = ESteps.InitUnpackFileSystem; #endif @@ -42,20 +46,76 @@ namespace YooAsset if (_steps == ESteps.None || _steps == ESteps.Done) return; - if (_steps == ESteps.CopyBuildinManifest) + if (_steps == ESteps.LoadBuildinPackageVersion) { - if (_copyBuildinPackageManifestOp == null) + if (_requestBuildinPackageVersionOp == null) { - _copyBuildinPackageManifestOp = new CopyBuildinPackageManifestOperation(_fileSystem); - _copyBuildinPackageManifestOp.StartOperation(); - AddChildOperation(_copyBuildinPackageManifestOp); + _requestBuildinPackageVersionOp = new RequestBuildinPackageVersionOperation(_fileSystem); + _requestBuildinPackageVersionOp.StartOperation(); + AddChildOperation(_requestBuildinPackageVersionOp); } - _copyBuildinPackageManifestOp.UpdateOperation(); - if (_copyBuildinPackageManifestOp.IsDone == false) + _requestBuildinPackageVersionOp.UpdateOperation(); + if (_requestBuildinPackageVersionOp.IsDone == false) return; - if (_copyBuildinPackageManifestOp.Status == EOperationStatus.Succeed) + if (_requestBuildinPackageVersionOp.Status == EOperationStatus.Succeed) + { + _steps = ESteps.CopyBuildinPackageHash; + } + else + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = _requestBuildinPackageVersionOp.Error; + } + } + + if (_steps == ESteps.CopyBuildinPackageHash) + { + if (_copyBuildinHashFileOp == null) + { + string packageVersion = _requestBuildinPackageVersionOp.PackageVersion; + string destFilePath = GetCopyPackageHashDestPath(packageVersion); + string sourceFilePath = _fileSystem.GetBuildinPackageHashFilePath(packageVersion); + _copyBuildinHashFileOp = new CopyBuildinFileOperation(sourceFilePath, destFilePath); + _copyBuildinHashFileOp.StartOperation(); + AddChildOperation(_copyBuildinHashFileOp); + } + + _copyBuildinHashFileOp.UpdateOperation(); + if (_copyBuildinHashFileOp.IsDone == false) + return; + + if (_copyBuildinHashFileOp.Status == EOperationStatus.Succeed) + { + _steps = ESteps.CopyBuildinPackageManifest; + } + else + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = _copyBuildinHashFileOp.Error; + } + } + + if (_steps == ESteps.CopyBuildinPackageManifest) + { + if (_copyBuildinManifestFileOp == null) + { + string packageVersion = _requestBuildinPackageVersionOp.PackageVersion; + string destFilePath = GetCopyPackageManifestDestPath(packageVersion); + string sourceFilePath = _fileSystem.GetBuildinPackageManifestFilePath(packageVersion); + _copyBuildinManifestFileOp = new CopyBuildinFileOperation(sourceFilePath, destFilePath); + _copyBuildinManifestFileOp.StartOperation(); + AddChildOperation(_copyBuildinManifestFileOp); + } + + _copyBuildinManifestFileOp.UpdateOperation(); + if (_copyBuildinManifestFileOp.IsDone == false) + return; + + if (_copyBuildinManifestFileOp.Status == EOperationStatus.Succeed) { _steps = ESteps.InitUnpackFileSystem; } @@ -63,7 +123,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _copyBuildinPackageManifestOp.Error; + Error = _copyBuildinManifestFileOp.Error; } } @@ -116,6 +176,30 @@ namespace YooAsset if (_loadBuildinCatalogFileOp.Status == EOperationStatus.Succeed) { + var catalog = _loadBuildinCatalogFileOp.Catalog; + if (catalog == null) + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = "Fatal error : catalog is null !"; + return; + } + + if (catalog.PackageName != _fileSystem.PackageName) + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"Catalog file package name {catalog.PackageName} cannot match the file system package name {_fileSystem.PackageName}"; + return; + } + + foreach (var wrapper in catalog.Wrappers) + { + var fileWrapper = new DefaultBuildinFileSystem.FileWrapper(wrapper.FileName); + _fileSystem.RecordCatalogFile(wrapper.BundleGUID, fileWrapper); + } + + YooLogger.Log($"Package '{_fileSystem.PackageName}' buildin catalog files count : {catalog.Wrappers.Count}"); _steps = ESteps.Done; Status = EOperationStatus.Succeed; } @@ -127,5 +211,28 @@ namespace YooAsset } } } + + private string GetCopyManifestFileRoot() + { + string destRoot = _fileSystem.CopyBuildinPackageManifestDestRoot; + if (string.IsNullOrEmpty(destRoot)) + { + string defaultCacheRoot = YooAssetSettingsData.GetYooDefaultCacheRoot(); + destRoot = PathUtility.Combine(defaultCacheRoot, _fileSystem.PackageName, DefaultCacheFileSystemDefine.ManifestFilesFolderName); + } + return destRoot; + } + private string GetCopyPackageHashDestPath(string packageVersion) + { + string fileRoot = GetCopyManifestFileRoot(); + string fileName = YooAssetSettingsData.GetPackageHashFileName(_fileSystem.PackageName, packageVersion); + return PathUtility.Combine(fileRoot, fileName); + } + private string GetCopyPackageManifestDestPath(string packageVersion) + { + string fileRoot = GetCopyManifestFileRoot(); + string fileName = YooAssetSettingsData.GetManifestBinaryFileName(_fileSystem.PackageName, packageVersion); + return PathUtility.Combine(fileRoot, fileName); + } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/CopyBuildinFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/CopyBuildinFileOperation.cs new file mode 100644 index 00000000..462aec69 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/CopyBuildinFileOperation.cs @@ -0,0 +1,102 @@ +using System; +using System.IO; + +namespace YooAsset +{ + internal class CopyBuildinFileOperation : AsyncOperationBase + { + private enum ESteps + { + None, + CheckFileExist, + TryCopyFile, + UnpackFile, + Done, + } + + private UnityWebFileRequestOperation _webFileRequestOp; + private readonly string _sourceFilePath; + private readonly string _destFilePath; + private ESteps _steps = ESteps.None; + + public CopyBuildinFileOperation(string sourceFilePath, string destFilePath) + { + _sourceFilePath = sourceFilePath; + _destFilePath = destFilePath; + } + internal override void InternalStart() + { + _steps = ESteps.CheckFileExist; + } + internal override void InternalUpdate() + { + if (_steps == ESteps.None || _steps == ESteps.Done) + return; + + if (_steps == ESteps.CheckFileExist) + { + if (File.Exists(_destFilePath)) + { + _steps = ESteps.Done; + Status = EOperationStatus.Succeed; + } + else + { + _steps = ESteps.TryCopyFile; + } + } + + if (_steps == ESteps.TryCopyFile) + { + if (File.Exists(_sourceFilePath)) + { + try + { + var directory = Path.GetDirectoryName(_destFilePath); + if (Directory.Exists(directory) == false) + Directory.CreateDirectory(directory); + File.Copy(_sourceFilePath, _destFilePath, true); + _steps = ESteps.Done; + Status = EOperationStatus.Succeed; + } + catch (Exception ex) + { + YooLogger.Warning($"Failed copy buildin file : {ex.Message}"); + _steps = ESteps.UnpackFile; + } + } + else + { + _steps = ESteps.UnpackFile; + } + } + + if (_steps == ESteps.UnpackFile) + { + if (_webFileRequestOp == null) + { + string url = DownloadSystemHelper.ConvertToWWWPath(_sourceFilePath); + _webFileRequestOp = new UnityWebFileRequestOperation(url, _destFilePath, 60); + _webFileRequestOp.StartOperation(); + AddChildOperation(_webFileRequestOp); + } + + _webFileRequestOp.UpdateOperation(); + if (_webFileRequestOp.IsDone == false) + return; + + if (_webFileRequestOp.Status == EOperationStatus.Succeed) + { + _steps = ESteps.Done; + Status = EOperationStatus.Succeed; + } + else + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = _webFileRequestOp.Error; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/CopyBuildinPackageManifestOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/CopyBuildinFileOperation.cs.meta similarity index 83% rename from Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/CopyBuildinPackageManifestOperation.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/CopyBuildinFileOperation.cs.meta index 6950bcb0..2630899a 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/CopyBuildinPackageManifestOperation.cs.meta +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/CopyBuildinFileOperation.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 69f62f6b4185d06498f96aa272e9b926 +guid: bf44368bc5c2bf1479c36d82e931c295 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/CopyBuildinPackageManifestOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/CopyBuildinPackageManifestOperation.cs deleted file mode 100644 index 1740db55..00000000 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/CopyBuildinPackageManifestOperation.cs +++ /dev/null @@ -1,173 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.IO; - -namespace YooAsset -{ - internal class CopyBuildinPackageManifestOperation : AsyncOperationBase - { - private enum ESteps - { - None, - RequestPackageVersion, - CheckHashFile, - UnpackHashFile, - CheckManifestFile, - UnpackManifestFile, - Done, - } - - private readonly DefaultBuildinFileSystem _fileSystem; - private RequestBuildinPackageVersionOperation _requestBuildinPackageVersionOp; - private UnityWebFileRequestOperation _hashWebFileRequestOp; - private UnityWebFileRequestOperation _manifestWebFileRequestOp; - private string _buildinPackageVersion; - private ESteps _steps = ESteps.None; - - public CopyBuildinPackageManifestOperation(DefaultBuildinFileSystem fileSystem) - { - _fileSystem = fileSystem; - } - internal override void InternalStart() - { - _steps = ESteps.RequestPackageVersion; - } - internal override void InternalUpdate() - { - if (_steps == ESteps.None || _steps == ESteps.Done) - return; - - if (_steps == ESteps.RequestPackageVersion) - { - if (_requestBuildinPackageVersionOp == null) - { - _requestBuildinPackageVersionOp = new RequestBuildinPackageVersionOperation(_fileSystem); - _requestBuildinPackageVersionOp.StartOperation(); - AddChildOperation(_requestBuildinPackageVersionOp); - } - - _requestBuildinPackageVersionOp.UpdateOperation(); - if (_requestBuildinPackageVersionOp.IsDone == false) - return; - - if (_requestBuildinPackageVersionOp.Status == EOperationStatus.Succeed) - { - _steps = ESteps.CheckHashFile; - _buildinPackageVersion = _requestBuildinPackageVersionOp.PackageVersion; - } - else - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = _requestBuildinPackageVersionOp.Error; - } - } - - if (_steps == ESteps.CheckHashFile) - { - string hashFilePath = GetCopyPackageHashDestPath(_buildinPackageVersion); - if (File.Exists(hashFilePath)) - { - _steps = ESteps.CheckManifestFile; - return; - } - - _steps = ESteps.UnpackHashFile; - } - - if (_steps == ESteps.UnpackHashFile) - { - if (_hashWebFileRequestOp == null) - { - string sourcePath = _fileSystem.GetBuildinPackageHashFilePath(_buildinPackageVersion); - string destPath = GetCopyPackageHashDestPath(_buildinPackageVersion); - string url = DownloadSystemHelper.ConvertToWWWPath(sourcePath); - _hashWebFileRequestOp = new UnityWebFileRequestOperation(url, destPath, 60); - _hashWebFileRequestOp.StartOperation(); - AddChildOperation(_hashWebFileRequestOp); - } - - _hashWebFileRequestOp.UpdateOperation(); - if (_hashWebFileRequestOp.IsDone == false) - return; - - if (_hashWebFileRequestOp.Status == EOperationStatus.Succeed) - { - _steps = ESteps.CheckManifestFile; - } - else - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = _hashWebFileRequestOp.Error; - } - } - - if (_steps == ESteps.CheckManifestFile) - { - string manifestFilePath = GetCopyPackageManifestDestPath(_buildinPackageVersion); - if (File.Exists(manifestFilePath)) - { - _steps = ESteps.Done; - Status = EOperationStatus.Succeed; - return; - } - - _steps = ESteps.UnpackManifestFile; - } - - if (_steps == ESteps.UnpackManifestFile) - { - if (_manifestWebFileRequestOp == null) - { - string sourcePath = _fileSystem.GetBuildinPackageManifestFilePath(_buildinPackageVersion); - string destPath = GetCopyPackageManifestDestPath(_buildinPackageVersion); - string url = DownloadSystemHelper.ConvertToWWWPath(sourcePath); - _manifestWebFileRequestOp = new UnityWebFileRequestOperation(url, destPath, 60); - _manifestWebFileRequestOp.StartOperation(); - AddChildOperation(_manifestWebFileRequestOp); - } - - _manifestWebFileRequestOp.UpdateOperation(); - if (_manifestWebFileRequestOp.IsDone == false) - return; - - if (_manifestWebFileRequestOp.Status == EOperationStatus.Succeed) - { - _steps = ESteps.Done; - Status = EOperationStatus.Succeed; - } - else - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = _manifestWebFileRequestOp.Error; - } - } - } - - private string GetCopyManifestFileRoot() - { - string destRoot = _fileSystem.CopyBuildinPackageManifestDestRoot; - if (string.IsNullOrEmpty(destRoot)) - { - string defaultCacheRoot = YooAssetSettingsData.GetYooDefaultCacheRoot(); - destRoot = PathUtility.Combine(defaultCacheRoot, _fileSystem.PackageName, DefaultCacheFileSystemDefine.ManifestFilesFolderName); - } - return destRoot; - } - private string GetCopyPackageHashDestPath(string packageVersion) - { - string fileRoot = GetCopyManifestFileRoot(); - string fileName = YooAssetSettingsData.GetPackageHashFileName(_fileSystem.PackageName, packageVersion); - return PathUtility.Combine(fileRoot, fileName); - } - private string GetCopyPackageManifestDestPath(string packageVersion) - { - string fileRoot = GetCopyManifestFileRoot(); - string fileName = YooAssetSettingsData.GetManifestBinaryFileName(_fileSystem.PackageName, packageVersion); - return PathUtility.Combine(fileRoot, fileName); - } - } -} \ 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 0eba7b1e..8b4e53f7 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinCatalogFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinCatalogFileOperation.cs @@ -1,4 +1,5 @@ using System; +using System.IO; namespace YooAsset { @@ -7,29 +8,50 @@ namespace YooAsset private enum ESteps { None, - RequestData, + TryLoadFileData, + RequestFileData, LoadCatalog, Done, } private readonly DefaultBuildinFileSystem _fileSystem; private UnityWebDataRequestOperation _webDataRequestOp; + private byte[] _fileData; private ESteps _steps = ESteps.None; + /// + /// 内置资源目录 + /// + public DefaultBuildinFileCatalog Catalog; + internal LoadBuildinCatalogFileOperation(DefaultBuildinFileSystem fileSystem) { _fileSystem = fileSystem; } internal override void InternalStart() { - _steps = ESteps.RequestData; + _steps = ESteps.TryLoadFileData; } internal override void InternalUpdate() { if (_steps == ESteps.None || _steps == ESteps.Done) return; - if (_steps == ESteps.RequestData) + if (_steps == ESteps.TryLoadFileData) + { + string filePath = _fileSystem.GetCatalogBinaryFileLoadPath(); + if (File.Exists(filePath)) + { + _fileData = File.ReadAllBytes(filePath); + _steps = ESteps.LoadCatalog; + } + else + { + _steps = ESteps.RequestFileData; + } + } + + if (_steps == ESteps.RequestFileData) { if (_webDataRequestOp == null) { @@ -46,6 +68,7 @@ namespace YooAsset if (_webDataRequestOp.Status == EOperationStatus.Succeed) { + _fileData = _webDataRequestOp.Result; _steps = ESteps.LoadCatalog; } else @@ -60,22 +83,7 @@ namespace YooAsset { try { - var catalog = CatalogTools.DeserializeFromBinary(_webDataRequestOp.Result); - if (catalog.PackageName != _fileSystem.PackageName) - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = $"Catalog file package name {catalog.PackageName} cannot match the file system package name {_fileSystem.PackageName}"; - return; - } - - foreach (var wrapper in catalog.Wrappers) - { - var fileWrapper = new DefaultBuildinFileSystem.FileWrapper(wrapper.FileName); - _fileSystem.RecordCatalogFile(wrapper.BundleGUID, fileWrapper); - } - - YooLogger.Log($"Package '{_fileSystem.PackageName}' buildin catalog files count : {catalog.Wrappers.Count}"); + Catalog = CatalogTools.DeserializeFromBinary(_fileData); _steps = ESteps.Done; Status = EOperationStatus.Succeed; } diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinPackageManifestOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinPackageManifestOperation.cs index 4a20bc91..76b912bb 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinPackageManifestOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinPackageManifestOperation.cs @@ -1,4 +1,5 @@ - +using System.IO; + namespace YooAsset { internal class LoadBuildinPackageManifestOperation : AsyncOperationBase @@ -6,6 +7,7 @@ namespace YooAsset private enum ESteps { None, + TryLoadFileData, RequestFileData, VerifyFileData, LoadManifest, @@ -17,6 +19,7 @@ namespace YooAsset private readonly string _packageHash; private UnityWebDataRequestOperation _webDataRequestOp; private DeserializeManifestOperation _deserializer; + private byte[] _fileData; private ESteps _steps = ESteps.None; /// @@ -33,13 +36,27 @@ namespace YooAsset } internal override void InternalStart() { - _steps = ESteps.RequestFileData; + _steps = ESteps.TryLoadFileData; } internal override void InternalUpdate() { if (_steps == ESteps.None || _steps == ESteps.Done) return; + if (_steps == ESteps.TryLoadFileData) + { + string filePath = _fileSystem.GetBuildinPackageManifestFilePath(_packageVersion); + if (File.Exists(filePath)) + { + _fileData = File.ReadAllBytes(filePath); + _steps = ESteps.VerifyFileData; + } + else + { + _steps = ESteps.RequestFileData; + } + } + if (_steps == ESteps.RequestFileData) { if (_webDataRequestOp == null) @@ -57,6 +74,7 @@ namespace YooAsset if (_webDataRequestOp.Status == EOperationStatus.Succeed) { + _fileData = _webDataRequestOp.Result; _steps = ESteps.VerifyFileData; } else @@ -69,7 +87,7 @@ namespace YooAsset if (_steps == ESteps.VerifyFileData) { - if (ManifestTools.VerifyManifestData(_webDataRequestOp.Result, _packageHash)) + if (ManifestTools.VerifyManifestData(_fileData, _packageHash)) { _steps = ESteps.LoadManifest; } @@ -85,7 +103,7 @@ namespace YooAsset { if (_deserializer == null) { - _deserializer = new DeserializeManifestOperation(_fileSystem.ManifestServices, _webDataRequestOp.Result); + _deserializer = new DeserializeManifestOperation(_fileSystem.ManifestServices, _fileData); _deserializer.StartOperation(); AddChildOperation(_deserializer); } diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/RequestBuildinPackageHashOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/RequestBuildinPackageHashOperation.cs index c707a611..df4a156a 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/RequestBuildinPackageHashOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/RequestBuildinPackageHashOperation.cs @@ -1,4 +1,5 @@ - +using System.IO; + namespace YooAsset { internal class RequestBuildinPackageHashOperation : AsyncOperationBase @@ -6,7 +7,9 @@ namespace YooAsset private enum ESteps { None, + TryLoadPackageHash, RequestPackageHash, + CheckResult, Done, } @@ -28,13 +31,27 @@ namespace YooAsset } internal override void InternalStart() { - _steps = ESteps.RequestPackageHash; + _steps = ESteps.TryLoadPackageHash; } internal override void InternalUpdate() { if (_steps == ESteps.None || _steps == ESteps.Done) return; + if (_steps == ESteps.TryLoadPackageHash) + { + string filePath = _fileSystem.GetBuildinPackageHashFilePath(_packageVersion); + if (File.Exists(filePath)) + { + PackageHash = File.ReadAllText(filePath); + _steps = ESteps.CheckResult; + } + else + { + _steps = ESteps.RequestPackageHash; + } + } + if (_steps == ESteps.RequestPackageHash) { if (_webTextRequestOp == null) @@ -53,17 +70,7 @@ namespace YooAsset if (_webTextRequestOp.Status == EOperationStatus.Succeed) { PackageHash = _webTextRequestOp.Result; - if (string.IsNullOrEmpty(PackageHash)) - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = $"Buildin package hash file content is empty !"; - } - else - { - _steps = ESteps.Done; - Status = EOperationStatus.Succeed; - } + _steps = ESteps.CheckResult; } else { @@ -72,6 +79,21 @@ namespace YooAsset Error = _webTextRequestOp.Error; } } + + if (_steps == ESteps.CheckResult) + { + if (string.IsNullOrEmpty(PackageHash)) + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"Buildin package hash file content is empty !"; + } + else + { + _steps = ESteps.Done; + Status = EOperationStatus.Succeed; + } + } } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/RequestBuildinPackageVersionOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/RequestBuildinPackageVersionOperation.cs index 5ebab685..d93e2ea2 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/RequestBuildinPackageVersionOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/RequestBuildinPackageVersionOperation.cs @@ -1,4 +1,5 @@ - +using System.IO; + namespace YooAsset { internal class RequestBuildinPackageVersionOperation : AsyncOperationBase @@ -6,7 +7,9 @@ namespace YooAsset private enum ESteps { None, + TryLoadPackageVersion, RequestPackageVersion, + CheckResult, Done, } @@ -26,13 +29,27 @@ namespace YooAsset } internal override void InternalStart() { - _steps = ESteps.RequestPackageVersion; + _steps = ESteps.TryLoadPackageVersion; } internal override void InternalUpdate() { if (_steps == ESteps.None || _steps == ESteps.Done) return; + if (_steps == ESteps.TryLoadPackageVersion) + { + string filePath = _fileSystem.GetBuildinPackageVersionFilePath(); + if (File.Exists(filePath)) + { + PackageVersion = File.ReadAllText(filePath); + _steps = ESteps.CheckResult; + } + else + { + _steps = ESteps.RequestPackageVersion; + } + } + if (_steps == ESteps.RequestPackageVersion) { if (_webTextRequestOp == null) @@ -51,17 +68,7 @@ namespace YooAsset if (_webTextRequestOp.Status == EOperationStatus.Succeed) { PackageVersion = _webTextRequestOp.Result; - if (string.IsNullOrEmpty(PackageVersion)) - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = $"Buildin package version file content is empty !"; - } - else - { - _steps = ESteps.Done; - Status = EOperationStatus.Succeed; - } + _steps = ESteps.CheckResult; } else { @@ -70,6 +77,21 @@ namespace YooAsset Error = _webTextRequestOp.Error; } } + + if (_steps == ESteps.CheckResult) + { + if (string.IsNullOrEmpty(PackageVersion)) + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"Buildin package version file content is empty !"; + } + else + { + _steps = ESteps.Done; + Status = EOperationStatus.Succeed; + } + } } } } \ No newline at end of file