diff --git a/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadBuiltinCatalogOperation.cs b/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadBuiltinCatalogOperation.cs index b5b5aeaa..10b3c62c 100644 --- a/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadBuiltinCatalogOperation.cs +++ b/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadBuiltinCatalogOperation.cs @@ -31,7 +31,7 @@ namespace YooAsset /// /// 创建加载内置资源目录操作实例 /// - /// 加载内置资源目录的配置选项 + /// 加载内置资源目录的操作选项 internal LoadBuiltinCatalogOperation(LoadBuiltinCatalogOptions options) { _options = options; diff --git a/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadLocalArchiveBundleOperation.cs b/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadLocalArchiveBundleOperation.cs index a51b620b..7a0ffdde 100644 --- a/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadLocalArchiveBundleOperation.cs +++ b/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadLocalArchiveBundleOperation.cs @@ -22,7 +22,7 @@ namespace YooAsset /// /// 创建本地 ArchiveBundle 加载操作实例 /// - /// 从本地加载 ArchiveBundle 的配置选项 + /// 从本地加载 ArchiveBundle 的操作选项 public LoadLocalArchiveBundleOperation(LoadLocalArchiveBundleOptions options) { _options = options; diff --git a/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadLocalAssetBundleOperation.cs b/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadLocalAssetBundleOperation.cs index 8d2c8894..b2b8d736 100644 --- a/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadLocalAssetBundleOperation.cs +++ b/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadLocalAssetBundleOperation.cs @@ -30,7 +30,7 @@ namespace YooAsset /// /// 创建本地 AssetBundle 加载操作实例 /// - /// 从本地加载 AssetBundle 的配置选项 + /// 从本地加载 AssetBundle 的操作选项 public LoadLocalAssetBundleOperation(LoadLocalAssetBundleOptions options) { _options = options; diff --git a/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadLocalRawBundleOperation.cs b/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadLocalRawBundleOperation.cs index 591535f7..b9101cdd 100644 --- a/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadLocalRawBundleOperation.cs +++ b/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadLocalRawBundleOperation.cs @@ -23,7 +23,7 @@ namespace YooAsset /// /// 创建本地 RawBundle 加载操作实例 /// - /// 从本地加载 RawBundle 的配置选项 + /// 从本地加载 RawBundle 的操作选项 public LoadLocalRawBundleOperation(LoadLocalRawBundleOptions options) { _options = options; diff --git a/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadWebAssetBundleOperation.cs b/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadWebAssetBundleOperation.cs index ecbb7b85..9b823165 100644 --- a/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadWebAssetBundleOperation.cs +++ b/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadWebAssetBundleOperation.cs @@ -22,9 +22,9 @@ namespace YooAsset private ESteps _steps = ESteps.None; /// - /// 创建 LoadWebNormalAssetBundleOperation 实例 + /// 创建 AssetBundle 加载操作实例 /// - /// 从网络加载 AssetBundle 的配置选项 + /// 从网络加载 AssetBundle 的操作选项 public LoadWebNormalAssetBundleOperation(LoadWebAssetBundleOptions options) { _options = options; @@ -133,6 +133,7 @@ namespace YooAsset private enum ESteps { None, + Prepare, DataRequest, CheckRequest, VerifyData, @@ -150,9 +151,9 @@ namespace YooAsset private ESteps _steps = ESteps.None; /// - /// 创建 LoadWebEncryptedAssetBundleOperation 实例 + /// 创建网络 AssetBundle 加载操作实例 /// - /// 从网络加载 AssetBundle 的配置选项 + /// 从网络加载 AssetBundle 的操作选项 public LoadWebEncryptedAssetBundleOperation(LoadWebAssetBundleOptions options) { _options = options; @@ -162,34 +163,27 @@ namespace YooAsset } protected override void InternalStart() { - _steps = ESteps.DataRequest; + _steps = ESteps.Prepare; } protected override void InternalUpdate() { if (_steps == ESteps.None || _steps == ESteps.Done) return; - if (_steps == ESteps.DataRequest) + if (_steps == ESteps.Prepare) { var decryptor = _options.AssetBundleDecryptor; if (decryptor == null) { _steps = ESteps.Done; - SetError($"{_options.CacheName} decryptor is null."); + SetError($"{_options.CacheName} asset bundle decryptor is null."); return; } if (decryptor is IBundleMemoryDecryptor) { _decryptor = decryptor as IBundleMemoryDecryptor; - string url = _options.DownloadUrlPolicy.SelectUrl(_options.CandidateUrls); - var args = new DownloadDataRequestArgs( - url: url, - timeout: 0, - watchdogTimeout: _options.WatchdogTimeout); - _downloadBytesRequest = _options.DownloadBackend.CreateBytesRequest(args); - _downloadBytesRequest.SendRequest(); - _steps = ESteps.CheckRequest; + _steps = ESteps.DataRequest; } else { @@ -199,6 +193,18 @@ namespace YooAsset } } + if (_steps == ESteps.DataRequest) + { + string url = _options.DownloadUrlPolicy.SelectUrl(_options.CandidateUrls); + var args = new DownloadDataRequestArgs( + url: url, + timeout: 0, + watchdogTimeout: _options.WatchdogTimeout); + _downloadBytesRequest = _options.DownloadBackend.CreateBytesRequest(args); + _downloadBytesRequest.SendRequest(); + _steps = ESteps.CheckRequest; + } + if (_steps == ESteps.CheckRequest) { Progress = _downloadBytesRequest.DownloadProgress; @@ -225,6 +231,7 @@ namespace YooAsset { _steps = ESteps.Done; SetError(_downloadBytesRequest.Error); + YooLogger.LogError(Error); } } } @@ -246,7 +253,7 @@ namespace YooAsset } else { - string error = $"[WebBundleVerify] Verify failed. Url: '{_downloadBytesRequest.Url}' Level: {_options.DownloadVerifyLevel} Result: {verifyResult}."; + string error = $"Verify failed. Url: '{_downloadBytesRequest.Url}' Level: {_options.DownloadVerifyLevel} Result: {verifyResult}."; YooLogger.LogWarning(error); if (IsWaitForCompletion == false && _downloadRetryController.HasRetriesRemaining()) diff --git a/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadWebRawBundleOperation.cs b/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadWebRawBundleOperation.cs new file mode 100644 index 00000000..a91e5dea --- /dev/null +++ b/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadWebRawBundleOperation.cs @@ -0,0 +1,212 @@ +namespace YooAsset +{ + /// + /// 从网络加载 RawBundle 操作 + /// + internal sealed class LoadWebRawBundleOperation : BCLoadBundleOperation + { + private enum ESteps + { + None, + Prepare, + DataRequest, + CheckRequest, + VerifyData, + LoadBundle, + TryAgain, + Done, + } + + private readonly LoadWebRawBundleOptions _options; + private readonly DownloadRetryController _downloadRetryController; + private IDownloadBytesRequest _downloadBytesRequest; + private IBundleMemoryDecryptor _decryptor; + private RawBundle _rawBundle; + private ESteps _steps = ESteps.None; + + /// + /// 创建网络 RawBundle 加载操作实例 + /// + /// 从网络加载 RawBundle 的操作选项 + internal LoadWebRawBundleOperation(LoadWebRawBundleOptions options) + { + _options = options; + + // 注意:网络原因失败后,重新尝试直到成功 + _downloadRetryController = new DownloadRetryController(int.MaxValue, options.DownloadRetryPolicy); + } + protected override void InternalStart() + { + _steps = ESteps.Prepare; + } + protected override void InternalUpdate() + { + if (_steps == ESteps.None || _steps == ESteps.Done) + return; + + if (_steps == ESteps.Prepare) + { + if (_options.Bundle.IsEncrypted == false) + { + _steps = ESteps.DataRequest; + } + else + { + var decryptor = _options.RawBundleDecryptor; + if (decryptor == null) + { + _steps = ESteps.Done; + SetError($"{_options.CacheName} raw bundle decryptor is null."); + return; + } + + if (decryptor is IBundleMemoryDecryptor) + { + _decryptor = decryptor as IBundleMemoryDecryptor; + _steps = ESteps.DataRequest; + } + else + { + _steps = ESteps.Done; + SetError($"{_options.CacheName} does not support '{decryptor.GetType().Name}'."); + return; + } + } + } + + if (_steps == ESteps.DataRequest) + { + string url = _options.DownloadUrlPolicy.SelectUrl(_options.CandidateUrls); + var args = new DownloadDataRequestArgs( + url: url, + timeout: 0, + watchdogTimeout: _options.WatchdogTimeout); + _downloadBytesRequest = _options.DownloadBackend.CreateBytesRequest(args); + _downloadBytesRequest.SendRequest(); + _steps = ESteps.CheckRequest; + } + + if (_steps == ESteps.CheckRequest) + { + Progress = _downloadBytesRequest.DownloadProgress; + if (_downloadBytesRequest.IsDone == false) + return; + + if (_downloadBytesRequest.Status == EDownloadRequestStatus.Succeeded) + { + _options.DownloadUrlPolicy.OnRequestSucceeded(_downloadBytesRequest.Url); + _steps = ESteps.VerifyData; + } + else + { + string url = _downloadBytesRequest.Url; + long httpCode = _downloadBytesRequest.HttpCode; + string httpError = _downloadBytesRequest.HttpError; + _options.DownloadUrlPolicy.OnRequestFailed(url, httpCode, httpError); + if (IsWaitForCompletion == false && _downloadRetryController.CanRetryRequest(url, httpCode, httpError)) + { + _downloadRetryController.StartRetryDelay(); + _steps = ESteps.TryAgain; + } + else + { + _steps = ESteps.Done; + SetError(_downloadBytesRequest.Error); + YooLogger.LogError(Error); + } + } + } + + if (_steps == ESteps.VerifyData) + { + // 注意:网络/代理/服务器异常导致内容不完整但请求仍成功 + EFileVerifyResult verifyResult; + if (_options.DownloadVerifyLevel == EFileVerifyLevel.Low || _options.DownloadVerifyLevel == EFileVerifyLevel.Middle) + verifyResult = FileVerifyHelper.VerifyFile(_downloadBytesRequest.Result, _options.Bundle.FileSize, 0); + else if (_options.DownloadVerifyLevel == EFileVerifyLevel.High) + verifyResult = FileVerifyHelper.VerifyFile(_downloadBytesRequest.Result, _options.Bundle.FileSize, _options.Bundle.FileCrc); + else + throw new YooInternalException($"Unexpected verify level: {_options.DownloadVerifyLevel}."); + + if (verifyResult == EFileVerifyResult.Succeed) + { + _steps = ESteps.LoadBundle; + } + else + { + string error = $"Verify failed. Url: '{_downloadBytesRequest.Url}' Level: {_options.DownloadVerifyLevel} Result: {verifyResult}."; + YooLogger.LogWarning(error); + + if (IsWaitForCompletion == false && _downloadRetryController.HasRetriesRemaining()) + { + _downloadRetryController.StartRetryDelay(); + _steps = ESteps.TryAgain; + } + else + { + _steps = ESteps.Done; + SetError(error); + } + } + } + + if (_steps == ESteps.LoadBundle) + { + LoadResult result = LoadFromMemory(_decryptor, _downloadBytesRequest.Result); + if (result.Succeeded == false) + { + _steps = ESteps.Done; + SetError(result.Error); + return; + } + + _steps = ESteps.Done; + SetResult(); + BundleHandle = new RawBundleHandle(_options.Bundle, _rawBundle); + } + + if (_steps == ESteps.TryAgain) + { + // 注意:失败后释放网络请求 + if (_downloadBytesRequest != null) + { + _downloadBytesRequest.Dispose(); + _downloadBytesRequest = null; + } + + if (_downloadRetryController.TickRetryDelay()) + { + Progress = 0f; + _steps = ESteps.DataRequest; + } + } + } + protected override void InternalDispose() + { + if (_downloadBytesRequest != null) + { + _downloadBytesRequest.Dispose(); + _downloadBytesRequest = null; + } + } + + private LoadResult LoadFromMemory(IBundleMemoryDecryptor decryptor, byte[] fileData) + { + if (decryptor != null) + { + var args = new BundleDecryptArgs(_options.Bundle, fileData, null); + var binaryData = decryptor.GetDecryptedData(args); + if (binaryData == null) + return LoadResult.Failure($"{_options.CacheName} decryptor returned null data."); + + _rawBundle = new RawBundle(binaryData); + return LoadResult.Default(); + } + else + { + _rawBundle = new RawBundle(fileData); + return LoadResult.Default(); + } + } + } +} diff --git a/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadWebRawBundleOperation.cs.meta b/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadWebRawBundleOperation.cs.meta new file mode 100644 index 00000000..e8447611 --- /dev/null +++ b/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadWebRawBundleOperation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b30e1d41b966e63488837244e907363b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadWebRawBundleOptions.cs b/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadWebRawBundleOptions.cs new file mode 100644 index 00000000..2bf9bb4f --- /dev/null +++ b/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadWebRawBundleOptions.cs @@ -0,0 +1,70 @@ +using System.Collections.Generic; + +namespace YooAsset +{ + /// + /// 加载 RawBundle 的操作选项 + /// + internal readonly struct LoadWebRawBundleOptions + { + /// + /// 文件缓存名称 + /// + public string CacheName { get; } + + /// + /// 资源包描述 + /// + public PackageBundle Bundle { get; } + + /// + /// 候选下载地址列表 + /// + public IReadOnlyList CandidateUrls { get; } + + /// + /// RawBundle 解密器 + /// + public IBundleDecryptor RawBundleDecryptor { get; } + + /// + /// 下载后台接口 + /// + public IDownloadBackend DownloadBackend { get; } + + /// + /// 下载数据校验级别 + /// + public EFileVerifyLevel DownloadVerifyLevel { get; } + + /// + /// 看门狗超时时间 + /// + public int WatchdogTimeout { get; } + + /// + /// 下载重试判定策略 + /// + public IDownloadRetryPolicy DownloadRetryPolicy { get; } + + /// + /// URL 选择策略 + /// + public IDownloadUrlPolicy DownloadUrlPolicy { get; } + + public LoadWebRawBundleOptions(string cacheName, PackageBundle bundle, IReadOnlyList candidateUrls, + IBundleDecryptor rawBundleDecryptor, IDownloadBackend downloadBackend, EFileVerifyLevel downloadVerifyLevel, + int watchdogTimeout, IDownloadRetryPolicy downloadRetryPolicy, IDownloadUrlPolicy downloadUrlPolicy) + { + CacheName = cacheName; + Bundle = bundle; + CandidateUrls = candidateUrls; + RawBundleDecryptor = rawBundleDecryptor; + DownloadBackend = downloadBackend; + DownloadVerifyLevel = downloadVerifyLevel; + WatchdogTimeout = watchdogTimeout; + DownloadRetryPolicy = downloadRetryPolicy; + DownloadUrlPolicy = downloadUrlPolicy; + } + } +} diff --git a/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadWebRawBundleOptions.cs.meta b/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadWebRawBundleOptions.cs.meta new file mode 100644 index 00000000..e32f2253 --- /dev/null +++ b/Assets/YooAsset/Runtime/BundleCache/Operations/Common/LoadWebRawBundleOptions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c3f863ac69271e243b9270f23c70b02e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/BundleCache/Services/WebGameBundleCache/Operations/WGBCLoadAssetBundleOperation.cs b/Assets/YooAsset/Runtime/BundleCache/Services/WebGameBundleCache/Operations/WGBCLoadAssetBundleOperation.cs index a26bc16d..1770f976 100644 --- a/Assets/YooAsset/Runtime/BundleCache/Services/WebGameBundleCache/Operations/WGBCLoadAssetBundleOperation.cs +++ b/Assets/YooAsset/Runtime/BundleCache/Services/WebGameBundleCache/Operations/WGBCLoadAssetBundleOperation.cs @@ -1,7 +1,7 @@ namespace YooAsset { /// - /// WebGL 游戏平台加载 AssetBundle 操作 + /// 小游戏平台加载 AssetBundle 操作 /// internal sealed class WGBCLoadAssetBundleOperation : BCLoadBundleOperation { diff --git a/Assets/YooAsset/Runtime/BundleCache/Services/WebGameBundleCache/Operations/WGBCLoadRawBundleOperation.cs b/Assets/YooAsset/Runtime/BundleCache/Services/WebGameBundleCache/Operations/WGBCLoadRawBundleOperation.cs new file mode 100644 index 00000000..993a7c1e --- /dev/null +++ b/Assets/YooAsset/Runtime/BundleCache/Services/WebGameBundleCache/Operations/WGBCLoadRawBundleOperation.cs @@ -0,0 +1,85 @@ +namespace YooAsset +{ + /// + /// 小游戏平台加载 RawBundle 操作 + /// + internal sealed class WGBCLoadRawBundleOperation : BCLoadBundleOperation + { + private enum ESteps + { + None, + LoadBundle, + Done, + } + + private readonly WebGameBundleCache _fileCache; + private readonly BCLoadBundleOptions _options; + private BCLoadBundleOperation _loadBundleOp; + private ESteps _steps = ESteps.None; + + internal WGBCLoadRawBundleOperation(WebGameBundleCache fileCache, BCLoadBundleOptions options) + { + _fileCache = fileCache; + _options = options; + } + protected override void InternalStart() + { + _steps = ESteps.LoadBundle; + } + protected override void InternalUpdate() + { + if (_steps == ESteps.None || _steps == ESteps.Done) + return; + + if (_steps == ESteps.LoadBundle) + { + if (_loadBundleOp == null) + { + var urls = _fileCache.Config.RemoteService.GetRemoteUrls(_options.Bundle.GetFileName()); + var options = new LoadWebRawBundleOptions( + cacheName: _fileCache.GetType().Name, + bundle: _options.Bundle, + candidateUrls: urls, + rawBundleDecryptor: _fileCache.Config.RawBundleDecryptor, + downloadBackend: _fileCache.Config.DownloadBackend, + downloadVerifyLevel: _fileCache.Config.DownloadVerifyLevel, + watchdogTimeout: _fileCache.Config.WatchdogTimeout, + downloadRetryPolicy: _fileCache.Config.DownloadRetryPolicy, + downloadUrlPolicy: _fileCache.Config.DownloadUrlPolicy); + _loadBundleOp = new LoadWebRawBundleOperation(options); + _loadBundleOp.StartOperation(); + AddChildOperation(_loadBundleOp); + } + + _loadBundleOp.UpdateOperation(); + Progress = _loadBundleOp.Progress; + if (_loadBundleOp.IsDone == false) + return; + + if (_loadBundleOp.Status == EOperationStatus.Succeeded) + { + if (_loadBundleOp.BundleHandle == null) + throw new YooInternalException("Loaded bundle handle is null."); + + _steps = ESteps.Done; + SetResult(); + BundleHandle = _loadBundleOp.BundleHandle; + } + else + { + _steps = ESteps.Done; + SetError(_loadBundleOp.Error); + } + } + } + protected override void InternalWaitForCompletion() + { + if (_steps != ESteps.Done) + { + _steps = ESteps.Done; + SetError("WebGL platform does not support synchronous loading."); + YooLogger.LogError(Error); + } + } + } +} diff --git a/Assets/YooAsset/Runtime/BundleCache/Services/WebGameBundleCache/Operations/WGBCLoadRawBundleOperation.cs.meta b/Assets/YooAsset/Runtime/BundleCache/Services/WebGameBundleCache/Operations/WGBCLoadRawBundleOperation.cs.meta new file mode 100644 index 00000000..6e188df5 --- /dev/null +++ b/Assets/YooAsset/Runtime/BundleCache/Services/WebGameBundleCache/Operations/WGBCLoadRawBundleOperation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4024fa98150c5d4479e93ce88c6c2795 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/BundleCache/Services/WebGameBundleCache/WebGameBundleCache.cs b/Assets/YooAsset/Runtime/BundleCache/Services/WebGameBundleCache/WebGameBundleCache.cs index a01f945e..fe27e966 100644 --- a/Assets/YooAsset/Runtime/BundleCache/Services/WebGameBundleCache/WebGameBundleCache.cs +++ b/Assets/YooAsset/Runtime/BundleCache/Services/WebGameBundleCache/WebGameBundleCache.cs @@ -34,6 +34,11 @@ namespace YooAsset /// public IBundleDecryptor AssetBundleDecryptor { get; } + /// + /// RawBundle 解密器 + /// + public IBundleDecryptor RawBundleDecryptor { get; } + /// /// 远程服务接口 /// @@ -54,9 +59,8 @@ namespace YooAsset /// public IDownloadUrlPolicy DownloadUrlPolicy { get; } - public Configuration(IWebGamePlatform gamePlatform, - int watchdogTimeout, bool disableUnityWebCache, - EFileVerifyLevel downloadVerifyLevel, IBundleDecryptor assetBundleDecryptor, IRemoteService remoteService, + public Configuration(IWebGamePlatform gamePlatform, int watchdogTimeout, bool disableUnityWebCache, + EFileVerifyLevel downloadVerifyLevel, IBundleDecryptor assetBundleDecryptor, IBundleDecryptor rawBundleDecryptor, IRemoteService remoteService, IDownloadBackend downloadBackend, IDownloadRetryPolicy downloadRetryPolicy, IDownloadUrlPolicy downloadUrlPolicy) { GamePlatform = gamePlatform; @@ -64,6 +68,7 @@ namespace YooAsset DisableUnityWebCache = disableUnityWebCache; DownloadVerifyLevel = downloadVerifyLevel; AssetBundleDecryptor = assetBundleDecryptor; + RawBundleDecryptor = rawBundleDecryptor; RemoteService = remoteService; DownloadBackend = downloadBackend; DownloadRetryPolicy = downloadRetryPolicy; @@ -143,6 +148,11 @@ namespace YooAsset var operation = new WGBCLoadAssetBundleOperation(this, options); return operation; } + else if (options.Bundle.GetBundleType() == (int)EBundleType.RawBundle) + { + var operation = new WGBCLoadRawBundleOperation(this, options); + return operation; + } else { string error = $"{nameof(WebGameBundleCache)} does not support bundle type: {options.Bundle.GetBundleType()}."; diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/WebGameFileSystem/WebGameFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/Services/WebGameFileSystem/WebGameFileSystem.cs index 381b87b7..a8d07b16 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/WebGameFileSystem/WebGameFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/WebGameFileSystem/WebGameFileSystem.cs @@ -55,6 +55,11 @@ namespace YooAsset /// public IBundleDecryptor AssetBundleDecryptor { get; private set; } + /// + /// 自定义参数:RawBundle 解密器 + /// + public IBundleDecryptor RawBundleDecryptor { get; private set; } + /// /// 自定义参数:资源清单解密器 /// @@ -142,6 +147,10 @@ namespace YooAsset { AssetBundleDecryptor = FileSystemHelper.CastParameter(paramName, value); } + else if (paramName == nameof(EFileSystemParameter.RawbundleDecryptor)) + { + RawBundleDecryptor = FileSystemHelper.CastParameter(paramName, value); + } else if (paramName == nameof(EFileSystemParameter.ManifestDecryptor)) { ManifestDecryptor = FileSystemHelper.CastParameter(paramName, value); @@ -189,6 +198,7 @@ namespace YooAsset disableUnityWebCache: DisableUnityWebCache, downloadVerifyLevel: DownloadVerifyLevel, assetBundleDecryptor: AssetBundleDecryptor, + rawBundleDecryptor: RawBundleDecryptor, remoteService: RemoteService, downloadBackend: DownloadBackend, downloadRetryPolicy: DownloadRetryPolicy, diff --git a/Assets/YooAsset/Runtime/ResourceManager/ResourceManager.cs b/Assets/YooAsset/Runtime/ResourceManager/ResourceManager.cs index 7bfd285c..80407453 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/ResourceManager.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/ResourceManager.cs @@ -58,7 +58,7 @@ namespace YooAsset /// /// 初始化 /// - /// 初始化配置选项 + /// 初始化操作选项 /// 文件系统宿主 public void Initialize(InitializePackageOptions options, FileSystemHost host) { diff --git a/Assets/YooAsset/Samples~/Mini Game/Runtime/AlipayFileSystem/AlipayFileSystem.cs b/Assets/YooAsset/Samples~/Mini Game/Runtime/AlipayFileSystem/AlipayFileSystem.cs index 72ccde57..0f32aaaf 100644 --- a/Assets/YooAsset/Samples~/Mini Game/Runtime/AlipayFileSystem/AlipayFileSystem.cs +++ b/Assets/YooAsset/Samples~/Mini Game/Runtime/AlipayFileSystem/AlipayFileSystem.cs @@ -11,12 +11,21 @@ public static class AlipayFileSystemCreater fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService); return fileSystemParams; } - public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor decryptor) + public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor assetBundleDecryptor) { string fileSystemClass = $"{nameof(AlipayFileSystem)},YooAsset.MiniGame"; var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot); fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService); - fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, decryptor); + fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, assetBundleDecryptor); + return fileSystemParams; + } + public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor assetBundleDecryptor, IBundleDecryptor rawBundleDecryptor) + { + string fileSystemClass = $"{nameof(AlipayFileSystem)},YooAsset.MiniGame"; + var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot); + fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService); + fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, assetBundleDecryptor); + fileSystemParams.AddParameter(EFileSystemParameter.RawbundleDecryptor, rawBundleDecryptor); return fileSystemParams; } } diff --git a/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/KuaiShouFileSystem.cs b/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/KuaiShouFileSystem.cs index aefcbfa8..ba2768a0 100644 --- a/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/KuaiShouFileSystem.cs +++ b/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/KuaiShouFileSystem.cs @@ -10,12 +10,21 @@ public static class KuaiShouFileSystemCreater fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService); return fileSystemParams; } - public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor decryptor) + public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor assetBundleDecryptor) { string fileSystemClass = $"{nameof(KuaiShouFileSystem)},YooAsset.MiniGame"; var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot); fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService); - fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, decryptor); + fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, assetBundleDecryptor); + return fileSystemParams; + } + public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor assetBundleDecryptor, IBundleDecryptor rawBundleDecryptor) + { + string fileSystemClass = $"{nameof(KuaiShouFileSystem)},YooAsset.MiniGame"; + var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot); + fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService); + fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, assetBundleDecryptor); + fileSystemParams.AddParameter(EFileSystemParameter.RawbundleDecryptor, rawBundleDecryptor); return fileSystemParams; } } diff --git a/Assets/YooAsset/Samples~/Mini Game/Runtime/OppoFileSystem/OppoFileSystem.cs b/Assets/YooAsset/Samples~/Mini Game/Runtime/OppoFileSystem/OppoFileSystem.cs index ca790b2b..b7310190 100644 --- a/Assets/YooAsset/Samples~/Mini Game/Runtime/OppoFileSystem/OppoFileSystem.cs +++ b/Assets/YooAsset/Samples~/Mini Game/Runtime/OppoFileSystem/OppoFileSystem.cs @@ -10,12 +10,21 @@ public static class OppoFileSystemCreater fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService); return fileSystemParams; } - public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor decryptor) + public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor assetBundleDecryptor) { string fileSystemClass = $"{nameof(OppoFileSystem)},YooAsset.MiniGame"; var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot); fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService); - fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, decryptor); + fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, assetBundleDecryptor); + return fileSystemParams; + } + public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor assetBundleDecryptor, IBundleDecryptor rawBundleDecryptor) + { + string fileSystemClass = $"{nameof(OppoFileSystem)},YooAsset.MiniGame"; + var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot); + fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService); + fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, assetBundleDecryptor); + fileSystemParams.AddParameter(EFileSystemParameter.RawbundleDecryptor, rawBundleDecryptor); return fileSystemParams; } } diff --git a/Assets/YooAsset/Samples~/Mini Game/Runtime/TaptapFileSystem/TaptapFileSystem.cs b/Assets/YooAsset/Samples~/Mini Game/Runtime/TaptapFileSystem/TaptapFileSystem.cs index ccb771fa..e1019beb 100644 --- a/Assets/YooAsset/Samples~/Mini Game/Runtime/TaptapFileSystem/TaptapFileSystem.cs +++ b/Assets/YooAsset/Samples~/Mini Game/Runtime/TaptapFileSystem/TaptapFileSystem.cs @@ -11,12 +11,21 @@ public static class TaptapFileSystemCreater fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService); return fileSystemParams; } - public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor decryptor) + public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor assetBundleDecryptor) { string fileSystemClass = $"{nameof(TaptapFileSystem)},YooAsset.MiniGame"; var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot); fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService); - fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, decryptor); + fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, assetBundleDecryptor); + return fileSystemParams; + } + public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor assetBundleDecryptor, IBundleDecryptor rawBundleDecryptor) + { + string fileSystemClass = $"{nameof(TaptapFileSystem)},YooAsset.MiniGame"; + var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot); + fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService); + fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, assetBundleDecryptor); + fileSystemParams.AddParameter(EFileSystemParameter.RawbundleDecryptor, rawBundleDecryptor); return fileSystemParams; } } diff --git a/Assets/YooAsset/Samples~/Mini Game/Runtime/TiktokFileSystem/TiktokFileSystem.cs b/Assets/YooAsset/Samples~/Mini Game/Runtime/TiktokFileSystem/TiktokFileSystem.cs index d5bcc58f..8eaf6624 100644 --- a/Assets/YooAsset/Samples~/Mini Game/Runtime/TiktokFileSystem/TiktokFileSystem.cs +++ b/Assets/YooAsset/Samples~/Mini Game/Runtime/TiktokFileSystem/TiktokFileSystem.cs @@ -10,12 +10,21 @@ public static class TiktokFileSystemCreater fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService); return fileSystemParams; } - public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor decryptor) + public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor assetBundleDecryptor) { string fileSystemClass = $"{nameof(TiktokFileSystem)},YooAsset.MiniGame"; var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot); fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService); - fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, decryptor); + fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, assetBundleDecryptor); + return fileSystemParams; + } + public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor assetBundleDecryptor, IBundleDecryptor rawBundleDecryptor) + { + string fileSystemClass = $"{nameof(TiktokFileSystem)},YooAsset.MiniGame"; + var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot); + fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService); + fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, assetBundleDecryptor); + fileSystemParams.AddParameter(EFileSystemParameter.RawbundleDecryptor, rawBundleDecryptor); return fileSystemParams; } } diff --git a/Assets/YooAsset/Samples~/Mini Game/Runtime/VivoFileSystem/VivoFileSystem.cs b/Assets/YooAsset/Samples~/Mini Game/Runtime/VivoFileSystem/VivoFileSystem.cs index fdeeb6cd..55a5e18d 100644 --- a/Assets/YooAsset/Samples~/Mini Game/Runtime/VivoFileSystem/VivoFileSystem.cs +++ b/Assets/YooAsset/Samples~/Mini Game/Runtime/VivoFileSystem/VivoFileSystem.cs @@ -10,12 +10,21 @@ public static class VivoFileSystemCreater fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService); return fileSystemParams; } - public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor decryptor) + public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor assetBundleDecryptor) { string fileSystemClass = $"{nameof(VivoFileSystem)},YooAsset.MiniGame"; var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot); fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService); - fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, decryptor); + fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, assetBundleDecryptor); + return fileSystemParams; + } + public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor assetBundleDecryptor, IBundleDecryptor rawBundleDecryptor) + { + string fileSystemClass = $"{nameof(VivoFileSystem)},YooAsset.MiniGame"; + var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot); + fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService); + fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, assetBundleDecryptor); + fileSystemParams.AddParameter(EFileSystemParameter.RawbundleDecryptor, rawBundleDecryptor); return fileSystemParams; } } diff --git a/Assets/YooAsset/Samples~/Mini Game/Runtime/WechatFileSystem/WechatFileSystem.cs b/Assets/YooAsset/Samples~/Mini Game/Runtime/WechatFileSystem/WechatFileSystem.cs index 2b23c71c..d67b4975 100644 --- a/Assets/YooAsset/Samples~/Mini Game/Runtime/WechatFileSystem/WechatFileSystem.cs +++ b/Assets/YooAsset/Samples~/Mini Game/Runtime/WechatFileSystem/WechatFileSystem.cs @@ -11,12 +11,21 @@ public static class WechatFileSystemCreater fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService); return fileSystemParams; } - public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor decryptor) + public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor assetBundleDecryptor) { string fileSystemClass = $"{nameof(WechatFileSystem)},YooAsset.MiniGame"; var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot); fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService); - fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, decryptor); + fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, assetBundleDecryptor); + return fileSystemParams; + } + public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor assetBundleDecryptor, IBundleDecryptor rawBundleDecryptor) + { + string fileSystemClass = $"{nameof(WechatFileSystem)},YooAsset.MiniGame"; + var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot); + fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService); + fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, assetBundleDecryptor); + fileSystemParams.AddParameter(EFileSystemParameter.RawbundleDecryptor, rawBundleDecryptor); return fileSystemParams; } }