diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs index 15d32796..77de987f 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs @@ -559,6 +559,21 @@ namespace YooAsset }; return DecryptionServices.LoadAssetBundleAsync(fileInfo); } + + /// + /// 加载加密资源文件 + /// + public DecryptResult LoadEncryptedAssetBundleFallback(PackageBundle bundle) + { + string filePath = GetCacheBundleFileLoadPath(bundle); + var fileInfo = new DecryptFileInfo() + { + BundleName = bundle.BundleName, + FileLoadCRC = bundle.UnityCRC, + FileLoadPath = filePath, + }; + return DecryptionServices.LoadAssetBundleFallback(fileInfo); + } #endregion } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/DCFSLoadBundleOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/DCFSLoadBundleOperation.cs index 2aefef9f..f7cfc967 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/DCFSLoadBundleOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/DCFSLoadBundleOperation.cs @@ -164,11 +164,23 @@ namespace YooAsset { if (_bundle.Encrypted) { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = $"Failed to load encrypted asset bundle file : {_bundle.BundleName}"; - YooLogger.Error(Error); - return; + var decryptResult = _fileSystem.LoadEncryptedAssetBundleFallback(_bundle); + _assetBundle = decryptResult.Result; + if (_assetBundle != null) + { + _steps = ESteps.Done; + Result = new AssetBundleResult(_fileSystem, _bundle, _assetBundle, _managedStream); + Status = EOperationStatus.Succeed; + return; + } + else + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"Failed to load encrypted asset bundle file : {_bundle.BundleName}"; + YooLogger.Error(Error); + return; + } } // 注意:在安卓移动平台,华为和三星真机上有极小概率加载资源包失败。 diff --git a/Assets/YooAsset/Runtime/Services/IDecryptionServices.cs b/Assets/YooAsset/Runtime/Services/IDecryptionServices.cs index 1e954a3e..2dfeec3c 100644 --- a/Assets/YooAsset/Runtime/Services/IDecryptionServices.cs +++ b/Assets/YooAsset/Runtime/Services/IDecryptionServices.cs @@ -51,6 +51,14 @@ namespace YooAsset /// DecryptResult LoadAssetBundleAsync(DecryptFileInfo fileInfo); + /// + /// 后备方式获取解密的资源包对象 + /// 注意:当正常解密方法失败后,会触发后备加载! + /// 说明:建议通过LoadFromMemory()方法加载资源对象作为保底机制。 + /// issues : https://github.com/tuyoogame/YooAsset/issues/562 + /// + DecryptResult LoadAssetBundleFallback(DecryptFileInfo fileInfo); + /// /// 获取解密的字节数据 /// diff --git a/Assets/YooAsset/Samples~/Test Sample/Runtime/T2_TestBuldinFileSystem/TestBundleEncryption.cs b/Assets/YooAsset/Samples~/Test Sample/Runtime/T2_TestBuldinFileSystem/TestBundleEncryption.cs index 33993150..760cb6bf 100644 --- a/Assets/YooAsset/Samples~/Test Sample/Runtime/T2_TestBuldinFileSystem/TestBundleEncryption.cs +++ b/Assets/YooAsset/Samples~/Test Sample/Runtime/T2_TestBuldinFileSystem/TestBundleEncryption.cs @@ -147,6 +147,14 @@ public class FileStreamTestDecryption : IDecryptionServices return decryptResult; } + /// + /// 后备方式获取解密的资源包对象 + /// + DecryptResult IDecryptionServices.LoadAssetBundleFallback(DecryptFileInfo fileInfo) + { + return new DecryptResult(); + } + /// /// 获取解密的字节数据 /// @@ -198,6 +206,14 @@ public class FileOffsetTestDecryption : IDecryptionServices return decryptResult; } + /// + /// 后备方式获取解密的资源包对象 + /// + DecryptResult IDecryptionServices.LoadAssetBundleFallback(DecryptFileInfo fileInfo) + { + return new DecryptResult(); + } + /// /// 获取解密的字节数据 ///