From ebde5a52d39426335f95986fbf8d2d842e3a6953 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E5=86=A0=E5=B3=B0?= Date: Wed, 25 Jun 2025 19:27:52 +0800 Subject: [PATCH] fix #585 --- .../DefaultBuildinFileSystem.cs | 10 +++++ .../DefaultCacheFileSystem.cs | 9 ++++ .../internal/DownloadNormalFileOperation.cs | 41 ++++++++++++++++++- .../internal/DownloadResumeFileOperation.cs | 41 ++++++++++++++++++- .../FileSystem/FileSystemParametersDefine.cs | 1 + .../Interface/CopyBuildinFileServices.cs | 11 +++++ .../Interface/CopyBuildinFileServices.cs.meta | 11 +++++ .../Internal/DefaultDownloadFileOperation.cs | 1 + 8 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 Assets/YooAsset/Runtime/FileSystem/Interface/CopyBuildinFileServices.cs create mode 100644 Assets/YooAsset/Runtime/FileSystem/Interface/CopyBuildinFileServices.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs index d9600089..01a3002d 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs @@ -93,6 +93,11 @@ namespace YooAsset /// 自定义参数:资源清单服务类 /// public IManifestServices ManifestServices { private set; get; } + + /// + /// 自定义参数:拷贝内置文件服务类 + /// + public ICopyBuildinBundleServices CopyBuildinBundleServices { private set; get; } #endregion @@ -183,6 +188,10 @@ namespace YooAsset { ManifestServices = (IManifestServices)value; } + else if (name == FileSystemParametersDefine.COPY_BUILDIN_BUNDLE_SERVICES) + { + CopyBuildinBundleServices = (ICopyBuildinBundleServices)value; + } else { YooLogger.Warning($"Invalid parameter : {name}"); @@ -205,6 +214,7 @@ namespace YooAsset _unpackFileSystem.SetParameter(FileSystemParametersDefine.INSTALL_CLEAR_MODE, InstallClearMode); _unpackFileSystem.SetParameter(FileSystemParametersDefine.APPEND_FILE_EXTENSION, AppendFileExtension); _unpackFileSystem.SetParameter(FileSystemParametersDefine.DECRYPTION_SERVICES, DecryptionServices); + _unpackFileSystem.SetParameter(FileSystemParametersDefine.COPY_BUILDIN_BUNDLE_SERVICES, CopyBuildinBundleServices); _unpackFileSystem.OnCreate(packageName, null); } public virtual void OnDestroy() diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs index 8a3ac1da..a4022cc9 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs @@ -104,6 +104,11 @@ namespace YooAsset /// 自定义参数:资源清单服务类 /// public IManifestServices ManifestServices { private set; get; } + + /// + /// 自定义参数:拷贝内置文件服务类 + /// + public ICopyBuildinBundleServices CopyBuildinBundleServices { private set; get; } #endregion @@ -230,6 +235,10 @@ namespace YooAsset { ManifestServices = (IManifestServices)value; } + else if (name == FileSystemParametersDefine.COPY_BUILDIN_BUNDLE_SERVICES) + { + CopyBuildinBundleServices = (ICopyBuildinBundleServices)value; + } else { YooLogger.Warning($"Invalid parameter : {name}"); diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/DownloadNormalFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/DownloadNormalFileOperation.cs index 12190fbe..4f20f585 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/DownloadNormalFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/DownloadNormalFileOperation.cs @@ -37,7 +37,10 @@ namespace YooAsset } else { - _steps = ESteps.CreateRequest; + if (_isReuqestLocalFile && _fileSystem.CopyBuildinBundleServices != null) + _steps = ESteps.CopyBuildinBundle; + else + _steps = ESteps.CreateRequest; } } @@ -84,6 +87,42 @@ namespace YooAsset DisposeWebRequest(); } + // 拷贝内置文件 + if (_steps == ESteps.CopyBuildinBundle) + { + FileUtility.CreateFileDirectory(_tempFilePath); + + // 删除临时文件 + if (File.Exists(_tempFilePath)) + File.Delete(_tempFilePath); + + // 获取请求地址 + _requestURL = GetRequestURL(); + + try + { + //TODO 团结引擎,在某些机型(红米),拷贝包内文件会小概率失败!需要借助其它方式来拷贝包内文件。 + _fileSystem.CopyBuildinBundleServices.CopyBuildinFile(_requestURL, _tempFilePath); + if (File.Exists(_tempFilePath)) + { + DownloadProgress = 1f; + DownloadedBytes = Bundle.FileSize; + Progress = DownloadProgress; + _steps = ESteps.VerifyTempFile; + } + else + { + Error = $"Failed copy buildin bundle : {_requestURL}"; + _steps = ESteps.TryAgain; + } + } + catch (System.Exception ex) + { + Error = $"Failed copy buildin bundle : {ex.Message}"; + _steps = ESteps.TryAgain; + } + } + // 验证下载文件 if (_steps == ESteps.VerifyTempFile) { diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/DownloadResumeFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/DownloadResumeFileOperation.cs index 9bff229c..09c00f45 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/DownloadResumeFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/DownloadResumeFileOperation.cs @@ -40,7 +40,10 @@ namespace YooAsset } else { - _steps = ESteps.CreateRequest; + if (_isReuqestLocalFile && _fileSystem.CopyBuildinBundleServices != null) + _steps = ESteps.CopyBuildinBundle; + else + _steps = ESteps.CreateRequest; } } @@ -104,6 +107,42 @@ namespace YooAsset DisposeWebRequest(); } + // 拷贝内置文件 + if (_steps == ESteps.CopyBuildinBundle) + { + FileUtility.CreateFileDirectory(_tempFilePath); + + // 删除临时文件(不支持断点续传) + if (File.Exists(_tempFilePath)) + File.Delete(_tempFilePath); + + // 获取请求地址 + _requestURL = GetRequestURL(); + + try + { + //TODO 团结引擎,在某些机型(红米),拷贝包内文件会小概率失败!需要借助其它方式来拷贝包内文件。 + _fileSystem.CopyBuildinBundleServices.CopyBuildinFile(_requestURL, _tempFilePath); + if (File.Exists(_tempFilePath)) + { + DownloadProgress = 1f; + DownloadedBytes = Bundle.FileSize; + Progress = DownloadProgress; + _steps = ESteps.VerifyTempFile; + } + else + { + Error = $"Failed copy buildin bundle : {_requestURL}"; + _steps = ESteps.TryAgain; + } + } + catch (System.Exception ex) + { + Error = $"Failed copy buildin bundle : {ex.Message}"; + _steps = ESteps.TryAgain; + } + } + // 验证下载文件 if (_steps == ESteps.VerifyTempFile) { diff --git a/Assets/YooAsset/Runtime/FileSystem/FileSystemParametersDefine.cs b/Assets/YooAsset/Runtime/FileSystem/FileSystemParametersDefine.cs index 9985afc2..84d42cf7 100644 --- a/Assets/YooAsset/Runtime/FileSystem/FileSystemParametersDefine.cs +++ b/Assets/YooAsset/Runtime/FileSystem/FileSystemParametersDefine.cs @@ -19,5 +19,6 @@ namespace YooAsset public const string ASYNC_SIMULATE_MAX_FRAME = "ASYNC_SIMULATE_MAX_FRAME"; public const string COPY_BUILDIN_PACKAGE_MANIFEST = "COPY_BUILDIN_PACKAGE_MANIFEST"; public const string COPY_BUILDIN_PACKAGE_MANIFEST_DEST_ROOT = "COPY_BUILDIN_PACKAGE_MANIFEST_DEST_ROOT"; + public const string COPY_BUILDIN_BUNDLE_SERVICES = "COPY_BUILDIN_BUNDLE_SERVICES"; } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Interface/CopyBuildinFileServices.cs b/Assets/YooAsset/Runtime/FileSystem/Interface/CopyBuildinFileServices.cs new file mode 100644 index 00000000..2501f549 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Interface/CopyBuildinFileServices.cs @@ -0,0 +1,11 @@ + +namespace YooAsset +{ + /// + /// 拷贝内置文件服务类 + /// + public interface ICopyBuildinBundleServices + { + void CopyBuildinFile(string buildinFileURL, string destFilePath); + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Interface/CopyBuildinFileServices.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Interface/CopyBuildinFileServices.cs.meta new file mode 100644 index 00000000..83d8e001 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Interface/CopyBuildinFileServices.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e2eb3bd510fd41c48a01dcc26dd9b985 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DefaultDownloadFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DefaultDownloadFileOperation.cs index 60cc3b39..c1e19cf9 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DefaultDownloadFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DefaultDownloadFileOperation.cs @@ -11,6 +11,7 @@ namespace YooAsset CheckExists, CreateRequest, CheckRequest, + CopyBuildinBundle, VerifyTempFile, CheckVerifyTempFile, TryAgain,