From ee67a55c0f867ed2d65805e872d14a66fbb78b2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E5=86=A0=E5=B3=B0?= Date: Wed, 7 Jan 2026 10:23:11 +0800 Subject: [PATCH] =?UTF-8?q?refactor=20:=20=E9=87=8D=E6=9E=84=E7=BD=91?= =?UTF-8?q?=E7=BB=9C=E4=B8=8B=E8=BD=BD=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UnityWebRequestBackend.cs | 4 +- .../UnityWebRequestCreator.cs | 10 +++ .../UnityWebRequestCreator.cs.meta | 11 +++ .../UnityWebRequestAssetBundleDownloader.cs | 11 +-- .../UnityWebRequestBytesDownloader.cs | 2 +- .../UnityWebRequestDownloaderBase.cs | 4 +- .../UnityWebRequestFileDownloader.cs | 2 +- .../UnityWebRequestHeadDownloader.cs | 2 +- .../UnityWebRequestTextDownloader.cs | 2 +- .../VirtualFileDownloader.cs | 3 +- .../DownloadSystem/DownloadSystemHelper.cs | 24 ------ .../YooAsset/Runtime/DownloadSystem/README.md | 86 +++++++++++-------- .../DefaultBuildinFileSystem.cs | 32 ++++++- .../DefaultCacheFileSystem.cs | 25 +++++- .../DefaultEditorFileSystem.cs | 24 +++++- .../DefaultWebRemoteFileSystem.cs | 24 +++++- .../DefaultWebServerFileSystem.cs | 24 +++++- .../FileSystem/FileSystemParametersDefine.cs | 4 +- Assets/YooAsset/Runtime/FileSystem/README.md | 11 +++ Assets/YooAsset/Runtime/YooAssets.cs | 5 +- 20 files changed, 215 insertions(+), 95 deletions(-) create mode 100644 Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadBackend/UnityWebRequestCreator.cs create mode 100644 Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadBackend/UnityWebRequestCreator.cs.meta diff --git a/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadBackend/UnityWebRequestBackend.cs b/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadBackend/UnityWebRequestBackend.cs index 6e874240..394aaed9 100644 --- a/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadBackend/UnityWebRequestBackend.cs +++ b/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadBackend/UnityWebRequestBackend.cs @@ -12,7 +12,7 @@ namespace YooAsset /// internal sealed class UnityWebRequestBackend : IDownloadBackend { - private readonly UnityWebRequestDelegate _webRequestCreator; + private readonly UnityWebRequestCreator _webRequestCreator; /// /// 后端名称 @@ -36,7 +36,7 @@ namespace YooAsset /// 自定义 UnityWebRequest 创建委托(可选)。 /// 如果为 null,则使用默认的 UnityWebRequest 构造方式。 /// - public UnityWebRequestBackend(UnityWebRequestDelegate webRequestCreator) + public UnityWebRequestBackend(UnityWebRequestCreator webRequestCreator) { _webRequestCreator = webRequestCreator; } diff --git a/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadBackend/UnityWebRequestCreator.cs b/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadBackend/UnityWebRequestCreator.cs new file mode 100644 index 00000000..c982a434 --- /dev/null +++ b/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadBackend/UnityWebRequestCreator.cs @@ -0,0 +1,10 @@ +using UnityEngine.Networking; +using UnityEngine; + +namespace YooAsset +{ + /// + /// 自定义下载器的请求委托 + /// + public delegate UnityWebRequest UnityWebRequestCreator(string url); +} diff --git a/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadBackend/UnityWebRequestCreator.cs.meta b/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadBackend/UnityWebRequestCreator.cs.meta new file mode 100644 index 00000000..aeeb570e --- /dev/null +++ b/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadBackend/UnityWebRequestCreator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0fa3e6346decc4d4db3b03e6ae93e57a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestAssetBundleDownloader.cs b/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestAssetBundleDownloader.cs index 15935313..8be0c9c2 100644 --- a/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestAssetBundleDownloader.cs +++ b/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestAssetBundleDownloader.cs @@ -26,7 +26,7 @@ namespace YooAsset /// /// AssetBundle 下载参数 /// UnityWebRequest 创建器(可选) - public UnityWebRequestAssetBundleDownloader(DownloadAssetBundleRequestArgs args, UnityWebRequestDelegate webRequestCreator) + public UnityWebRequestAssetBundleDownloader(DownloadAssetBundleRequestArgs args, UnityWebRequestCreator webRequestCreator) : base(args.URL, webRequestCreator) { _args = args; @@ -75,17 +75,12 @@ namespace YooAsset } else { - // 使用 Unity 缓存(需要 FileHash) - // The file hash defining the version of the asset bundle. + // 使用 Unity 缓存 + // 说明:The file hash defining the version of the asset bundle. Hash128 fileHash = Hash128.Parse(_args.FileHash); handler = new DownloadHandlerAssetBundle(URL, fileHash, _args.UnityCRC); } -#if UNITY_2020_3_OR_NEWER - // 禁用自动加载,允许手动控制加载时机 - handler.autoLoadAssetBundle = false; -#endif - return handler; } } diff --git a/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestBytesDownloader.cs b/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestBytesDownloader.cs index 001932ae..f12b2857 100644 --- a/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestBytesDownloader.cs +++ b/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestBytesDownloader.cs @@ -23,7 +23,7 @@ namespace YooAsset /// /// 数据下载参数 /// UnityWebRequest 创建器(可选) - public UnityWebRequestBytesDownloader(DownloadDataRequestArgs args, UnityWebRequestDelegate webRequestCreator) + public UnityWebRequestBytesDownloader(DownloadDataRequestArgs args, UnityWebRequestCreator webRequestCreator) : base(args.URL, webRequestCreator) { _args = args; diff --git a/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestDownloaderBase.cs b/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestDownloaderBase.cs index 9824a5a6..60d1c078 100644 --- a/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestDownloaderBase.cs +++ b/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestDownloaderBase.cs @@ -13,7 +13,7 @@ namespace YooAsset /// internal abstract class UnityWebRequestDownloaderBase : IDownloadRequest { - private readonly UnityWebRequestDelegate _webRequestCreator; + private readonly UnityWebRequestCreator _webRequestCreator; protected UnityWebRequest _webRequest; // 看门狗相关 @@ -76,7 +76,7 @@ namespace YooAsset /// /// 请求地址 /// UnityWebRequest 创建器(可选) - protected UnityWebRequestDownloaderBase(string url, UnityWebRequestDelegate webRequestCreator) + protected UnityWebRequestDownloaderBase(string url, UnityWebRequestCreator webRequestCreator) { URL = url; _webRequestCreator = webRequestCreator; diff --git a/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestFileDownloader.cs b/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestFileDownloader.cs index 11273e45..342a96ae 100644 --- a/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestFileDownloader.cs +++ b/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestFileDownloader.cs @@ -26,7 +26,7 @@ namespace YooAsset /// /// 文件下载参数 /// UnityWebRequest 创建器(可选) - public UnityWebRequestFileDownloader(DownloadFileRequestArgs args, UnityWebRequestDelegate webRequestCreator) + public UnityWebRequestFileDownloader(DownloadFileRequestArgs args, UnityWebRequestCreator webRequestCreator) : base(args.URL, webRequestCreator) { _args = args; diff --git a/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestHeadDownloader.cs b/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestHeadDownloader.cs index ef3e4ff3..62e13004 100644 --- a/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestHeadDownloader.cs +++ b/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestHeadDownloader.cs @@ -69,7 +69,7 @@ namespace YooAsset /// /// 数据下载参数 /// UnityWebRequest 创建器(可选) - public UnityWebRequestHeadDownloader(DownloadDataRequestArgs args, UnityWebRequestDelegate webRequestCreator) + public UnityWebRequestHeadDownloader(DownloadDataRequestArgs args, UnityWebRequestCreator webRequestCreator) : base(args.URL, webRequestCreator) { _args = args; diff --git a/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestTextDownloader.cs b/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestTextDownloader.cs index 7c429afa..fee9fb06 100644 --- a/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestTextDownloader.cs +++ b/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/UnityWebRequestTextDownloader.cs @@ -23,7 +23,7 @@ namespace YooAsset /// /// 数据下载参数 /// UnityWebRequest 创建器(可选) - public UnityWebRequestTextDownloader(DownloadDataRequestArgs args, UnityWebRequestDelegate webRequestCreator) + public UnityWebRequestTextDownloader(DownloadDataRequestArgs args, UnityWebRequestCreator webRequestCreator) : base(args.URL, webRequestCreator) { _args = args; diff --git a/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/VirtualFileDownloader.cs b/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/VirtualFileDownloader.cs index 6cf5ab9b..96010902 100644 --- a/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/VirtualFileDownloader.cs +++ b/Assets/YooAsset/Runtime/DownloadSystem/DefaultDownloadRequest/VirtualFileDownloader.cs @@ -75,6 +75,7 @@ namespace YooAsset public VirtualFileDownloader(DownloadSimulateRequestArgs args) { _args = args; + URL = args.URL; Status = EDownloadRequestStatus.None; } @@ -142,7 +143,7 @@ namespace YooAsset #if UNITY_2020_3_OR_NEWER return UnityEngine.Time.realtimeSinceStartupAsDouble; #else - return = UnityEngine.Time.realtimeSinceStartup; + return UnityEngine.Time.realtimeSinceStartup; #endif } } diff --git a/Assets/YooAsset/Runtime/DownloadSystem/DownloadSystemHelper.cs b/Assets/YooAsset/Runtime/DownloadSystem/DownloadSystemHelper.cs index c0f8fb54..f863affc 100644 --- a/Assets/YooAsset/Runtime/DownloadSystem/DownloadSystemHelper.cs +++ b/Assets/YooAsset/Runtime/DownloadSystem/DownloadSystemHelper.cs @@ -3,32 +3,8 @@ using UnityEngine; namespace YooAsset { - /// - /// 自定义下载器的请求委托 - /// - public delegate UnityWebRequest UnityWebRequestDelegate(string url); - internal class DownloadSystemHelper { -#if UNITY_EDITOR - [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] - private static void OnRuntimeInitialize() - { - UnityWebRequestCreater = null; - } -#endif - - public static UnityWebRequestDelegate UnityWebRequestCreater = null; - public static UnityWebRequest NewUnityWebRequestGet(string requestURL) - { - UnityWebRequest webRequest; - if (UnityWebRequestCreater != null) - webRequest = UnityWebRequestCreater.Invoke(requestURL); - else - webRequest = new UnityWebRequest(requestURL, UnityWebRequest.kHttpVerbGET); - return webRequest; - } - /// /// 获取WWW加载本地资源的路径 /// diff --git a/Assets/YooAsset/Runtime/DownloadSystem/README.md b/Assets/YooAsset/Runtime/DownloadSystem/README.md index 28551ceb..065f1b22 100644 --- a/Assets/YooAsset/Runtime/DownloadSystem/README.md +++ b/Assets/YooAsset/Runtime/DownloadSystem/README.md @@ -2,7 +2,7 @@ ## 模块概述 -DownloadSystem 是 YooAsset 资源管理系统的**底层网络下载层**,负责处理所有 HTTP 网络请求。该模块提供了统一的下载接口抽象,支持文件下载、断点续传、并发控制、看门狗监控等功能。 +DownloadSystem 是 YooAsset 资源管理系统的**底层网络下载层**,负责处理所有 HTTP 网络请求。该模块提供了统一的下载接口抽象,支持文件下载、断点续传、并发请求(由上层调度)、看门狗监控等功能。 ### 核心职责 @@ -14,13 +14,23 @@ DownloadSystem 是 YooAsset 资源管理系统的**底层网络下载层**,负 --- +## 边界与上层协作 + +DownloadSystem 的职责是提供“可替换后端 + 统一请求接口 + 轮询式生命周期”的基础能力: + +- **本模块不负责并发队列/限流调度**:并发通常由上层同时创建多个 request 并自行控制并发数。 +- **本模块不负责重试/回退策略**:失败后的重试、切换 CDN、降级等策略通常由上层系统实现。 +- **本模块不负责持久化下载任务**:断点续传依赖本地已有文件与 `Range` 请求头,并由上层管理断点信息。 + +--- + ## 设计目标 | 目标 | 说明 | |------|------| | **可扩展性** | 支持可插拔的网络库后端(UnityWebRequest/BestHTTP/自研) | | **鲁棒性** | 看门狗超时保护、自动清理失败文件、完整错误信息 | -| **高性能** | 轮询模式无阻塞、支持多并发请求 | +| **高性能** | 轮询模式无阻塞、支持并发请求(并发数由上层调度) | | **易用性** | 流畅的参数构建 API、清晰的状态转换 | --- @@ -70,7 +80,8 @@ DownloadSystem/ │ └── IDownloadRequest.cs # 请求接口层次结构 │ ├── DefaultDownloadBackend/ # 默认后端实现 -│ └── UnityWebRequestBackend.cs # UnityWebRequest 后端 +│ ├── UnityWebRequestBackend.cs # UnityWebRequest 后端 +│ └── UnityWebRequestCreator.cs # UnityWebRequest 创建委托 │ ├── DefaultDownloadRequest/ # 默认请求实现 │ ├── UnityWebRequestDownloaderBase.cs # 基础下载器(抽象类) @@ -256,13 +267,15 @@ public struct DownloadSimulateRequestArgs - 无需手动调用 Update(),UnityWebRequest 自动驱动 ```csharp -// 自定义 UnityWebRequest 创建 -DownloadSystemHelper.UnityWebRequestCreater = (url) => +// 自定义 UnityWebRequest 创建(建议通过 backend 构造函数传入) +UnityWebRequestCreator creator = (url) => { var request = new UnityWebRequest(url, UnityWebRequest.kHttpVerbGET); // 自定义配置... return request; }; + +IDownloadBackend backend = new UnityWebRequestBackend(creator); ``` ### UnityWebRequestDownloaderBase @@ -303,12 +316,11 @@ None ──► SendRequest() ──► Running ──► PollingRequest() ── ```csharp // 1. 创建后端和请求 IDownloadBackend backend = new UnityWebRequestBackend(); -var args = new DownloadFileRequestArgs -{ - URL = "https://example.com/file.zip", - SavePath = "/path/to/save/file.zip", - Timeout = 30 -}; +var args = new DownloadFileRequestArgs( + url: "https://example.com/file.zip", + savePath: "/path/to/save/file.zip", + timeout: 30, + watchdogTime: 0); IDownloadFileRequest request = backend.CreateFileRequest(args); // 2. 发起并轮询 @@ -340,14 +352,14 @@ request.Dispose(); // 获取已下载的文件大小 long existingFileSize = new FileInfo(savePath).Length; -var args = new DownloadFileRequestArgs -{ - URL = url, - SavePath = savePath, - ResumeFromBytes = existingFileSize, // 断点位置 - AppendToFile = true, // 追加写入 - RemoveFileOnAbort = false // 中止时保留文件 -}; +var args = new DownloadFileRequestArgs( + url: url, + savePath: savePath, + timeout: 30, + watchdogTime: 0, + appendToFile: true, // 追加写入 + removeFileOnAbort: false, // 中止时保留文件 + resumeFromBytes: existingFileSize); // 断点位置 IDownloadFileRequest request = backend.CreateFileRequest(args); request.SendRequest(); @@ -357,12 +369,11 @@ request.SendRequest(); ### 看门狗保护 ```csharp -var args = new DownloadFileRequestArgs -{ - URL = url, - SavePath = path, - WatchdogTime = 30 // 30秒无数据自动中止 -}; +var args = new DownloadFileRequestArgs( + url: url, + savePath: path, + timeout: 30, + watchdogTime: 30); // 30秒无数据自动中止 IDownloadFileRequest request = backend.CreateFileRequest(args); request.SendRequest(); @@ -382,10 +393,10 @@ if (request.Status == EDownloadRequestStatus.Aborted) ### HEAD 请求获取文件信息 ```csharp -var args = new DownloadDataRequestArgs -{ - URL = "https://example.com/file.zip" -}; +var args = new DownloadDataRequestArgs( + url: "https://example.com/file.zip", + timeout: 30, + watchdogTime: 0); IDownloadHeadRequest request = backend.CreateHeadRequest(args); request.SendRequest(); @@ -408,10 +419,10 @@ if (request.Status == EDownloadRequestStatus.Succeed) ### 下载字节数据 ```csharp -var args = new DownloadDataRequestArgs -{ - URL = "https://example.com/data.json" -}; +var args = new DownloadDataRequestArgs( + url: "https://example.com/data.json", + timeout: 30, + watchdogTime: 0); IDownloadBytesRequest request = backend.CreateBytesRequest(args); request.SendRequest(); @@ -519,9 +530,9 @@ VirtualFileDownloader (独立实现) ──► IDownloadFileRequest 提供跨平台的工具函数: -| 方法 | 说明 | +| 成员 | 说明 | |------|------| -| `NewUnityWebRequestGet()` | 创建 GET 请求(支持自定义工厂) | +| `UnityWebRequestCreater` | 兼容保留的全局 UnityWebRequest 创建委托(默认文件系统不再读取,推荐改为 FileSystemParameters 注入) | | `ConvertToWWWPath()` | 转换本地路径为 WWW 协议 URL | | `IsRequestLocalFile()` | 判断是否本地文件请求 | @@ -543,6 +554,9 @@ int count = WebRequestCounter.GetRequestFailedCount(packageName, eventName); 1. **资源释放**:使用完毕后务必调用 `Dispose()` 释放资源 2. **断点续传**:需要服务器支持 `Range` 请求头和 `206 Partial Content` 响应 + - 若服务端不支持 Range 仍返回 200,全量内容可能会被追加写入,导致文件损坏 3. **看门狗超时**:设置为 0 表示禁用,建议根据网络环境设置合理值 4. **内存下载**:`IDownloadBytesRequest` 会将整个响应体加载到内存,不适合大文件 -5. **线程安全**:所有下载请求的创建和轮询应在主线程进行 +5. **驱动更新**:部分第三方网络库实现的 backend 可能需要每帧调用 `IDownloadBackend.Update()` 进行驱动 +6. **中止语义**:`Aborted` 可能来自用户主动 `AbortRequest()` 或看门狗超时;中止场景下 `HttpCode/Error` 可能为默认值(例如 0/空) +7. **线程安全**:所有下载请求的创建和轮询应在主线程进行 diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs index 90ec6c8e..9e339af6 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs @@ -58,6 +58,11 @@ namespace YooAsset } #region 自定义参数 + /// + /// 自定义参数:UnityWebRequest 创建委托 + /// + public UnityWebRequestCreator WebRequestCreator { private set; get; } + /// /// 自定义参数:覆盖安装缓存清理模式 /// @@ -178,7 +183,15 @@ namespace YooAsset public virtual void SetParameter(string name, object value) { - if (name == FileSystemParametersDefine.INSTALL_CLEAR_MODE) + if (name == FileSystemParametersDefine.DOWNLOAD_BACKEND) + { + DownloadBackend = (IDownloadBackend)value; + } + else if (name == FileSystemParametersDefine.UNITY_WEB_REQUEST_CREATOR) + { + WebRequestCreator = (UnityWebRequestCreator)value; + } + else if (name == FileSystemParametersDefine.INSTALL_CLEAR_MODE) { InstallClearMode = (EOverwriteInstallClearMode)value; } @@ -239,12 +252,14 @@ namespace YooAsset // 创建默认的下载后台接口 if (DownloadBackend == null) - DownloadBackend = new UnityWebRequestBackend(DownloadSystemHelper.UnityWebRequestCreater); + DownloadBackend = new UnityWebRequestBackend(WebRequestCreator); // 创建解压文件系统 var remoteServices = new DefaultUnpackRemoteServices(_packageRoot); _unpackFileSystem = new DefaultUnpackFileSystem(); _unpackFileSystem.SetParameter(FileSystemParametersDefine.REMOTE_SERVICES, remoteServices); + _unpackFileSystem.SetParameter(FileSystemParametersDefine.DOWNLOAD_BACKEND, DownloadBackend); + _unpackFileSystem.SetParameter(FileSystemParametersDefine.UNITY_WEB_REQUEST_CREATOR, WebRequestCreator); _unpackFileSystem.SetParameter(FileSystemParametersDefine.INSTALL_CLEAR_MODE, InstallClearMode); _unpackFileSystem.SetParameter(FileSystemParametersDefine.FILE_VERIFY_LEVEL, FileVerifyLevel); _unpackFileSystem.SetParameter(FileSystemParametersDefine.FILE_VERIFY_MAX_CONCURRENCY, FileVerifyMaxConcurrency); @@ -255,6 +270,17 @@ namespace YooAsset } public virtual void OnDestroy() { + if (_unpackFileSystem != null) + { + _unpackFileSystem.OnDestroy(); + _unpackFileSystem = null; + } + + if (DownloadBackend != null) + { + DownloadBackend.Dispose(); + DownloadBackend = null; + } } public virtual bool Belong(PackageBundle bundle) @@ -481,4 +507,4 @@ namespace YooAsset } #endregion } -} \ No newline at end of file +} diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs index 98f976aa..849abfe0 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs @@ -60,6 +60,11 @@ namespace YooAsset } #region 自定义参数 + /// + /// 自定义参数:UnityWebRequest 创建委托 + /// + public UnityWebRequestCreator WebRequestCreator { private set; get; } + /// /// 自定义参数:远程服务接口的实例类 /// @@ -237,7 +242,15 @@ namespace YooAsset public virtual void SetParameter(string name, object value) { - if (name == FileSystemParametersDefine.REMOTE_SERVICES) + if (name == FileSystemParametersDefine.DOWNLOAD_BACKEND) + { + DownloadBackend = (IDownloadBackend)value; + } + else if (name == FileSystemParametersDefine.UNITY_WEB_REQUEST_CREATOR) + { + WebRequestCreator = (UnityWebRequestCreator)value; + } + else if (name == FileSystemParametersDefine.REMOTE_SERVICES) { RemoteServices = (IRemoteServices)value; } @@ -334,7 +347,7 @@ namespace YooAsset // 创建默认的下载后台接口 if (DownloadBackend == null) - DownloadBackend = new UnityWebRequestBackend(DownloadSystemHelper.UnityWebRequestCreater); + DownloadBackend = new UnityWebRequestBackend(WebRequestCreator); } public virtual void OnDestroy() { @@ -343,6 +356,12 @@ namespace YooAsset DownloadScheduler.Dispose(); DownloadScheduler = null; } + + if (DownloadBackend != null) + { + DownloadBackend.Dispose(); + DownloadBackend = null; + } } public virtual bool Belong(PackageBundle bundle) @@ -673,4 +692,4 @@ namespace YooAsset } #endregion } -} \ No newline at end of file +} diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultEditorFileSystem/DefaultEditorFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultEditorFileSystem/DefaultEditorFileSystem.cs index f975fce8..0412d547 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultEditorFileSystem/DefaultEditorFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultEditorFileSystem/DefaultEditorFileSystem.cs @@ -44,6 +44,11 @@ namespace YooAsset } #region 自定义参数 + /// + /// 自定义参数:UnityWebRequest 创建委托 + /// + public UnityWebRequestCreator WebRequestCreator { private set; get; } + /// /// 模拟WebGL平台模式 /// @@ -117,7 +122,15 @@ namespace YooAsset public virtual void SetParameter(string name, object value) { - if (name == FileSystemParametersDefine.VIRTUAL_WEBGL_MODE) + if (name == FileSystemParametersDefine.DOWNLOAD_BACKEND) + { + DownloadBackend = (IDownloadBackend)value; + } + else if (name == FileSystemParametersDefine.UNITY_WEB_REQUEST_CREATOR) + { + WebRequestCreator = (UnityWebRequestCreator)value; + } + else if (name == FileSystemParametersDefine.VIRTUAL_WEBGL_MODE) { VirtualWebGLMode = Convert.ToBoolean(value); } @@ -153,10 +166,15 @@ namespace YooAsset // 创建默认的下载后台接口 if (DownloadBackend == null) - DownloadBackend = new UnityWebRequestBackend(DownloadSystemHelper.UnityWebRequestCreater); + DownloadBackend = new UnityWebRequestBackend(WebRequestCreator); } public virtual void OnDestroy() { + if (DownloadBackend != null) + { + DownloadBackend.Dispose(); + DownloadBackend = null; + } } public virtual bool Belong(PackageBundle bundle) @@ -247,4 +265,4 @@ namespace YooAsset } #endregion } -} \ No newline at end of file +} diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/DefaultWebRemoteFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/DefaultWebRemoteFileSystem.cs index c7707d94..cfa668b9 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/DefaultWebRemoteFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/DefaultWebRemoteFileSystem.cs @@ -43,6 +43,11 @@ namespace YooAsset } #region 自定义参数 + /// + /// 自定义参数:UnityWebRequest 创建委托 + /// + public UnityWebRequestCreator WebRequestCreator { private set; get; } + /// /// 禁用Unity的网络缓存 /// @@ -109,7 +114,15 @@ namespace YooAsset public virtual void SetParameter(string name, object value) { - if (name == FileSystemParametersDefine.DISABLE_UNITY_WEB_CACHE) + if (name == FileSystemParametersDefine.DOWNLOAD_BACKEND) + { + DownloadBackend = (IDownloadBackend)value; + } + else if (name == FileSystemParametersDefine.UNITY_WEB_REQUEST_CREATOR) + { + WebRequestCreator = (UnityWebRequestCreator)value; + } + else if (name == FileSystemParametersDefine.DISABLE_UNITY_WEB_CACHE) { DisableUnityWebCache = Convert.ToBoolean(value); } @@ -136,10 +149,15 @@ namespace YooAsset // 创建默认的下载后台接口 if (DownloadBackend == null) - DownloadBackend = new UnityWebRequestBackend(DownloadSystemHelper.UnityWebRequestCreater); + DownloadBackend = new UnityWebRequestBackend(WebRequestCreator); } public virtual void OnDestroy() { + if (DownloadBackend != null) + { + DownloadBackend.Dispose(); + DownloadBackend = null; + } } public virtual bool Belong(PackageBundle bundle) @@ -179,4 +197,4 @@ namespace YooAsset #region 内部方法 #endregion } -} \ No newline at end of file +} diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs index 7c9b1a88..8b0af887 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs @@ -57,6 +57,11 @@ namespace YooAsset } #region 自定义参数 + /// + /// 自定义参数:UnityWebRequest 创建委托 + /// + public UnityWebRequestCreator WebRequestCreator { private set; get; } + /// /// 禁用Unity的网络缓存 /// @@ -118,7 +123,15 @@ namespace YooAsset public virtual void SetParameter(string name, object value) { - if (name == FileSystemParametersDefine.DISABLE_UNITY_WEB_CACHE) + if (name == FileSystemParametersDefine.DOWNLOAD_BACKEND) + { + DownloadBackend = (IDownloadBackend)value; + } + else if (name == FileSystemParametersDefine.UNITY_WEB_REQUEST_CREATOR) + { + WebRequestCreator = (UnityWebRequestCreator)value; + } + else if (name == FileSystemParametersDefine.DISABLE_UNITY_WEB_CACHE) { DisableUnityWebCache = Convert.ToBoolean(value); } @@ -146,10 +159,15 @@ namespace YooAsset // 创建默认的下载后台接口 if (DownloadBackend == null) - DownloadBackend = new UnityWebRequestBackend(DownloadSystemHelper.UnityWebRequestCreater); + DownloadBackend = new UnityWebRequestBackend(WebRequestCreator); } public virtual void OnDestroy() { + if (DownloadBackend != null) + { + DownloadBackend.Dispose(); + DownloadBackend = null; + } } public virtual bool Belong(PackageBundle bundle) @@ -237,4 +255,4 @@ namespace YooAsset } #endregion } -} \ No newline at end of file +} diff --git a/Assets/YooAsset/Runtime/FileSystem/FileSystemParametersDefine.cs b/Assets/YooAsset/Runtime/FileSystem/FileSystemParametersDefine.cs index ae85ea29..73d28baf 100644 --- a/Assets/YooAsset/Runtime/FileSystem/FileSystemParametersDefine.cs +++ b/Assets/YooAsset/Runtime/FileSystem/FileSystemParametersDefine.cs @@ -13,6 +13,8 @@ namespace YooAsset public const string DISABLE_CATALOG_FILE = "DISABLE_CATALOG_FILE"; public const string DISABLE_UNITY_WEB_CACHE = "DISABLE_UNITY_WEB_CACHE"; public const string DISABLE_ONDEMAND_DOWNLOAD = "DISABLE_ONDEMAND_DOWNLOAD"; + public const string UNITY_WEB_REQUEST_CREATOR = "UNITY_WEB_REQUEST_CREATOR"; + public const string DOWNLOAD_BACKEND = "DOWNLOAD_BACKEND"; public const string DOWNLOAD_MAX_CONCURRENCY = "DOWNLOAD_MAX_CONCURRENCY"; public const string DOWNLOAD_MAX_REQUEST_PER_FRAME = "DOWNLOAD_MAX_REQUEST_PER_FRAME"; public const string DOWNLOAD_WATCH_DOG_TIME = "DOWNLOAD_WATCH_DOG_TIME"; @@ -28,4 +30,4 @@ namespace YooAsset public const string COPY_LOCAL_FILE_SERVICES = "COPY_LOCAL_FILE_SERVICES"; public const string UNPACK_FILE_SYSTEM_ROOT = "UNPACK_FILE_SYSTEM_ROOT"; } -} \ No newline at end of file +} diff --git a/Assets/YooAsset/Runtime/FileSystem/README.md b/Assets/YooAsset/Runtime/FileSystem/README.md index e6df0e99..85b304f8 100644 --- a/Assets/YooAsset/Runtime/FileSystem/README.md +++ b/Assets/YooAsset/Runtime/FileSystem/README.md @@ -354,6 +354,17 @@ var webRemoteParams = FileSystemParameters.CreateDefaultWebRemoteFileSystemParam ```csharp var cacheParams = FileSystemParameters.CreateDefaultCacheFileSystemParameters(remoteServices); +// 设置 UnityWebRequest 创建委托(用于证书/代理/自定义 Header 等) +cacheParams.AddParameter(FileSystemParametersDefine.UNITY_WEB_REQUEST_CREATOR, (UnityWebRequestCreator)((url) => +{ + var request = new UnityEngine.Networking.UnityWebRequest(url, UnityEngine.Networking.UnityWebRequest.kHttpVerbGET); + // 自定义配置... + return request; +})); + +// 设置自定义下载后端(若设置则不再创建默认 UnityWebRequestBackend) +// cacheParams.AddParameter(FileSystemParametersDefine.DOWNLOAD_BACKEND, myDownloadBackend); + // 设置文件校验级别 cacheParams.AddParameter(FileSystemParametersDefine.FILE_VERIFY_LEVEL, EFileVerifyLevel.High); diff --git a/Assets/YooAsset/Runtime/YooAssets.cs b/Assets/YooAsset/Runtime/YooAssets.cs index 3f78aad6..490bb574 100644 --- a/Assets/YooAsset/Runtime/YooAssets.cs +++ b/Assets/YooAsset/Runtime/YooAssets.cs @@ -241,9 +241,10 @@ namespace YooAsset /// /// 设置下载系统参数,自定义下载请求 /// - public static void SetDownloadSystemUnityWebRequest(UnityWebRequestDelegate createDelegate) + [Obsolete("This method is deprecated. Please use FileSystemParametersDefine.UNITY_WEB_REQUEST_CREATOR instead.", true)] + public static void SetDownloadSystemUnityWebRequest(UnityWebRequestCreator createDelegate) { - DownloadSystemHelper.UnityWebRequestCreater = createDelegate; + throw new NotImplementedException(); } ///