diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderHelper.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderHelper.cs index eb11b8f7..5b1b71e1 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderHelper.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderHelper.cs @@ -22,7 +22,7 @@ namespace YooAsset.Editor /// public static string GetStreamingAssetsRoot() { - return YooAssetSettingsData.GetYooDefaultBuildinRoot(); + return YooAssetSettingsData.GetYooDefaultBuiltinRoot(); } } } \ No newline at end of file diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs index ca505253..54cc18cb 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs @@ -31,7 +31,7 @@ namespace YooAsset.Editor // 创建新补丁清单 PackageManifest manifest = new PackageManifest(); - manifest.FileVersion = PackageManifestDefine.FileVersion; + manifest.FileVersion = PackageManifestConsts.FileVersion; manifest.EnableAddressable = buildMapContext.Command.EnableAddressable; manifest.SupportExtensionless = buildMapContext.Command.SupportExtensionless; manifest.LocationToLower = buildMapContext.Command.LocationToLower; diff --git a/Assets/YooAsset/Editor/AssetBundleDebugger/AssetBundleDebuggerWindow.cs b/Assets/YooAsset/Editor/AssetBundleDebugger/AssetBundleDebuggerWindow.cs index 511e40c1..094ce07c 100644 --- a/Assets/YooAsset/Editor/AssetBundleDebugger/AssetBundleDebuggerWindow.cs +++ b/Assets/YooAsset/Editor/AssetBundleDebugger/AssetBundleDebuggerWindow.cs @@ -147,9 +147,9 @@ namespace YooAsset.Editor EditorConnection.instance.Initialize(); EditorConnection.instance.RegisterConnection(OnHandleConnectionEvent); EditorConnection.instance.RegisterDisconnection(OnHandleDisconnectionEvent); - EditorConnection.instance.Register(DiagnosticSystemDefine.PlayerToEditorMessageId, OnHandlePlayerMessage); + EditorConnection.instance.Register(DiagnosticSystemConsts.PlayerToEditorMessageId, OnHandlePlayerMessage); MockEditorConnection.Instance.Initialize(); - MockEditorConnection.Instance.Register(DiagnosticSystemDefine.PlayerToEditorMessageId, OnHandlePlayerMessage); + MockEditorConnection.Instance.Register(DiagnosticSystemConsts.PlayerToEditorMessageId, OnHandlePlayerMessage); } catch (Exception e) { @@ -161,8 +161,8 @@ namespace YooAsset.Editor // 远程调试 EditorConnection.instance.UnregisterConnection(OnHandleConnectionEvent); EditorConnection.instance.UnregisterDisconnection(OnHandleDisconnectionEvent); - EditorConnection.instance.Unregister(DiagnosticSystemDefine.PlayerToEditorMessageId, OnHandlePlayerMessage); - MockEditorConnection.Instance.Unregister(DiagnosticSystemDefine.PlayerToEditorMessageId, OnHandlePlayerMessage); + EditorConnection.instance.Unregister(DiagnosticSystemConsts.PlayerToEditorMessageId, OnHandlePlayerMessage); + MockEditorConnection.Instance.Unregister(DiagnosticSystemConsts.PlayerToEditorMessageId, OnHandlePlayerMessage); _playerSessions.Clear(); } public void Update() @@ -194,9 +194,9 @@ namespace YooAsset.Editor int playerId = args.playerId; var debugReport = DiagnosticReport.Deserialize(args.data); - if (debugReport.ProtocolVersion != DiagnosticSystemDefine.ProtocolVersion) + if (debugReport.ProtocolVersion != DiagnosticSystemConsts.ProtocolVersion) { - Debug.LogWarning($"Debugger versions are inconsistent : {debugReport.ProtocolVersion} != {DiagnosticSystemDefine.ProtocolVersion}"); + Debug.LogWarning($"Debugger versions are inconsistent : {debugReport.ProtocolVersion} != {DiagnosticSystemConsts.ProtocolVersion}"); return; } @@ -258,8 +258,8 @@ namespace YooAsset.Editor command.CommandType = (int)EDiagnosticCommandType.AutoSampling; command.Parameter = evt.newValue ? "open" : "close"; byte[] data = DiagnosticCommand.Serialize(command); - EditorConnection.instance.Send(DiagnosticSystemDefine.EditorToPlayerMessageId, data); - MockEditorConnection.Instance.Send(DiagnosticSystemDefine.EditorToPlayerMessageId, data); + EditorConnection.instance.Send(DiagnosticSystemConsts.EditorToPlayerMessageId, data); + MockEditorConnection.Instance.Send(DiagnosticSystemConsts.EditorToPlayerMessageId, data); } private void SampleBtn_onClick() @@ -269,8 +269,8 @@ namespace YooAsset.Editor command.CommandType = (int)EDiagnosticCommandType.SampleOnce; command.Parameter = string.Empty; byte[] data = DiagnosticCommand.Serialize(command); - EditorConnection.instance.Send(DiagnosticSystemDefine.EditorToPlayerMessageId, data); - MockEditorConnection.Instance.Send(DiagnosticSystemDefine.EditorToPlayerMessageId, data); + EditorConnection.instance.Send(DiagnosticSystemConsts.EditorToPlayerMessageId, data); + MockEditorConnection.Instance.Send(DiagnosticSystemConsts.EditorToPlayerMessageId, data); } private void ExportBtn_clicked() { diff --git a/Assets/YooAsset/Runtime/AsyncOperation/AsyncOperationBase.cs b/Assets/YooAsset/Runtime/AsyncOperation/AsyncOperationBase.cs index 0eaad370..e26220d4 100644 --- a/Assets/YooAsset/Runtime/AsyncOperation/AsyncOperationBase.cs +++ b/Assets/YooAsset/Runtime/AsyncOperation/AsyncOperationBase.cs @@ -358,7 +358,7 @@ namespace YooAsset } catch (Exception ex) { - YooLogger.Error($"Exception in inoke callback: {ex}"); + YooLogger.Error($"Exception in invoke callback: {ex}"); } } } diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles.meta b/Assets/YooAsset/Runtime/BundleHandle.meta similarity index 77% rename from Assets/YooAsset/Runtime/FileSystem/Bundles.meta rename to Assets/YooAsset/Runtime/BundleHandle.meta index 37e76299..d1c5054d 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles.meta +++ b/Assets/YooAsset/Runtime/BundleHandle.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a9ca0d0d29eb5294b9c6926c6a09e76b +guid: 4c4801976948fc14cb28d4982c9ebe5c folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/YooAsset/Runtime/ResourcePackage/EBundleType.cs b/Assets/YooAsset/Runtime/BundleHandle/EBundleType.cs similarity index 100% rename from Assets/YooAsset/Runtime/ResourcePackage/EBundleType.cs rename to Assets/YooAsset/Runtime/BundleHandle/EBundleType.cs diff --git a/Assets/YooAsset/Runtime/ResourcePackage/EBundleType.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/EBundleType.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/ResourcePackage/EBundleType.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/EBundleType.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Interfaces.meta b/Assets/YooAsset/Runtime/BundleHandle/Interfaces.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Interfaces.meta rename to Assets/YooAsset/Runtime/BundleHandle/Interfaces.meta diff --git a/Assets/YooAsset/Runtime/BundleHandle/Interfaces/IBundleHandle.cs b/Assets/YooAsset/Runtime/BundleHandle/Interfaces/IBundleHandle.cs new file mode 100644 index 00000000..a274a6f2 --- /dev/null +++ b/Assets/YooAsset/Runtime/BundleHandle/Interfaces/IBundleHandle.cs @@ -0,0 +1,40 @@ +using UnityEngine.SceneManagement; + +namespace YooAsset +{ + /// + /// 资源包句柄接口,提供对已加载资源包的操作能力 + /// + internal interface IBundleHandle + { + /// + /// 获取资源包文件的本地路径 + /// + string GetBundleFilePath(); + + /// + /// 卸载资源包文件 + /// + void UnloadBundleFile(); + + /// + /// 加载资源对象 + /// + BHLoadAssetOperation LoadAssetAsync(AssetInfo assetInfo); + + /// + /// 加载所有资源对象 + /// + BHLoadAllAssetsOperation LoadAllAssetsAsync(AssetInfo assetInfo); + + /// + /// 加载资源对象及所有子资源对象 + /// + BHLoadSubAssetsOperation LoadSubAssetsAsync(AssetInfo assetInfo); + + /// + /// 加载场景对象 + /// + BHLoadSceneOperation LoadSceneAsync(AssetInfo assetInfo, LoadSceneParameters loadSceneParams, bool suspendLoad); + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Interfaces/IBundleResult.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Interfaces/IBundleHandle.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Interfaces/IBundleResult.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Interfaces/IBundleHandle.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Operations.meta b/Assets/YooAsset/Runtime/BundleHandle/Operations.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Operations.meta rename to Assets/YooAsset/Runtime/BundleHandle/Operations.meta diff --git a/Assets/YooAsset/Runtime/BundleHandle/Operations/BHLoadAllAssetsOperation.cs b/Assets/YooAsset/Runtime/BundleHandle/Operations/BHLoadAllAssetsOperation.cs new file mode 100644 index 00000000..8b127be4 --- /dev/null +++ b/Assets/YooAsset/Runtime/BundleHandle/Operations/BHLoadAllAssetsOperation.cs @@ -0,0 +1,14 @@ + +namespace YooAsset +{ + /// + /// 加载所有资源操作的抽象基类 + /// + internal abstract class BHLoadAllAssetsOperation : AsyncOperationBase + { + /// + /// 加载的所有资源对象 + /// + public UnityEngine.Object[] Result; + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Operations/FSLoadAllAssetsOperation.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Operations/BHLoadAllAssetsOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Operations/FSLoadAllAssetsOperation.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Operations/BHLoadAllAssetsOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/BundleHandle/Operations/BHLoadAssetOperation.cs b/Assets/YooAsset/Runtime/BundleHandle/Operations/BHLoadAssetOperation.cs new file mode 100644 index 00000000..81d52bc7 --- /dev/null +++ b/Assets/YooAsset/Runtime/BundleHandle/Operations/BHLoadAssetOperation.cs @@ -0,0 +1,14 @@ + +namespace YooAsset +{ + /// + /// 加载单个资源操作的抽象基类 + /// + internal abstract class BHLoadAssetOperation : AsyncOperationBase + { + /// + /// 加载的资源对象 + /// + public UnityEngine.Object Result; + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Operations/FSLoadAssetOperation.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Operations/BHLoadAssetOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Operations/FSLoadAssetOperation.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Operations/BHLoadAssetOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/BundleHandle/Operations/BHLoadSceneOperation.cs b/Assets/YooAsset/Runtime/BundleHandle/Operations/BHLoadSceneOperation.cs new file mode 100644 index 00000000..166acd13 --- /dev/null +++ b/Assets/YooAsset/Runtime/BundleHandle/Operations/BHLoadSceneOperation.cs @@ -0,0 +1,19 @@ + +namespace YooAsset +{ + /// + /// 加载场景操作的抽象基类 + /// + internal abstract class BHLoadSceneOperation : AsyncOperationBase + { + /// + /// 加载的场景对象 + /// + public UnityEngine.SceneManagement.Scene Result; + + /// + /// 恢复挂起的场景加载 + /// + public abstract void ResumeLoad(); + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Operations/FSLoadSceneOperation.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Operations/BHLoadSceneOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Operations/FSLoadSceneOperation.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Operations/BHLoadSceneOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/BundleHandle/Operations/BHLoadSubAssetsOperation.cs b/Assets/YooAsset/Runtime/BundleHandle/Operations/BHLoadSubAssetsOperation.cs new file mode 100644 index 00000000..23ae464d --- /dev/null +++ b/Assets/YooAsset/Runtime/BundleHandle/Operations/BHLoadSubAssetsOperation.cs @@ -0,0 +1,14 @@ + +namespace YooAsset +{ + /// + /// 加载子资源操作的抽象基类 + /// + internal abstract class BHLoadSubAssetsOperation : AsyncOperationBase + { + /// + /// 加载的子资源对象集合 + /// + public UnityEngine.Object[] Result; + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Operations/FSLoadSubAssetsOperation.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Operations/BHLoadSubAssetsOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Operations/FSLoadSubAssetsOperation.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Operations/BHLoadSubAssetsOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services.meta b/Assets/YooAsset/Runtime/BundleHandle/Services.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/AssetBundleResult.cs b/Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/AssetBundleHandle.cs similarity index 56% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/AssetBundleResult.cs rename to Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/AssetBundleHandle.cs index abd271b9..866d6df4 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/AssetBundleResult.cs +++ b/Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/AssetBundleHandle.cs @@ -1,17 +1,20 @@ -using System.IO; +using System.IO; using UnityEngine; using UnityEngine.SceneManagement; namespace YooAsset { - internal class AssetBundleResult : IBundleResult + /// + /// AssetBundle资源包句柄 + /// + internal class AssetBundleHandle : IBundleHandle { private readonly string _bundleFilePath; private readonly PackageBundle _packageBundle; private readonly AssetBundle _assetBundle; private readonly Stream _managedStream; - public AssetBundleResult(string bundleFilePath, PackageBundle packageBundle, AssetBundle assetBundle, Stream managedStream) + public AssetBundleHandle(string bundleFilePath, PackageBundle packageBundle, AssetBundle assetBundle, Stream managedStream) { _bundleFilePath = bundleFilePath; _packageBundle = packageBundle; @@ -36,24 +39,24 @@ namespace YooAsset } } - public FSLoadAssetOperation LoadAssetAsync(AssetInfo assetInfo) + public BHLoadAssetOperation LoadAssetAsync(AssetInfo assetInfo) { - var operation = new AssetBundleLoadAssetOperation(_packageBundle, _assetBundle, assetInfo); + var operation = new ABHLoadAssetOperation(_packageBundle, _assetBundle, assetInfo); return operation; } - public FSLoadAllAssetsOperation LoadAllAssetsAsync(AssetInfo assetInfo) + public BHLoadAllAssetsOperation LoadAllAssetsAsync(AssetInfo assetInfo) { - var operation = new AssetBundleLoadAllAssetsOperation(_packageBundle, _assetBundle, assetInfo); + var operation = new ABHLoadAllAssetsOperation(_packageBundle, _assetBundle, assetInfo); return operation; } - public FSLoadSubAssetsOperation LoadSubAssetsAsync(AssetInfo assetInfo) + public BHLoadSubAssetsOperation LoadSubAssetsAsync(AssetInfo assetInfo) { - var operation = new AssetBundleLoadSubAssetsOperation(_packageBundle, _assetBundle, assetInfo); + var operation = new ABHLoadSubAssetsOperation(_packageBundle, _assetBundle, assetInfo); return operation; } - public FSLoadSceneOperation LoadSceneOperation(AssetInfo assetInfo, LoadSceneParameters loadParams, bool suspendLoad) + public BHLoadSceneOperation LoadSceneAsync(AssetInfo assetInfo, LoadSceneParameters loadSceneParams, bool suspendLoad) { - var operation = new AssetBundleLoadSceneOperation(assetInfo, loadParams, suspendLoad); + var operation = new ABHLoadSceneOperation(assetInfo, loadSceneParams, suspendLoad); return operation; } } diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/AssetBundleResult.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/AssetBundleHandle.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/AssetBundleResult.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/AssetBundleHandle.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations/AssetBundleLoadAllAssetsOperation.cs b/Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations/ABHLoadAllAssetsOperation.cs similarity index 78% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations/AssetBundleLoadAllAssetsOperation.cs rename to Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations/ABHLoadAllAssetsOperation.cs index f62c369a..7ac974d9 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations/AssetBundleLoadAllAssetsOperation.cs +++ b/Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations/ABHLoadAllAssetsOperation.cs @@ -1,8 +1,11 @@ -using UnityEngine; +using UnityEngine; namespace YooAsset { - internal class AssetBundleLoadAllAssetsOperation : FSLoadAllAssetsOperation + /// + /// AssetBundle的加载所有资源操作 + /// + internal class ABHLoadAllAssetsOperation : BHLoadAllAssetsOperation { protected enum ESteps { @@ -19,7 +22,7 @@ namespace YooAsset private AssetBundleRequest _request; private ESteps _steps = ESteps.None; - public AssetBundleLoadAllAssetsOperation(PackageBundle packageBundle, AssetBundle assetBundle, AssetInfo assetInfo) + public ABHLoadAllAssetsOperation(PackageBundle packageBundle, AssetBundle assetBundle, AssetInfo assetInfo) { _packageBundle = packageBundle; _assetBundle = assetBundle; @@ -39,8 +42,8 @@ namespace YooAsset if (_assetBundle == null) { _steps = ESteps.Done; - Error = $"The bundle {_packageBundle.BundleName} has been destroyed due to unity engine bugs."; Status = EOperationStatus.Failed; + Error = $"The bundle {_packageBundle.BundleName} has been destroyed due to Unity engine bugs."; return; } @@ -71,10 +74,11 @@ namespace YooAsset { if (_request != null) { + // 注意: 异步加载过程中,业务逻辑可能会强制转换为同步加载 if (IsWaitForCompletion) { // 强制挂起主线程(注意:该操作会很耗时) - YooLogger.Warning("Suspend the main thread to load unity asset."); + YooLogger.Warning("Suspending the main thread to load Unity asset."); Result = _request.allAssets; } else @@ -90,14 +94,14 @@ namespace YooAsset { string error; if (_assetInfo.AssetType == null) - error = $"Failed to load all assets : {_assetInfo.AssetPath} AssetType : null AssetBundle : {_packageBundle.BundleName}"; + error = $"Failed to load all assets: {_assetInfo.AssetPath} AssetType: null AssetBundle: {_packageBundle.BundleName}"; else - error = $"Failed to load all assets : {_assetInfo.AssetPath} AssetType : {_assetInfo.AssetType} AssetBundle : {_packageBundle.BundleName}"; - YooLogger.Error(error); - + error = $"Failed to load all assets: {_assetInfo.AssetPath} AssetType: {_assetInfo.AssetType} AssetBundle: {_packageBundle.BundleName}"; + _steps = ESteps.Done; - Error = error; Status = EOperationStatus.Failed; + Error = error; + YooLogger.Error(error); } else { diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations/AssetBundleLoadAllAssetsOperation.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations/ABHLoadAllAssetsOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations/AssetBundleLoadAllAssetsOperation.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations/ABHLoadAllAssetsOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations/AssetBundleLoadAssetOperation.cs b/Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations/ABHLoadAssetOperation.cs similarity index 79% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations/AssetBundleLoadAssetOperation.cs rename to Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations/ABHLoadAssetOperation.cs index a57e686c..b0d6d467 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations/AssetBundleLoadAssetOperation.cs +++ b/Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations/ABHLoadAssetOperation.cs @@ -1,8 +1,11 @@ -using UnityEngine; +using UnityEngine; namespace YooAsset { - internal class AssetBundleLoadAssetOperation : FSLoadAssetOperation + /// + /// AssetBundle的加载单个资源操作 + /// + internal class ABHLoadAssetOperation : BHLoadAssetOperation { protected enum ESteps { @@ -19,7 +22,7 @@ namespace YooAsset private AssetBundleRequest _request; private ESteps _steps = ESteps.None; - public AssetBundleLoadAssetOperation(PackageBundle packageBundle, AssetBundle assetBundle, AssetInfo assetInfo) + public ABHLoadAssetOperation(PackageBundle packageBundle, AssetBundle assetBundle, AssetInfo assetInfo) { _packageBundle = packageBundle; _assetBundle = assetBundle; @@ -39,8 +42,8 @@ namespace YooAsset if (_assetBundle == null) { _steps = ESteps.Done; - Error = $"The bundle {_packageBundle.BundleName} has been destroyed due to unity engine bugs."; Status = EOperationStatus.Failed; + Error = $"The bundle {_packageBundle.BundleName} has been destroyed due to Unity engine bugs."; return; } @@ -71,10 +74,11 @@ namespace YooAsset { if (_request != null) { + // 注意: 异步加载过程中,业务逻辑可能会强制转换为同步加载 if (IsWaitForCompletion) { // 强制挂起主线程(注意:该操作会很耗时) - YooLogger.Warning("Suspend the main thread to load unity asset."); + YooLogger.Warning("Suspending the main thread to load Unity asset."); Result = _request.asset; } else @@ -90,9 +94,9 @@ namespace YooAsset { string error; if (_assetInfo.AssetType == null) - error = $"Failed to load asset : {_assetInfo.AssetPath} AssetType : null AssetBundle : {_packageBundle.BundleName}"; + error = $"Failed to load asset: {_assetInfo.AssetPath} AssetType: null AssetBundle: {_packageBundle.BundleName}"; else - error = $"Failed to load asset : {_assetInfo.AssetPath} AssetType : {_assetInfo.AssetType} AssetBundle : {_packageBundle.BundleName}"; + error = $"Failed to load asset: {_assetInfo.AssetPath} AssetType: {_assetInfo.AssetType} AssetBundle: {_packageBundle.BundleName}"; _steps = ESteps.Done; Status = EOperationStatus.Failed; diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations/AssetBundleLoadAssetOperation.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations/ABHLoadAssetOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations/AssetBundleLoadAssetOperation.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations/ABHLoadAssetOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations/AssetBundleLoadSceneOperation.cs b/Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations/ABHLoadSceneOperation.cs similarity index 78% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations/AssetBundleLoadSceneOperation.cs rename to Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations/ABHLoadSceneOperation.cs index 994156d4..603077b5 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations/AssetBundleLoadSceneOperation.cs +++ b/Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations/ABHLoadSceneOperation.cs @@ -1,9 +1,12 @@ -using UnityEngine; +using UnityEngine; using UnityEngine.SceneManagement; namespace YooAsset { - internal class AssetBundleLoadSceneOperation : FSLoadSceneOperation + /// + /// AssetBundle的场景加载操作 + /// + internal class ABHLoadSceneOperation : BHLoadSceneOperation { protected enum ESteps { @@ -14,15 +17,15 @@ namespace YooAsset } private readonly AssetInfo _assetInfo; - private readonly LoadSceneParameters _loadParams; + private readonly LoadSceneParameters _loadSceneParams; private bool _suspendLoad; private AsyncOperation _asyncOperation; private ESteps _steps = ESteps.None; - public AssetBundleLoadSceneOperation(AssetInfo assetInfo, LoadSceneParameters loadParams, bool suspendLoad) + public ABHLoadSceneOperation(AssetInfo assetInfo, LoadSceneParameters loadSceneParams, bool suspendLoad) { _assetInfo = assetInfo; - _loadParams = loadParams; + _loadSceneParams = loadSceneParams; _suspendLoad = suspendLoad; } internal override void InternalStart() @@ -39,14 +42,14 @@ namespace YooAsset if (IsWaitForCompletion) { // 注意:场景同步加载方法不会立即加载场景,而是在下一帧加载。 - Result = SceneManager.LoadScene(_assetInfo.AssetPath, _loadParams); + Result = SceneManager.LoadScene(_assetInfo.AssetPath, _loadSceneParams); _steps = ESteps.CheckResult; } else { // 注意:如果场景不存在异步加载方法返回NULL // 注意:即使是异步加载也要在当帧获取到场景对象 - _asyncOperation = SceneManager.LoadSceneAsync(_assetInfo.AssetPath, _loadParams); + _asyncOperation = SceneManager.LoadSceneAsync(_assetInfo.AssetPath, _loadSceneParams); if (_asyncOperation != null) { _asyncOperation.allowSceneActivation = !_suspendLoad; @@ -56,11 +59,10 @@ namespace YooAsset } else { - string error = $"Failed to load scene : {_assetInfo.AssetPath}"; - YooLogger.Error(error); _steps = ESteps.Done; - Error = error; Status = EOperationStatus.Failed; + Error = $"Failed to load scene: {_assetInfo.AssetPath}"; + YooLogger.Error(Error); } } } @@ -71,8 +73,8 @@ namespace YooAsset { if (IsWaitForCompletion) { - //注意:场景加载无法强制异步转同步 - YooLogger.Error("The scene is loading asyn."); + // 注意:场景加载无法强制异步转同步 + YooLogger.Error("The scene is already loading asynchronously."); } else { @@ -96,11 +98,10 @@ namespace YooAsset } else { - string error = $"The loaded scene is invalid : {_assetInfo.AssetPath}"; - YooLogger.Error(error); _steps = ESteps.Done; - Error = error; Status = EOperationStatus.Failed; + Error = $"The loaded scene is invalid: {_assetInfo.AssetPath}"; + YooLogger.Error(Error); } } } @@ -109,7 +110,7 @@ namespace YooAsset //注意:场景加载不支持异步转同步,为了支持同步加载方法需要实现该方法! ExecuteOnce(); } - public override void UnSuspendLoad() + public override void ResumeLoad() { _suspendLoad = false; } diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations/AssetBundleLoadSceneOperation.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations/ABHLoadSceneOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations/AssetBundleLoadSceneOperation.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations/ABHLoadSceneOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations/AssetBundleLoadSubAssetsOperation.cs b/Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations/ABHLoadSubAssetsOperation.cs similarity index 79% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations/AssetBundleLoadSubAssetsOperation.cs rename to Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations/ABHLoadSubAssetsOperation.cs index 96b53336..8d814c30 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations/AssetBundleLoadSubAssetsOperation.cs +++ b/Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations/ABHLoadSubAssetsOperation.cs @@ -1,8 +1,11 @@ -using UnityEngine; +using UnityEngine; namespace YooAsset { - internal class AssetBundleLoadSubAssetsOperation : FSLoadSubAssetsOperation + /// + /// AssetBundle的加载子资源操作 + /// + internal class ABHLoadSubAssetsOperation : BHLoadSubAssetsOperation { protected enum ESteps { @@ -19,7 +22,7 @@ namespace YooAsset private AssetBundleRequest _request; private ESteps _steps = ESteps.None; - public AssetBundleLoadSubAssetsOperation(PackageBundle packageBundle, AssetBundle assetBundle, AssetInfo assetInfo) + public ABHLoadSubAssetsOperation(PackageBundle packageBundle, AssetBundle assetBundle, AssetInfo assetInfo) { _packageBundle = packageBundle; _assetBundle = assetBundle; @@ -39,8 +42,8 @@ namespace YooAsset if (_assetBundle == null) { _steps = ESteps.Done; - Error = $"The bundle {_packageBundle.BundleName} has been destroyed due to unity engine bugs."; Status = EOperationStatus.Failed; + Error = $"The bundle {_packageBundle.BundleName} has been destroyed due to Unity engine bugs."; return; } @@ -71,10 +74,11 @@ namespace YooAsset { if (_request != null) { + // 注意: 异步加载过程中,业务逻辑可能会强制转换为同步加载 if (IsWaitForCompletion) { // 强制挂起主线程(注意:该操作会很耗时) - YooLogger.Warning("Suspend the main thread to load unity asset."); + YooLogger.Warning("Suspending the main thread to load Unity asset."); Result = _request.allAssets; } else @@ -90,14 +94,14 @@ namespace YooAsset { string error; if (_assetInfo.AssetType == null) - error = $"Failed to load sub assets : {_assetInfo.AssetPath} AssetType : null AssetBundle : {_packageBundle.BundleName}"; + error = $"Failed to load sub-assets: {_assetInfo.AssetPath} AssetType: null AssetBundle: {_packageBundle.BundleName}"; else - error = $"Failed to load sub assets : {_assetInfo.AssetPath} AssetType : {_assetInfo.AssetType} AssetBundle : {_packageBundle.BundleName}"; - YooLogger.Error(error); + error = $"Failed to load sub-assets: {_assetInfo.AssetPath} AssetType: {_assetInfo.AssetType} AssetBundle: {_packageBundle.BundleName}"; _steps = ESteps.Done; - Error = error; Status = EOperationStatus.Failed; + Error = error; + YooLogger.Error(error); } else { diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations/AssetBundleLoadSubAssetsOperation.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations/ABHLoadSubAssetsOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/AssetBundleResult/Operations/AssetBundleLoadSubAssetsOperation.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/AssetBundleHandle/Operations/ABHLoadSubAssetsOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/BundleHandle/Services/InstantBundleHandle.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/InstantBundleHandle.meta new file mode 100644 index 00000000..fda1c481 --- /dev/null +++ b/Assets/YooAsset/Runtime/BundleHandle/Services/InstantBundleHandle.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: af833833252078e45866dd8e1e8299bb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/BundleHandle/Services/InstantBundleHandle/Operations.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/InstantBundleHandle/Operations.meta new file mode 100644 index 00000000..dfcc506b --- /dev/null +++ b/Assets/YooAsset/Runtime/BundleHandle/Services/InstantBundleHandle/Operations.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c9e4bd9d00f3b2d4482c97519523474d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations.meta diff --git a/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations/RBHLoadAllAssetsOperation.cs b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations/RBHLoadAllAssetsOperation.cs new file mode 100644 index 00000000..d247b3ca --- /dev/null +++ b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations/RBHLoadAllAssetsOperation.cs @@ -0,0 +1,18 @@ + +namespace YooAsset +{ + /// + /// 原生资源包的加载所有资源操作(不支持) + /// + internal class RBHLoadAllAssetsOperation : BHLoadAllAssetsOperation + { + internal override void InternalStart() + { + Status = EOperationStatus.Failed; + Error = $"{nameof(RBHLoadAllAssetsOperation)} does not support loading all assets."; + } + internal override void InternalUpdate() + { + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations/RawBundleLoadAllAssetsOperation.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations/RBHLoadAllAssetsOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations/RawBundleLoadAllAssetsOperation.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations/RBHLoadAllAssetsOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations/RawBundleLoadAssetOperation.cs b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations/RBHLoadAssetOperation.cs similarity index 79% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations/RawBundleLoadAssetOperation.cs rename to Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations/RBHLoadAssetOperation.cs index 5fd81496..4540335c 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations/RawBundleLoadAssetOperation.cs +++ b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations/RBHLoadAssetOperation.cs @@ -1,7 +1,10 @@ - + namespace YooAsset { - internal class RawBundleLoadAssetOperation : FSLoadAssetOperation + /// + /// 原生资源包的加载单个资源操作 + /// + internal class RBHLoadAssetOperation : BHLoadAssetOperation { protected enum ESteps { @@ -16,7 +19,7 @@ namespace YooAsset private readonly AssetInfo _assetInfo; private ESteps _steps = ESteps.None; - public RawBundleLoadAssetOperation(PackageBundle packageBundle, RawBundle rawBundle, AssetInfo assetInfo) + public RBHLoadAssetOperation(PackageBundle packageBundle, RawBundle rawBundle, AssetInfo assetInfo) { _packageBundle = packageBundle; _rawBundle = rawBundle; @@ -43,7 +46,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"Failed to load raw file object : {_assetInfo.AssetPath}"; + Error = $"Failed to load raw file object: {_assetInfo.AssetPath}"; YooLogger.Error(Error); } else diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations/RawBundleLoadAssetOperation.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations/RBHLoadAssetOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations/RawBundleLoadAssetOperation.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations/RBHLoadAssetOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations/RBHLoadSceneOperation.cs b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations/RBHLoadSceneOperation.cs new file mode 100644 index 00000000..c9f15904 --- /dev/null +++ b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations/RBHLoadSceneOperation.cs @@ -0,0 +1,21 @@ + +namespace YooAsset +{ + /// + /// 原生资源包的场景加载操作(不支持) + /// + internal class RBHLoadSceneOperation : BHLoadSceneOperation + { + internal override void InternalStart() + { + Status = EOperationStatus.Failed; + Error = $"{nameof(RBHLoadSceneOperation)} does not support loading scene."; + } + internal override void InternalUpdate() + { + } + public override void ResumeLoad() + { + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations/RawBundleLoadSceneOperation.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations/RBHLoadSceneOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations/RawBundleLoadSceneOperation.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations/RBHLoadSceneOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations/RBHLoadSubAssetsOperation.cs b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations/RBHLoadSubAssetsOperation.cs new file mode 100644 index 00000000..a859fc8a --- /dev/null +++ b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations/RBHLoadSubAssetsOperation.cs @@ -0,0 +1,18 @@ + +namespace YooAsset +{ + /// + /// 原生资源包的加载子资源操作(不支持) + /// + internal class RBHLoadSubAssetsOperation : BHLoadSubAssetsOperation + { + internal override void InternalStart() + { + Status = EOperationStatus.Failed; + Error = $"{nameof(RBHLoadSubAssetsOperation)} does not support loading sub-assets."; + } + internal override void InternalUpdate() + { + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations/RawBundleLoadSubAssetsOperation.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations/RBHLoadSubAssetsOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations/RawBundleLoadSubAssetsOperation.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/Operations/RBHLoadSubAssetsOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/RawBundle.cs b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/RawBundle.cs similarity index 75% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/RawBundle.cs rename to Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/RawBundle.cs index 216f7f04..338f39da 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/RawBundle.cs +++ b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/RawBundle.cs @@ -1,6 +1,9 @@ namespace YooAsset { + /// + /// 原生资源包 + /// public class RawBundle { private byte[] _data; @@ -18,6 +21,9 @@ namespace YooAsset return RawFileObject.Create(_data); } + /// + /// 卸载原生资源包数据 + /// public void Unload() { _data = null; diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/RawBundle.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/RawBundle.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/RawBundle.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/RawBundle.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/RawBundleResult.cs b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/RawBundleHandle.cs similarity index 51% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/RawBundleResult.cs rename to Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/RawBundleHandle.cs index e4728beb..19de445d 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/RawBundleResult.cs +++ b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/RawBundleHandle.cs @@ -1,14 +1,17 @@ -using UnityEngine.SceneManagement; +using UnityEngine.SceneManagement; namespace YooAsset { - internal class RawBundleResult : IBundleResult + /// + /// 原生资源包句柄 + /// + internal class RawBundleHandle : IBundleHandle { private readonly string _bundleFilePath; private readonly PackageBundle _packageBundle; private readonly RawBundle _rawBundle; - public RawBundleResult(string bundleFilePath, PackageBundle packageBundle, RawBundle rawBundle) + public RawBundleHandle(string bundleFilePath, PackageBundle packageBundle, RawBundle rawBundle) { _bundleFilePath = bundleFilePath; _packageBundle = packageBundle; @@ -26,24 +29,24 @@ namespace YooAsset } } - public FSLoadAssetOperation LoadAssetAsync(AssetInfo assetInfo) + public BHLoadAssetOperation LoadAssetAsync(AssetInfo assetInfo) { - var operation = new RawBundleLoadAssetOperation(_packageBundle, _rawBundle, assetInfo); + var operation = new RBHLoadAssetOperation(_packageBundle, _rawBundle, assetInfo); return operation; } - public FSLoadAllAssetsOperation LoadAllAssetsAsync(AssetInfo assetInfo) + public BHLoadAllAssetsOperation LoadAllAssetsAsync(AssetInfo assetInfo) { - var operation = new RawBundleLoadAllAssetsOperation(); + var operation = new RBHLoadAllAssetsOperation(); return operation; } - public FSLoadSubAssetsOperation LoadSubAssetsAsync(AssetInfo assetInfo) + public BHLoadSubAssetsOperation LoadSubAssetsAsync(AssetInfo assetInfo) { - var operation = new RawBundleLoadSubAssetsOperation(); + var operation = new RBHLoadSubAssetsOperation(); return operation; } - public FSLoadSceneOperation LoadSceneOperation(AssetInfo assetInfo, LoadSceneParameters loadParams, bool suspendLoad) + public BHLoadSceneOperation LoadSceneAsync(AssetInfo assetInfo, LoadSceneParameters loadSceneParams, bool suspendLoad) { - var operation = new RawBundleLoadSceneOperation(); + var operation = new RBHLoadSceneOperation(); return operation; } } diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/RawBundleResult.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/RawBundleHandle.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/RawBundleResult.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/RawBundleHandle.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/RawFileObject.cs b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/RawFileObject.cs similarity index 83% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/RawFileObject.cs rename to Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/RawFileObject.cs index c106f7eb..3fc8637f 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/RawFileObject.cs +++ b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/RawFileObject.cs @@ -11,8 +11,14 @@ namespace YooAsset private byte[] _fileData; private string _fileText; + /// + /// 原生文件的二进制数据 + /// public byte[] Data => _fileData; + /// + /// 原生文件的UTF-8文本内容 + /// public string Text { get diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/RawFileObject.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/RawFileObject.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/RawFileObject.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/RawBundleHandle/RawFileObject.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations/VirtualBundleLoadAllAssetsOperation.cs b/Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations/VBHLoadAllAssetsOperation.cs similarity index 83% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations/VirtualBundleLoadAllAssetsOperation.cs rename to Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations/VBHLoadAllAssetsOperation.cs index 616f7fa9..7174a47c 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations/VirtualBundleLoadAllAssetsOperation.cs +++ b/Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations/VBHLoadAllAssetsOperation.cs @@ -1,8 +1,11 @@ -using System.Collections.Generic; +using System.Collections.Generic; namespace YooAsset { - internal class VirtualBundleLoadAllAssetsOperation : FSLoadAllAssetsOperation + /// + /// 虚拟资源包的加载所有资源操作 + /// + internal class VBHLoadAllAssetsOperation : BHLoadAllAssetsOperation { protected enum ESteps { @@ -17,7 +20,7 @@ namespace YooAsset private readonly AssetInfo _assetInfo; private ESteps _steps = ESteps.None; - public VirtualBundleLoadAllAssetsOperation(PackageBundle packageBundle, AssetInfo assetInfo) + public VBHLoadAllAssetsOperation(PackageBundle packageBundle, AssetInfo assetInfo) { _packageBundle = packageBundle; _assetInfo = assetInfo; @@ -28,8 +31,8 @@ namespace YooAsset _steps = ESteps.CheckBundle; #else _steps = ESteps.Done; + Status = EOperationStatus.Failed; Error = $"{nameof(VirtualBundleLoadAllAssetsOperation)} only support unity editor platform."; - Status = EOperationStatus.Failed; #endif } internal override void InternalUpdate() @@ -44,11 +47,10 @@ namespace YooAsset string guid = UnityEditor.AssetDatabase.AssetPathToGUID(_assetInfo.AssetPath); if (string.IsNullOrEmpty(guid)) { - string error = $"Not found asset : {_assetInfo.AssetPath}"; - YooLogger.Error(error); _steps = ESteps.Done; - Error = error; Status = EOperationStatus.Failed; + Error = $"Asset not found: {_assetInfo.AssetPath}"; + YooLogger.Error(Error); return; } @@ -90,14 +92,14 @@ namespace YooAsset { string error; if (_assetInfo.AssetType == null) - error = $"Failed to load all assets : {_assetInfo.AssetPath} AssetType : null"; + error = $"Failed to load all assets: {_assetInfo.AssetPath} AssetType: null"; else - error = $"Failed to load all assets : {_assetInfo.AssetPath} AssetType : {_assetInfo.AssetType}"; - YooLogger.Error(error); + error = $"Failed to load all assets: {_assetInfo.AssetPath} AssetType: {_assetInfo.AssetType}"; _steps = ESteps.Done; - Error = error; Status = EOperationStatus.Failed; + Error = error; + YooLogger.Error(error); } else { diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations/VirtualBundleLoadAllAssetsOperation.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations/VBHLoadAllAssetsOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations/VirtualBundleLoadAllAssetsOperation.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations/VBHLoadAllAssetsOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations/VirtualBundleLoadAssetOperation.cs b/Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations/VBHLoadAssetOperation.cs similarity index 79% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations/VirtualBundleLoadAssetOperation.cs rename to Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations/VBHLoadAssetOperation.cs index 36a03589..00d181dc 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations/VirtualBundleLoadAssetOperation.cs +++ b/Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations/VBHLoadAssetOperation.cs @@ -1,7 +1,10 @@ - + namespace YooAsset { - internal class VirtualBundleLoadAssetOperation : FSLoadAssetOperation + /// + /// 虚拟资源包的加载单个资源操作 + /// + internal class VBHLoadAssetOperation : BHLoadAssetOperation { protected enum ESteps { @@ -16,7 +19,7 @@ namespace YooAsset private readonly AssetInfo _assetInfo; private ESteps _steps = ESteps.None; - public VirtualBundleLoadAssetOperation(PackageBundle packageBundle, AssetInfo assetInfo) + public VBHLoadAssetOperation(PackageBundle packageBundle, AssetInfo assetInfo) { _packageBundle = packageBundle; _assetInfo = assetInfo; @@ -27,8 +30,8 @@ namespace YooAsset _steps = ESteps.CheckBundle; #else _steps = ESteps.Done; + Status = EOperationStatus.Failed; Error = $"{nameof(VirtualBundleLoadAssetOperation)} only support unity editor platform."; - Status = EOperationStatus.Failed; #endif } internal override void InternalUpdate() @@ -43,11 +46,10 @@ namespace YooAsset string guid = UnityEditor.AssetDatabase.AssetPathToGUID(_assetInfo.AssetPath); if (string.IsNullOrEmpty(guid)) { - string error = $"Not found asset : {_assetInfo.AssetPath}"; - YooLogger.Error(error); _steps = ESteps.Done; - Error = error; Status = EOperationStatus.Failed; + Error = $"Asset not found: {_assetInfo.AssetPath}"; + YooLogger.Error(Error); return; } @@ -69,14 +71,14 @@ namespace YooAsset { string error; if (_assetInfo.AssetType == null) - error = $"Failed to load asset object : {_assetInfo.AssetPath} AssetType : null"; + error = $"Failed to load asset object: {_assetInfo.AssetPath} AssetType: null"; else - error = $"Failed to load asset object : {_assetInfo.AssetPath} AssetType : {_assetInfo.AssetType}"; - YooLogger.Error(error); + error = $"Failed to load asset object: {_assetInfo.AssetPath} AssetType: {_assetInfo.AssetType}"; _steps = ESteps.Done; - Error = error; Status = EOperationStatus.Failed; + Error = error; + YooLogger.Error(error); } else { diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations/VirtualBundleLoadAssetOperation.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations/VBHLoadAssetOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations/VirtualBundleLoadAssetOperation.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations/VBHLoadAssetOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations/VirtualBundleLoadSceneOperation.cs b/Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations/VBHLoadSceneOperation.cs similarity index 83% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations/VirtualBundleLoadSceneOperation.cs rename to Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations/VBHLoadSceneOperation.cs index 21ddc4ff..66e0bd54 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations/VirtualBundleLoadSceneOperation.cs +++ b/Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations/VBHLoadSceneOperation.cs @@ -1,9 +1,12 @@ -using UnityEngine; +using UnityEngine; using UnityEngine.SceneManagement; namespace YooAsset { - internal class VirtualBundleLoadSceneOperation : FSLoadSceneOperation + /// + /// 虚拟资源包的场景加载操作 + /// + internal class VBHLoadSceneOperation : BHLoadSceneOperation { protected enum ESteps { @@ -19,7 +22,7 @@ namespace YooAsset private AsyncOperation _asyncOperation; private ESteps _steps = ESteps.None; - public VirtualBundleLoadSceneOperation(AssetInfo assetInfo, LoadSceneParameters loadParams, bool suspendLoad) + public VBHLoadSceneOperation(AssetInfo assetInfo, LoadSceneParameters loadParams, bool suspendLoad) { _assetInfo = assetInfo; _loadParams = loadParams; @@ -31,8 +34,8 @@ namespace YooAsset _steps = ESteps.LoadScene; #else _steps = ESteps.Done; + Status = EOperationStatus.Failed; Error = $"{nameof(VirtualBundleLoadSceneOperation)} only support unity editor platform."; - Status = EOperationStatus.Failed; #endif } internal override void InternalUpdate() @@ -60,11 +63,10 @@ namespace YooAsset } else { - string error = $"Failed to load scene : {_assetInfo.AssetPath}"; - YooLogger.Error(error); _steps = ESteps.Done; - Error = error; Status = EOperationStatus.Failed; + Error = $"Failed to load scene: {_assetInfo.AssetPath}"; + YooLogger.Error(Error); return; } } @@ -77,7 +79,7 @@ namespace YooAsset if (IsWaitForCompletion) { // 注意:场景加载无法强制异步转同步 - YooLogger.Error("The scene is loading asyn."); + YooLogger.Error("The scene is already loading asynchronously."); } else { @@ -101,11 +103,10 @@ namespace YooAsset } else { - string error = $"The loaded scene is invalid : {_assetInfo.AssetPath}"; - YooLogger.Error(error); _steps = ESteps.Done; - Error = error; Status = EOperationStatus.Failed; + Error = $"The loaded scene is invalid: {_assetInfo.AssetPath}"; + YooLogger.Error(Error); } } #endif @@ -115,7 +116,7 @@ namespace YooAsset //注意:场景加载不支持异步转同步,为了支持同步加载方法需要实现该方法! ExecuteOnce(); } - public override void UnSuspendLoad() + public override void ResumeLoad() { _suspendLoad = false; } diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations/VirtualBundleLoadSceneOperation.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations/VBHLoadSceneOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations/VirtualBundleLoadSceneOperation.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations/VBHLoadSceneOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations/VirtualBundleLoadSubAssetsOperation.cs b/Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations/VBHLoadSubAssetsOperation.cs similarity index 81% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations/VirtualBundleLoadSubAssetsOperation.cs rename to Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations/VBHLoadSubAssetsOperation.cs index 87c1c2cf..80fe3f92 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations/VirtualBundleLoadSubAssetsOperation.cs +++ b/Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations/VBHLoadSubAssetsOperation.cs @@ -1,8 +1,11 @@ -using System.Collections.Generic; +using System.Collections.Generic; namespace YooAsset { - internal class VirtualBundleLoadSubAssetsOperation : FSLoadSubAssetsOperation + /// + /// 虚拟资源包的加载子资源操作 + /// + internal class VBHLoadSubAssetsOperation : BHLoadSubAssetsOperation { protected enum ESteps { @@ -17,7 +20,7 @@ namespace YooAsset private readonly AssetInfo _assetInfo; private ESteps _steps = ESteps.None; - public VirtualBundleLoadSubAssetsOperation(PackageBundle packageBundle, AssetInfo assetInfo) + public VBHLoadSubAssetsOperation(PackageBundle packageBundle, AssetInfo assetInfo) { _packageBundle = packageBundle; _assetInfo = assetInfo; @@ -28,8 +31,8 @@ namespace YooAsset _steps = ESteps.CheckBundle; #else _steps = ESteps.Done; + Status = EOperationStatus.Failed; Error = $"{nameof(VirtualBundleLoadSubAssetsOperation)} only support unity editor platform."; - Status = EOperationStatus.Failed; #endif } internal override void InternalUpdate() @@ -44,11 +47,10 @@ namespace YooAsset string guid = UnityEditor.AssetDatabase.AssetPathToGUID(_assetInfo.AssetPath); if (string.IsNullOrEmpty(guid)) { - string error = $"Not found asset : {_assetInfo.AssetPath}"; - YooLogger.Error(error); _steps = ESteps.Done; - Error = error; Status = EOperationStatus.Failed; + Error = $"Asset not found: {_assetInfo.AssetPath}"; + YooLogger.Error(Error); return; } @@ -81,14 +83,14 @@ namespace YooAsset { string error; if (_assetInfo.AssetType == null) - error = $"Failed to load sub assets : {_assetInfo.AssetPath} AssetType : null"; + error = $"Failed to load sub-assets: {_assetInfo.AssetPath} AssetType: null"; else - error = $"Failed to load sub assets : {_assetInfo.AssetPath} AssetType : {_assetInfo.AssetType}"; - YooLogger.Error(error); + error = $"Failed to load sub-assets: {_assetInfo.AssetPath} AssetType: {_assetInfo.AssetType}"; _steps = ESteps.Done; - Error = error; Status = EOperationStatus.Failed; + Error = error; + YooLogger.Error(error); } else { diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations/VirtualBundleLoadSubAssetsOperation.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations/VBHLoadSubAssetsOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/Operations/VirtualBundleLoadSubAssetsOperation.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/Operations/VBHLoadSubAssetsOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/VirtualBundleHandle.cs b/Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/VirtualBundleHandle.cs new file mode 100644 index 00000000..4cb81d91 --- /dev/null +++ b/Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/VirtualBundleHandle.cs @@ -0,0 +1,47 @@ +using UnityEngine.SceneManagement; + +namespace YooAsset +{ + /// + /// 虚拟资源包句柄 + /// + internal class VirtualBundleHandle : IBundleHandle + { + private readonly string _bundleFilePath; + private readonly PackageBundle _packageBundle; + + public VirtualBundleHandle(string bundleFilePath, PackageBundle bundle) + { + _bundleFilePath = bundleFilePath; + _packageBundle = bundle; + } + public void UnloadBundleFile() + { + } + public string GetBundleFilePath() + { + return _bundleFilePath; + } + + public BHLoadAssetOperation LoadAssetAsync(AssetInfo assetInfo) + { + var operation = new VBHLoadAssetOperation(_packageBundle, assetInfo); + return operation; + } + public BHLoadAllAssetsOperation LoadAllAssetsAsync(AssetInfo assetInfo) + { + var operation = new VBHLoadAllAssetsOperation(_packageBundle, assetInfo); + return operation; + } + public BHLoadSubAssetsOperation LoadSubAssetsAsync(AssetInfo assetInfo) + { + var operation = new VBHLoadSubAssetsOperation(_packageBundle, assetInfo); + return operation; + } + public BHLoadSceneOperation LoadSceneAsync(AssetInfo assetInfo, LoadSceneParameters loadSceneParams, bool suspendLoad) + { + var operation = new VBHLoadSceneOperation(assetInfo, loadSceneParams, suspendLoad); + return operation; + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/VirtualBundleResult.cs.meta b/Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/VirtualBundleHandle.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/VirtualBundleResult.cs.meta rename to Assets/YooAsset/Runtime/BundleHandle/Services/VirtualBundleHandle/VirtualBundleHandle.cs.meta diff --git a/Assets/YooAsset/Runtime/DiagnosticSystem/DiagnosticBehaviour.cs b/Assets/YooAsset/Runtime/DiagnosticSystem/DiagnosticBehaviour.cs index a7d23349..15f3c713 100644 --- a/Assets/YooAsset/Runtime/DiagnosticSystem/DiagnosticBehaviour.cs +++ b/Assets/YooAsset/Runtime/DiagnosticSystem/DiagnosticBehaviour.cs @@ -31,7 +31,7 @@ namespace YooAsset private void OnEnable() { #if UNITY_EDITOR - MockPlayerConnection.Instance.Register(DiagnosticSystemDefine.EditorToPlayerMessageId, HandleEditorMessage); + MockPlayerConnection.Instance.Register(DiagnosticSystemConsts.EditorToPlayerMessageId, HandleEditorMessage); #else PlayerConnection.instance.Register(DiagnosticSystemDefine.EditorToPlayerMessageId, HandleEditorMessage); #endif @@ -39,7 +39,7 @@ namespace YooAsset private void OnDisable() { #if UNITY_EDITOR - MockPlayerConnection.Instance.Unregister(DiagnosticSystemDefine.EditorToPlayerMessageId, HandleEditorMessage); + MockPlayerConnection.Instance.Unregister(DiagnosticSystemConsts.EditorToPlayerMessageId, HandleEditorMessage); #else PlayerConnection.instance.Unregister(DiagnosticSystemDefine.EditorToPlayerMessageId, HandleEditorMessage); #endif @@ -53,7 +53,7 @@ namespace YooAsset var data = DiagnosticReport.Serialize(debugReport); #if UNITY_EDITOR - MockPlayerConnection.Instance.Send(DiagnosticSystemDefine.PlayerToEditorMessageId, data); + MockPlayerConnection.Instance.Send(DiagnosticSystemConsts.PlayerToEditorMessageId, data); #else PlayerConnection.instance.Send(DiagnosticSystemDefine.PlayerToEditorMessageId, data); #endif diff --git a/Assets/YooAsset/Runtime/DiagnosticSystem/DiagnosticReport/DiagnosticReport.cs b/Assets/YooAsset/Runtime/DiagnosticSystem/DiagnosticReport/DiagnosticReport.cs index 1c545842..17c0f343 100644 --- a/Assets/YooAsset/Runtime/DiagnosticSystem/DiagnosticReport/DiagnosticReport.cs +++ b/Assets/YooAsset/Runtime/DiagnosticSystem/DiagnosticReport/DiagnosticReport.cs @@ -34,7 +34,7 @@ namespace YooAsset public static DiagnosticReport Create() { var report = new DiagnosticReport(); - report.ProtocolVersion = DiagnosticSystemDefine.ProtocolVersion; + report.ProtocolVersion = DiagnosticSystemConsts.ProtocolVersion; report.FrameCount = Time.frameCount; return report; } diff --git a/Assets/YooAsset/Runtime/DiagnosticSystem/DiagnosticSystemDefine.cs b/Assets/YooAsset/Runtime/DiagnosticSystem/DiagnosticSystemConsts.cs similarity index 94% rename from Assets/YooAsset/Runtime/DiagnosticSystem/DiagnosticSystemDefine.cs rename to Assets/YooAsset/Runtime/DiagnosticSystem/DiagnosticSystemConsts.cs index 6e52e147..00831632 100644 --- a/Assets/YooAsset/Runtime/DiagnosticSystem/DiagnosticSystemDefine.cs +++ b/Assets/YooAsset/Runtime/DiagnosticSystem/DiagnosticSystemConsts.cs @@ -5,7 +5,7 @@ namespace YooAsset /// /// 诊断系统的常量定义 /// - internal class DiagnosticSystemDefine + internal class DiagnosticSystemConsts { /// /// 通信协议版本号 diff --git a/Assets/YooAsset/Runtime/DiagnosticSystem/DiagnosticSystemDefine.cs.meta b/Assets/YooAsset/Runtime/DiagnosticSystem/DiagnosticSystemConsts.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/DiagnosticSystem/DiagnosticSystemDefine.cs.meta rename to Assets/YooAsset/Runtime/DiagnosticSystem/DiagnosticSystemConsts.cs.meta diff --git a/Assets/YooAsset/Runtime/DownloadSystem/DownloadFailureCounter.cs b/Assets/YooAsset/Runtime/DownloadSystem/DownloadFailureCounter.cs deleted file mode 100644 index 8031d8bf..00000000 --- a/Assets/YooAsset/Runtime/DownloadSystem/DownloadFailureCounter.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System.Collections.Generic; - -namespace YooAsset -{ - /// - /// 网络请求失败计数器(诊断用) - /// - /// - /// 线程安全:内部使用 Dictionary 且未加锁,约定只在 Unity 主线程调用。 - /// 如需在多线程/回调线程调用,请在外层加锁或改为并发容器实现。 - /// - internal class DownloadFailureCounter - { -#if UNITY_EDITOR - [UnityEngine.RuntimeInitializeOnLoadMethod(UnityEngine.RuntimeInitializeLoadType.SubsystemRegistration)] - private static void OnRuntimeInitialize() - { - _failureRecords.Clear(); - } -#endif - - /// - /// 失败计数记录表 - /// - /// - /// Key 格式:$"{packageName}_{eventName}" - /// - private static readonly Dictionary _failureRecords = new Dictionary(1000); - - /// - /// 记录一次失败 - /// - /// 资源包名称 - /// 事件名称 - public static void RecordFailure(string packageName, string eventName) - { - string key = $"{packageName}_{eventName}"; - if (_failureRecords.ContainsKey(key) == false) - _failureRecords.Add(key, 0); - _failureRecords[key]++; - } - - /// - /// 获取失败次数 - /// - /// 资源包名称 - /// 事件名称 - /// 失败次数,如果未记录过则返回 0 - public static int GetFailureCount(string packageName, string eventName) - { - string key = $"{packageName}_{eventName}"; - if (_failureRecords.TryGetValue(key, out int count)) - return count; - return 0; - } - } -} diff --git a/Assets/YooAsset/Runtime/DownloadSystem/DownloadReport.cs b/Assets/YooAsset/Runtime/DownloadSystem/DownloadReport.cs new file mode 100644 index 00000000..c422b721 --- /dev/null +++ b/Assets/YooAsset/Runtime/DownloadSystem/DownloadReport.cs @@ -0,0 +1,38 @@ + +namespace YooAsset +{ + public struct DownloadReport + { + /// + /// HTTP 返回码 + /// + public long HttpCode { get; set; } + + /// + /// HTTP 错误信息 + /// + public string HttpError { get; set; } + + /// + /// 当前下载的字节数 + /// + public long DownloadedBytes { get; set; } + + /// + /// 当前下载进度(0f - 1f) + /// + public float DownloadProgress { get; set; } + + /// + /// 创建默认的下载进度实例 + /// + public static DownloadReport Default + { + get + { + var result = new DownloadReport(); + return result; + } + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/DownloadStatus.cs.meta b/Assets/YooAsset/Runtime/DownloadSystem/DownloadReport.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/ResourceManager/DownloadStatus.cs.meta rename to Assets/YooAsset/Runtime/DownloadSystem/DownloadReport.cs.meta diff --git a/Assets/YooAsset/Runtime/DownloadSystem/DownloadRetry.cs b/Assets/YooAsset/Runtime/DownloadSystem/DownloadRetry.cs new file mode 100644 index 00000000..cecd124e --- /dev/null +++ b/Assets/YooAsset/Runtime/DownloadSystem/DownloadRetry.cs @@ -0,0 +1,93 @@ +using UnityEngine; + +namespace YooAsset +{ + /// + /// 下载重试控制器 + /// + internal sealed class DownloadRetry + { + private readonly int _maxRetryCount; + private readonly IDownloadRetryPolicy _retryPolicy; + private int _retryCount; + private float _waitTimer; + private float _waitDuration; + + /// + /// 已重试次数 + /// + public int RetryCount => _retryCount; + + /// + /// 当前等待目标时长(秒) + /// + public float WaitDuration => _waitDuration; + + /// + /// 创建下载重试控制器 + /// + /// 最大重试次数 + /// 重试策略 + public DownloadRetry(int maxRetryCount, IDownloadRetryPolicy retryPolicy) + { + _maxRetryCount = maxRetryCount; + _retryPolicy = retryPolicy; + _retryCount = 0; + _waitTimer = 0f; + _waitDuration = 0f; + } + + /// + /// 判断本次失败是否允许重试 + /// + /// 请求地址 + /// HTTP 状态码 + /// HTTP 错误信息 + /// + /// 返回 true 表示允许重试;调用方应紧接着调用 BeginWait() 启动等待。 + /// 返回 false 表示不允许重试(达到次数上限或错误不可重试)。 + /// + public bool CanRetry(string url, long httpCode, string httpError) + { + if (_retryCount >= _maxRetryCount) + return false; + + if (_retryPolicy.IsRetryableError(url, httpCode, httpError) == false) + return false; + + YooLogger.Warning($"Download failed: {url}. HttpCode={httpCode}"); + return true; + } + + /// + /// 判断是否可以进入网络重试 + /// + public bool CanRetry() + { + if (_retryCount >= _maxRetryCount) + return false; + + return true; + } + + /// + /// 开始本次重试等待 + /// + public void BeginWait() + { + _waitTimer = 0f; + _retryCount++; + _waitDuration = _retryPolicy.ComputeDelay(_retryCount, _waitDuration); + YooLogger.Warning($"Download retrying in {WaitDuration:F1}s."); + } + + /// + /// 推进等待计时 + /// + public bool Tick() + { + _waitTimer += Time.unscaledDeltaTime; + return _waitTimer >= _waitDuration; + } + } +} diff --git a/Assets/YooAsset/Runtime/DownloadSystem/DownloadFailureCounter.cs.meta b/Assets/YooAsset/Runtime/DownloadSystem/DownloadRetry.cs.meta similarity index 83% rename from Assets/YooAsset/Runtime/DownloadSystem/DownloadFailureCounter.cs.meta rename to Assets/YooAsset/Runtime/DownloadSystem/DownloadRetry.cs.meta index 394f817d..d636a5b8 100644 --- a/Assets/YooAsset/Runtime/DownloadSystem/DownloadFailureCounter.cs.meta +++ b/Assets/YooAsset/Runtime/DownloadSystem/DownloadRetry.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: ca9b2c6456d21bb4e9eecd9dc820a641 +guid: 37c93b71779bcdf4da4005128e2cc6b8 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/YooAsset/Runtime/DownloadSystem/Interfaces/IDownloadRequest.cs b/Assets/YooAsset/Runtime/DownloadSystem/Interfaces/IDownloadRequest.cs index 0e13b847..dbaef0b0 100644 --- a/Assets/YooAsset/Runtime/DownloadSystem/Interfaces/IDownloadRequest.cs +++ b/Assets/YooAsset/Runtime/DownloadSystem/Interfaces/IDownloadRequest.cs @@ -42,10 +42,15 @@ namespace YooAsset /// HTTP 返回码 /// /// - /// 非 HTTP 协议可返回 0。使用 long 类型以兼容各种协议的返回码。 + /// 非 HTTP 协议可返回 0 /// long HttpCode { get; } + /// + /// HTTP 错误信息 + /// + string HttpError { get; } + /// /// 错误信息 /// diff --git a/Assets/YooAsset/Runtime/DownloadSystem/Operations/DownloadFileBaseOperation.cs b/Assets/YooAsset/Runtime/DownloadSystem/Operations/DownloadFileBaseOperation.cs index 18fd6595..e96b0dad 100644 --- a/Assets/YooAsset/Runtime/DownloadSystem/Operations/DownloadFileBaseOperation.cs +++ b/Assets/YooAsset/Runtime/DownloadSystem/Operations/DownloadFileBaseOperation.cs @@ -1,4 +1,4 @@ - + namespace YooAsset { internal abstract class DownloadFileBaseOperation : AsyncOperationBase @@ -13,21 +13,16 @@ namespace YooAsset /// public readonly string Url; - /// - /// 下载进度 - /// - public float DownloadProgress { get; protected set; } - - /// - /// 下载字节 - /// - public long DownloadedBytes { get; protected set; } - /// /// 引用计数 /// public int RefCount { private set; get; } + /// + /// 下载报告 + /// + public DownloadReport Report; + public DownloadFileBaseOperation(PackageBundle bundle, string url) { Bundle = bundle; @@ -35,7 +30,7 @@ namespace YooAsset } internal override string InternalGetDescription() { - return $"RefCount : {RefCount}"; + return $"RefCount: {RefCount}"; } /// diff --git a/Assets/YooAsset/Runtime/DownloadSystem/Operations/DownloadSchedulerOperation.cs b/Assets/YooAsset/Runtime/DownloadSystem/Operations/DownloadSchedulerOperation.cs index 7680a16d..82a8272e 100644 --- a/Assets/YooAsset/Runtime/DownloadSystem/Operations/DownloadSchedulerOperation.cs +++ b/Assets/YooAsset/Runtime/DownloadSystem/Operations/DownloadSchedulerOperation.cs @@ -9,7 +9,7 @@ namespace YooAsset /// /// 管理所有活跃的下载任务,控制并发数量。 /// - internal class DownloadSchedulerOperation : AsyncOperationBase, IDisposable + internal class DownloadSchedulerOperation : AsyncOperationBase { public struct SchedulerConfig { @@ -44,9 +44,6 @@ namespace YooAsset } } - /// - /// 构造下载中心 - /// public DownloadSchedulerOperation(SchedulerConfig config) { _config = config; @@ -125,19 +122,6 @@ namespace YooAsset return _config.SchedulerName; } - /// - /// 释放下载资源 - /// - public void Dispose() - { - foreach (var valuePair in _downloaders) - { - var operation = valuePair.Value; - operation.AbortOperation(); - } - _downloaders.Clear(); - } - /// /// 尝试获取已经存在的下载器 /// diff --git a/Assets/YooAsset/Runtime/DownloadSystem/Services/DownloadPolicy.meta b/Assets/YooAsset/Runtime/DownloadSystem/Services/DownloadPolicy.meta new file mode 100644 index 00000000..b4a1ff2a --- /dev/null +++ b/Assets/YooAsset/Runtime/DownloadSystem/Services/DownloadPolicy.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4446775dfbf483f46a5edc74890a8245 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/DownloadSystem/Services/DownloadPolicy/DefaultDownloadRetryPolicy.cs b/Assets/YooAsset/Runtime/DownloadSystem/Services/DownloadPolicy/DefaultDownloadRetryPolicy.cs new file mode 100644 index 00000000..fae5dccc --- /dev/null +++ b/Assets/YooAsset/Runtime/DownloadSystem/Services/DownloadPolicy/DefaultDownloadRetryPolicy.cs @@ -0,0 +1,53 @@ +using UnityEngine; + +namespace YooAsset +{ + /// + /// 默认的下载重试策略 + /// + public class DefaultDownloadRetryPolicy : IDownloadRetryPolicy + { + private const float BaseDelay = 1f; + private const float MaxDelay = 10f; + + /// + /// 判断本次下载失败是否属于可重试的错误 + /// + public bool IsRetryableError(string url, long httpCode, string httpError) + { + // HTTP 状态码 + // 1xx 信息响应 + // 2xx 成功响应 + // 3xx 重定向消息 + // 4xx 客户端错误响应 + // 5xx 服务器错误响应 + + // 本地协议/本地路径不可重试 + if (DownloadSystemTools.IsLocalFileUrl(url)) + return false; + + // 网络瞬断可重试 + if (httpCode == 0) + return true; + + // 4xx 客户端错误不可重试 + // 例外:408 Request Timeout + // 例外:416 Range Not Satisfiable + // 例外:429 Too Many Requests + if (httpCode >= 400 && httpCode < 500) + return httpCode == 408 || httpCode == 416 || httpCode == 429; + + // 其它情况可重试 + return true; + } + + /// + /// 计算本次重试应等待的时长(秒) + /// 线性退避:每次在上一次基础上 +1 秒,封顶到最大等待秒数。 + /// + public float ComputeDelay(int retryCount, float previousDelay) + { + return Mathf.Clamp(previousDelay + 1f, BaseDelay, MaxDelay); + } + } +} diff --git a/Assets/YooAsset/Runtime/DownloadSystem/Services/DownloadPolicy/DefaultDownloadRetryPolicy.cs.meta b/Assets/YooAsset/Runtime/DownloadSystem/Services/DownloadPolicy/DefaultDownloadRetryPolicy.cs.meta new file mode 100644 index 00000000..3762e19d --- /dev/null +++ b/Assets/YooAsset/Runtime/DownloadSystem/Services/DownloadPolicy/DefaultDownloadRetryPolicy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2a84bce9bf9030645b7241a581a05af6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/DownloadSystem/Services/DownloadPolicy/DefaultDownloadURLPolicy.cs b/Assets/YooAsset/Runtime/DownloadSystem/Services/DownloadPolicy/DefaultDownloadURLPolicy.cs new file mode 100644 index 00000000..d0bc8817 --- /dev/null +++ b/Assets/YooAsset/Runtime/DownloadSystem/Services/DownloadPolicy/DefaultDownloadURLPolicy.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; + +namespace YooAsset +{ + /// + /// 默认的 URL 选择策略 + /// + public class DefaultDownloadURLPolicy : IDownloadURLPolicy + { + private int _failureCount = 0; + + /// + /// 基于内部失败计数轮转选择 URL + /// + public string SelectURL(IReadOnlyList candidateURLs) + { + int index = _failureCount % candidateURLs.Count; + return candidateURLs[index]; + } + + /// + /// 请求成功反馈(默认策略不做处理) + /// + public void OnSuccess(string url) + { + } + + /// + /// 请求失败反馈,递增失败计数以切换 URL + /// + public void OnFailure(string url, long httpCode, string httpError) + { + _failureCount++; + } + } +} diff --git a/Assets/YooAsset/Runtime/DownloadSystem/Services/DownloadPolicy/DefaultDownloadURLPolicy.cs.meta b/Assets/YooAsset/Runtime/DownloadSystem/Services/DownloadPolicy/DefaultDownloadURLPolicy.cs.meta new file mode 100644 index 00000000..c3a7b6a4 --- /dev/null +++ b/Assets/YooAsset/Runtime/DownloadSystem/Services/DownloadPolicy/DefaultDownloadURLPolicy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 747ba5d3c490c8043b61bbef89fd049c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/DownloadSystem/Services/UnityWebRequest/SimulatedFileRequest.cs b/Assets/YooAsset/Runtime/DownloadSystem/Services/UnityWebRequest/SimulatedFileRequest.cs index 5842e8ce..fb09c347 100644 --- a/Assets/YooAsset/Runtime/DownloadSystem/Services/UnityWebRequest/SimulatedFileRequest.cs +++ b/Assets/YooAsset/Runtime/DownloadSystem/Services/UnityWebRequest/SimulatedFileRequest.cs @@ -69,6 +69,11 @@ namespace YooAsset /// public long HttpCode { get; private set; } + /// + /// HTTP 错误信息 + /// + public string HttpError { get; private set; } + /// /// 错误信息 /// diff --git a/Assets/YooAsset/Runtime/DownloadSystem/Services/UnityWebRequest/UnityWebRequestBase.cs b/Assets/YooAsset/Runtime/DownloadSystem/Services/UnityWebRequest/UnityWebRequestBase.cs index 8946c5ea..4abeda97 100644 --- a/Assets/YooAsset/Runtime/DownloadSystem/Services/UnityWebRequest/UnityWebRequestBase.cs +++ b/Assets/YooAsset/Runtime/DownloadSystem/Services/UnityWebRequest/UnityWebRequestBase.cs @@ -86,6 +86,11 @@ namespace YooAsset /// public long HttpCode { get; private set; } + /// + /// HTTP 错误信息 + /// + public string HttpError { get; private set; } + /// /// 错误信息 /// @@ -255,6 +260,8 @@ namespace YooAsset return; HttpCode = _webRequest.responseCode; + HttpError = _webRequest.error; + #if UNITY_2020_3_OR_NEWER bool isSuccess = _webRequest.result == UnityWebRequest.Result.Success; #else @@ -269,7 +276,7 @@ namespace YooAsset else { Status = EDownloadRequestStatus.Failed; - Error = $"[{GetType().Name}] Request failed. URL: {Url}, Error: {_webRequest.error}"; + Error = $"[{GetType().Name}] Request failed. URL: {Url}, HttpCode={HttpCode} HttpError={HttpError}"; OnRequestFailed(); } diff --git a/Assets/YooAsset/Runtime/FileCache/Interfaces/IFileCache.cs b/Assets/YooAsset/Runtime/FileCache/Interfaces/IFileCache.cs index 607ef613..72748b67 100644 --- a/Assets/YooAsset/Runtime/FileCache/Interfaces/IFileCache.cs +++ b/Assets/YooAsset/Runtime/FileCache/Interfaces/IFileCache.cs @@ -47,7 +47,7 @@ namespace YooAsset /// /// 清理缓存文件 /// - FCClearCacheOperation ClearCacheAsync(ClearCacheOptions options); + FCClearCacheOperation ClearCacheAsync(FCClearCacheOptions options); /// /// 验证缓存文件 diff --git a/Assets/YooAsset/Runtime/FileCache/Operations/Common/LoadLocalAssetBundleOperation.cs b/Assets/YooAsset/Runtime/FileCache/Operations/Common/LoadLocalAssetBundleOperation.cs index 3760568d..1e3b86cc 100644 --- a/Assets/YooAsset/Runtime/FileCache/Operations/Common/LoadLocalAssetBundleOperation.cs +++ b/Assets/YooAsset/Runtime/FileCache/Operations/Common/LoadLocalAssetBundleOperation.cs @@ -1,4 +1,4 @@ -using System.IO; +using System.IO; using UnityEngine; namespace YooAsset @@ -74,7 +74,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"{_options.CacheName} not support {decryptor.GetType().Name}"; + Error = $"{_options.CacheName} does not support {decryptor.GetType().Name}"; return; } @@ -94,6 +94,7 @@ namespace YooAsset { if (_createRequest != null) { + // 注意: 异步加载过程中,业务逻辑可能会强制转换为同步加载 if (IsWaitForCompletion) { // 强制挂起主线程(注意:该操作会很耗时) @@ -120,7 +121,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Succeeded; - BundleResult = new AssetBundleResult(_options.FilePath, _options.Bundle, _assetBundle, _loadStream); + BundleHandle = new AssetBundleHandle(_options.FilePath, _options.Bundle, _assetBundle, _loadStream); } } } diff --git a/Assets/YooAsset/Runtime/FileCache/Operations/Common/LoadLocalRawBundleOperation.cs b/Assets/YooAsset/Runtime/FileCache/Operations/Common/LoadLocalRawBundleOperation.cs index 956b5485..ba0f8a5e 100644 --- a/Assets/YooAsset/Runtime/FileCache/Operations/Common/LoadLocalRawBundleOperation.cs +++ b/Assets/YooAsset/Runtime/FileCache/Operations/Common/LoadLocalRawBundleOperation.cs @@ -37,11 +37,11 @@ namespace YooAsset { if (_options.Bundle.IsEncrypted == false) { - if (SupportsFileIO(_options.FilePath) == false) + if (FileUtility.SupportsFileIO(_options.FilePath) == false) { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"FileIO not supported for builtin path : {_options.FilePath}"; + Error = $"FileIO is not supported for builtin path: {_options.FilePath}"; return; } @@ -67,7 +67,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"{_options.CacheName} not support {decryptor.GetType().Name}"; + Error = $"{_options.CacheName} does not support {decryptor.GetType().Name}"; return; } @@ -95,7 +95,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Succeeded; - BundleResult = new RawBundleResult(_options.FilePath, _options.Bundle, _rawBundle); + BundleHandle = new RawBundleHandle(_options.FilePath, _options.Bundle, _rawBundle); } } } diff --git a/Assets/YooAsset/Runtime/FileCache/Operations/Common/LoadWebAssetBundleOperation.cs b/Assets/YooAsset/Runtime/FileCache/Operations/Common/LoadWebAssetBundleOperation.cs index 9590b26c..2ad97daa 100644 --- a/Assets/YooAsset/Runtime/FileCache/Operations/Common/LoadWebAssetBundleOperation.cs +++ b/Assets/YooAsset/Runtime/FileCache/Operations/Common/LoadWebAssetBundleOperation.cs @@ -1,4 +1,4 @@ -using UnityEngine; +using UnityEngine; namespace YooAsset { @@ -24,18 +24,16 @@ namespace YooAsset } protected readonly LoadWebAssetBundleOptions _options; + private readonly DownloadRetry _downloadRetry; private IDownloadAssetBundleRequest _downloadAssetBundleRequest; private ESteps _steps = ESteps.None; - // 失败重试 - private int _requestCount = 0; - private float _tryAgainTimer = 0; - private int _failedTryAgain; - public LoadWebNormalAssetBundleOperation(LoadWebAssetBundleOptions options) { _options = options; - _failedTryAgain = int.MaxValue; //注意:网络原因失败后,重新尝试直到成功 + + // 注意:网络原因失败后,重新尝试直到成功 + _downloadRetry = new DownloadRetry(int.MaxValue, options.RetryPolicy); } internal override void InternalStart() { @@ -63,6 +61,7 @@ namespace YooAsset if (_downloadAssetBundleRequest.Status == EDownloadRequestStatus.Succeeded) { + _options.URLPolicy.OnSuccess(_downloadAssetBundleRequest.Url); var assetBundle = _downloadAssetBundleRequest.Result; if (assetBundle == null) { @@ -74,13 +73,18 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Succeeded; - BundleResult = new AssetBundleResult(_downloadAssetBundleRequest.Url, _options.Bundle, assetBundle, null); + BundleHandle = new AssetBundleHandle(_downloadAssetBundleRequest.Url, _options.Bundle, assetBundle, null); } } else { - if (_failedTryAgain > 0 && IsRetryableError(_downloadAssetBundleRequest.HttpCode)) + string url = _downloadAssetBundleRequest.Url; + long httpCode = _downloadAssetBundleRequest.HttpCode; + string httpError = _downloadAssetBundleRequest.HttpError; + _options.URLPolicy.OnFailure(url, httpCode, httpError); + if (IsWaitForCompletion == false && _downloadRetry.CanRetry(url, httpCode, httpError)) { + _downloadRetry.BeginWait(); _steps = ESteps.TryAgain; } else @@ -101,11 +105,8 @@ namespace YooAsset _downloadAssetBundleRequest = null; } - _tryAgainTimer += UnityEngine.Time.unscaledDeltaTime; - if (_tryAgainTimer > 1f) + if (_downloadRetry.Tick()) { - _tryAgainTimer = 0f; - _failedTryAgain--; Progress = 0f; _steps = ESteps.BundleRequest; } @@ -122,12 +123,7 @@ namespace YooAsset private string GetRequestURL() { - // 轮流返回请求地址 - _requestCount++; - if (_requestCount % 2 == 0) - return _options.FallbackURL; - else - return _options.MainURL; + return _options.URLPolicy.SelectURL(_options.CandidateURLs); } } @@ -149,20 +145,18 @@ namespace YooAsset } protected readonly LoadWebAssetBundleOptions _options; + private readonly DownloadRetry _downloadRetry; private IDownloadBytesRequest _downloadBytesRequest; private IBundleMemoryDecryptor _decryptor; private AssetBundleCreateRequest _createRequest; private ESteps _steps = ESteps.None; - // 失败重试 - private int _requestCount = 0; - private float _tryAgainTimer = 0; - private int _failedTryAgain; - public LoadWebEncryptedAssetBundleOperation(LoadWebAssetBundleOptions options) { _options = options; - _failedTryAgain = int.MaxValue; //注意:网络原因失败后,重新尝试直到成功 + + // 注意:网络原因失败后,重新尝试直到成功 + _downloadRetry = new DownloadRetry(int.MaxValue, options.RetryPolicy); } internal override void InternalStart() { @@ -197,7 +191,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"{_options.CacheName} not support {decryptor.GetType().Name}"; + Error = $"{_options.CacheName} does not support {decryptor.GetType().Name}"; return; } } @@ -210,12 +204,18 @@ namespace YooAsset if (_downloadBytesRequest.Status == EDownloadRequestStatus.Succeeded) { + _options.URLPolicy.OnSuccess(_downloadBytesRequest.Url); _steps = ESteps.VerifyData; } else { - if (_failedTryAgain > 0 && IsRetryableError(_downloadBytesRequest.HttpCode)) + string url = _downloadBytesRequest.Url; + long httpCode = _downloadBytesRequest.HttpCode; + string httpError = _downloadBytesRequest.HttpError; + _options.URLPolicy.OnFailure(url, httpCode, httpError); + if (IsWaitForCompletion == false && _downloadRetry.CanRetry(url, httpCode, httpError)) { + _downloadRetry.BeginWait(); _steps = ESteps.TryAgain; } else @@ -247,8 +247,9 @@ namespace YooAsset string error = $"[WebBundleVerify] Verify failed. Url:{_downloadBytesRequest.Url} Level: {_options.DownloadVerifyLevel} Result: {verifyResult}"; YooLogger.Warning(error); - if (_failedTryAgain > 0) + if (IsWaitForCompletion == false && _downloadRetry.CanRetry()) { + _downloadRetry.BeginWait(); _steps = ESteps.TryAgain; } else @@ -290,7 +291,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Succeeded; - BundleResult = new AssetBundleResult(_downloadBytesRequest.Url, _options.Bundle, assetBundle, null); + BundleHandle = new AssetBundleHandle(_downloadBytesRequest.Url, _options.Bundle, assetBundle, null); } } @@ -303,11 +304,8 @@ namespace YooAsset _downloadBytesRequest = null; } - _tryAgainTimer += Time.unscaledDeltaTime; - if (_tryAgainTimer > 1f) + if (_downloadRetry.Tick()) { - _tryAgainTimer = 0f; - _failedTryAgain--; Progress = 0f; _steps = ESteps.DataRequest; } @@ -336,12 +334,7 @@ namespace YooAsset } private string GetRequestURL() { - // 轮流返回请求地址 - _requestCount++; - if (_requestCount % 2 == 0) - return _options.FallbackURL; - else - return _options.MainURL; + return _options.URLPolicy.SelectURL(_options.CandidateURLs); } } } diff --git a/Assets/YooAsset/Runtime/FileCache/Operations/Common/LoadWebAssetBundleOptions.cs b/Assets/YooAsset/Runtime/FileCache/Operations/Common/LoadWebAssetBundleOptions.cs index b0525dc1..829f48b6 100644 --- a/Assets/YooAsset/Runtime/FileCache/Operations/Common/LoadWebAssetBundleOptions.cs +++ b/Assets/YooAsset/Runtime/FileCache/Operations/Common/LoadWebAssetBundleOptions.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; namespace YooAsset { @@ -17,14 +18,9 @@ namespace YooAsset public PackageBundle Bundle { get; set; } /// - /// 请求地址 + /// 候选下载地址列表 /// - public string MainURL { get; set; } - - /// - /// 备用请求地址 - /// - public string FallbackURL { get; set; } + public IReadOnlyList CandidateURLs { get; set; } /// /// AssetBundle 解密器 @@ -50,5 +46,15 @@ namespace YooAsset /// 禁用Unity的网络缓存 /// public bool DisableUnityWebCache { get; set; } + + /// + /// 下载重试判定策略 + /// + public IDownloadRetryPolicy RetryPolicy { get; set; } + + /// + /// URL 选择策略 + /// + public IDownloadURLPolicy URLPolicy { get; set; } } } diff --git a/Assets/YooAsset/Runtime/FileCache/Operations/FCClearCacheOperation.cs b/Assets/YooAsset/Runtime/FileCache/Operations/FCClearCacheOperation.cs index 701baae4..265529cd 100644 --- a/Assets/YooAsset/Runtime/FileCache/Operations/FCClearCacheOperation.cs +++ b/Assets/YooAsset/Runtime/FileCache/Operations/FCClearCacheOperation.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; namespace YooAsset { @@ -6,6 +7,130 @@ namespace YooAsset /// internal abstract class FCClearCacheOperation : AsyncOperationBase { + protected readonly struct ClearResult + { + /// + /// 错误信息 + /// + public readonly string Error; + + /// + /// 需要清理的资源标识符集合 + /// + public readonly List BundleGUIDs; + + /// + /// 是否成功 + /// + public bool Succeeded + { + get { return Error == null; } + } + + public ClearResult(string error) + { + Error = error; + BundleGUIDs = null; + } + public ClearResult(List bundleGUIDs) + { + Error = null; + BundleGUIDs = bundleGUIDs; + } + + public static ClearResult Success(List bundleGUIDs) + { + return new ClearResult(bundleGUIDs); + } + public static ClearResult Failure(string error) + { + return new ClearResult(error); + } + } + + protected ClearResult GetAllCache(IReadOnlyCollection cacheEntries) + { + var bundleGUIDs = new List(cacheEntries.Count); + foreach (var entry in cacheEntries) + { + bundleGUIDs.Add(entry.BundleGUID); + } + return ClearResult.Success(bundleGUIDs); + } + protected ClearResult GetUnusedCache(FCClearCacheOptions options, IReadOnlyCollection cacheEntries) + { + if (options.Manifest == null) + return ClearResult.Failure("Active package manifest not found."); + + var bundleGUIDs = new List(cacheEntries.Count); + foreach (var entry in cacheEntries) + { + if (options.Manifest.IsIncludeBundleFile(entry.BundleGUID) == false) + { + bundleGUIDs.Add(entry.BundleGUID); + } + } + return ClearResult.Success(bundleGUIDs); + } + protected ClearResult GetCacheByLocations(FCClearCacheOptions options, IReadOnlyCollection cacheEntries) + { + if (options.Manifest == null) + return ClearResult.Failure("Active package manifest not found."); + + if (options.ClearParam == null) + return ClearResult.Failure("Clear param is null."); + + string[] locations; + if (options.ClearParam is string str) + locations = new string[] { str }; + else if (options.ClearParam is List list) + locations = list.ToArray(); + else if (options.ClearParam is string[] array) + locations = array; + else + return ClearResult.Failure($"Invalid clear param: {options.ClearParam.GetType().FullName}"); + + var bundleGUIDs = new List(locations.Length); + foreach (var location in locations) + { + string assetPath = options.Manifest.TryMappingToAssetPath(location); + if (options.Manifest.TryGetPackageAsset(assetPath, out PackageAsset packageAsset)) + { + PackageBundle bundle = options.Manifest.GetMainPackageBundle(packageAsset.BundleID); + bundleGUIDs.Add(bundle.BundleGUID); + } + } + return ClearResult.Success(bundleGUIDs); + } + protected ClearResult GetCacheByTags(FCClearCacheOptions options, IReadOnlyCollection cacheEntries) + { + if (options.Manifest == null) + return ClearResult.Failure("Active package manifest not found."); + + if (options.ClearParam == null) + return ClearResult.Failure("Clear param is null."); + + string[] tags; + if (options.ClearParam is string str) + tags = new string[] { str }; + else if (options.ClearParam is List list) + tags = list.ToArray(); + else if (options.ClearParam is string[] array) + tags = array; + else + return ClearResult.Failure($"Invalid clear param: {options.ClearParam.GetType().FullName}"); + + var bundleGUIDs = new List(cacheEntries.Count); + foreach (var entry in cacheEntries) + { + if (options.Manifest.TryGetPackageBundleByBundleGUID(entry.BundleGUID, out PackageBundle bundle)) + { + if (bundle.HasTag(tags)) + bundleGUIDs.Add(bundle.BundleGUID); + } + } + return ClearResult.Success(bundleGUIDs); + } } /// diff --git a/Assets/YooAsset/Runtime/FileCache/Operations/FCClearCacheOptions.cs b/Assets/YooAsset/Runtime/FileCache/Operations/FCClearCacheOptions.cs new file mode 100644 index 00000000..f4730ff7 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileCache/Operations/FCClearCacheOptions.cs @@ -0,0 +1,24 @@ + +namespace YooAsset +{ + /// + /// 清理缓存操作选项 + /// + internal struct FCClearCacheOptions + { + /// + /// 清理模式 + /// + public string ClearMode { get; set; } + + /// + /// 附加参数 + /// + public object ClearParam { get; set; } + + /// + /// 资源清单 + /// + public PackageManifest Manifest { get; set; } + } +} diff --git a/Assets/YooAsset/Runtime/FileCache/Operations/FCClearCacheOptions.cs.meta b/Assets/YooAsset/Runtime/FileCache/Operations/FCClearCacheOptions.cs.meta new file mode 100644 index 00000000..894a8e79 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileCache/Operations/FCClearCacheOptions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cb7284d99e0056242806b0b21db09c09 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileCache/Operations/FCLoadBundleOperation.cs b/Assets/YooAsset/Runtime/FileCache/Operations/FCLoadBundleOperation.cs index b72eed94..98d924b8 100644 --- a/Assets/YooAsset/Runtime/FileCache/Operations/FCLoadBundleOperation.cs +++ b/Assets/YooAsset/Runtime/FileCache/Operations/FCLoadBundleOperation.cs @@ -6,7 +6,7 @@ namespace YooAsset /// internal abstract class FCLoadBundleOperation : AsyncOperationBase { - protected struct LoadResult + protected readonly struct LoadResult { /// /// 错误信息 @@ -14,7 +14,7 @@ namespace YooAsset public readonly string Error; /// - /// 加载成功 + /// 是否成功 /// public bool Succeeded { @@ -37,46 +37,9 @@ namespace YooAsset } /// - /// 资源包加载结果 + /// 资源包句柄 /// - public IBundleResult BundleResult { get; protected set; } - - /// - /// 检查文件路径是否支持 FileIO 读取 - /// - protected bool SupportsFileIO(string filePath) - { - if (string.IsNullOrEmpty(filePath)) - return false; - if (filePath.StartsWith("jar:") || filePath.StartsWith("content:")) - return false; - return true; - } - - /// - /// 判断是否为可重试的错误 - /// - protected bool IsRetryableError(long httpCode) - { - // HTTP 状态码 - // 1xx 信息响应 - // 2xx 成功响应 - // 3xx 重定向消息 - // 4xx 客户端错误响应 - // 5xx 服务器错误响应 - - if (httpCode == 0) - return true; - - // 4xx 客户端错误不可重试 - // 说明:408 Request Timeout - // 说明:429 Too Many Requests - if (httpCode >= 400 && httpCode < 500) - return httpCode == 408 || httpCode == 429; - - // 其它情况可重试 - return true; - } + public IBundleHandle BundleHandle { get; protected set; } } /// diff --git a/Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/BuiltinCatalogDefine.cs b/Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/BuiltinCatalogConsts.cs similarity index 95% rename from Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/BuiltinCatalogDefine.cs rename to Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/BuiltinCatalogConsts.cs index d04e9988..b8e47740 100644 --- a/Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/BuiltinCatalogDefine.cs +++ b/Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/BuiltinCatalogConsts.cs @@ -4,7 +4,7 @@ namespace YooAsset /// /// 内置资源目录常量定义 /// - internal class BuiltinCatalogDefine + internal class BuiltinCatalogConsts { /// /// 文件极限大小(100MB) diff --git a/Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/BuiltinCatalogDefine.cs.meta b/Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/BuiltinCatalogConsts.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/BuiltinCatalogDefine.cs.meta rename to Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/BuiltinCatalogConsts.cs.meta diff --git a/Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/BuiltinCatalogTools.cs b/Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/BuiltinCatalogTools.cs index 6d573199..dd925a1e 100644 --- a/Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/BuiltinCatalogTools.cs +++ b/Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/BuiltinCatalogTools.cs @@ -57,7 +57,7 @@ namespace YooAsset // 创建内置清单实例 var buildinCatalog = new BuiltinCatalog(); - buildinCatalog.FileVersion = BuiltinCatalogDefine.FileVersion; + buildinCatalog.FileVersion = BuiltinCatalogConsts.FileVersion; buildinCatalog.PackageName = packageName; buildinCatalog.PackageVersion = packageVersion; @@ -66,8 +66,8 @@ namespace YooAsset { "link.xml", "buildlogtep.json", - BuiltinCatalogDefine.JsonFileName, - BuiltinCatalogDefine.BinaryFileName + BuiltinCatalogConsts.JsonFileName, + BuiltinCatalogConsts.BinaryFileName }; string packageVersionFileName = YooAssetSettingsData.GetPackageVersionFileName(packageName); string packageHashFileName = YooAssetSettingsData.GetPackageHashFileName(packageName, packageVersion); @@ -106,13 +106,13 @@ namespace YooAsset } // 创建输出文件 - string jsonFilePath = $"{packageDirectory}/{BuiltinCatalogDefine.JsonFileName}"; + string jsonFilePath = $"{packageDirectory}/{BuiltinCatalogConsts.JsonFileName}"; if (File.Exists(jsonFilePath)) File.Delete(jsonFilePath); SerializeToJson(jsonFilePath, buildinCatalog); // 创建输出文件 - string binaryFilePath = $"{packageDirectory}/{BuiltinCatalogDefine.BinaryFileName}"; + string binaryFilePath = $"{packageDirectory}/{BuiltinCatalogConsts.BinaryFileName}"; if (File.Exists(binaryFilePath)) File.Delete(binaryFilePath); SerializeToBinary(binaryFilePath, buildinCatalog); @@ -129,18 +129,18 @@ namespace YooAsset { // 创建内置清单实例 var buildinFileCatalog = new BuiltinCatalog(); - buildinFileCatalog.FileVersion = BuiltinCatalogDefine.FileVersion; + buildinFileCatalog.FileVersion = BuiltinCatalogConsts.FileVersion; buildinFileCatalog.PackageName = packageName; buildinFileCatalog.PackageVersion = packageVersion; // 创建输出文件 - string jsonFilePath = $"{outputPath}/{BuiltinCatalogDefine.JsonFileName}"; + string jsonFilePath = $"{outputPath}/{BuiltinCatalogConsts.JsonFileName}"; if (File.Exists(jsonFilePath)) File.Delete(jsonFilePath); SerializeToJson(jsonFilePath, buildinFileCatalog); // 创建输出文件 - string binaryFilePath = $"{outputPath}/{BuiltinCatalogDefine.BinaryFileName}"; + string binaryFilePath = $"{outputPath}/{BuiltinCatalogConsts.BinaryFileName}"; if (File.Exists(binaryFilePath)) File.Delete(binaryFilePath); SerializeToBinary(binaryFilePath, buildinFileCatalog); @@ -167,13 +167,13 @@ namespace YooAsset using (FileStream fs = new FileStream(savePath, FileMode.Create)) { // 创建缓存器 - BufferWriter buffer = new BufferWriter(BuiltinCatalogDefine.MaxFileSize); + BufferWriter buffer = new BufferWriter(BuiltinCatalogConsts.MaxFileSize); // 写入文件标记 - buffer.WriteUInt32(BuiltinCatalogDefine.FileHeader); + buffer.WriteUInt32(BuiltinCatalogConsts.FileHeader); // 写入文件版本 - buffer.WriteUTF8(BuiltinCatalogDefine.FileVersion); + buffer.WriteUTF8(BuiltinCatalogConsts.FileVersion); // 写入文件头信息 buffer.WriteUTF8(catalog.PackageName); @@ -216,13 +216,13 @@ namespace YooAsset // 读取文件标记 uint fileHeader = buffer.ReadUInt32(); - if (fileHeader != BuiltinCatalogDefine.FileHeader) + if (fileHeader != BuiltinCatalogConsts.FileHeader) throw new Exception("Invalid catalog file."); // 读取文件版本 string fileVersion = buffer.ReadUTF8(); - if (fileVersion != BuiltinCatalogDefine.FileVersion) - throw new Exception($"The catalog file version is not compatible: {fileVersion} != {BuiltinCatalogDefine.FileVersion}"); + if (fileVersion != BuiltinCatalogConsts.FileVersion) + throw new Exception($"The catalog file version is not compatible: {fileVersion} != {BuiltinCatalogConsts.FileVersion}"); BuiltinCatalog catalog = new BuiltinCatalog(); { diff --git a/Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/BuiltinFileCache.cs b/Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/BuiltinFileCache.cs index 2b1ba81d..50f18588 100644 --- a/Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/BuiltinFileCache.cs +++ b/Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/BuiltinFileCache.cs @@ -96,7 +96,7 @@ namespace YooAsset var operation = new FCWriteCacheCompleteOperation($"{nameof(BuiltinFileCache)} is readonly."); return operation; } - public virtual FCClearCacheOperation ClearCacheAsync(ClearCacheOptions options) + public virtual FCClearCacheOperation ClearCacheAsync(FCClearCacheOptions options) { var operation = new FCClearCacheCompleteOperation($"{nameof(BuiltinFileCache)} is readonly."); return operation; @@ -120,7 +120,7 @@ namespace YooAsset } else { - string error = $"{nameof(BuiltinFileCache)} not support load bundle type : {options.Bundle.BundleType}"; + string error = $"{nameof(BuiltinFileCache)} does not support bundle type: {options.Bundle.BundleType}"; var operation = new FCLoadBundleErrorOperation(error); return operation; } @@ -132,7 +132,7 @@ namespace YooAsset #region 内部方法 /// - /// 获取指定缓存 + /// 获取指定缓存条目 /// internal BuiltinFileCacheEntry GetEntry(string bundleGUID) { @@ -143,7 +143,7 @@ namespace YooAsset } /// - /// 添加指定缓存 + /// 添加指定缓存条目 /// internal void AddEntry(string bundleGUID, BuiltinFileCacheEntry cacheEntry) { @@ -158,7 +158,7 @@ namespace YooAsset /// internal string GetCatalogBinaryFileLoadPath() { - return PathUtility.Combine(RootPath, BuiltinCatalogDefine.BinaryFileName); + return PathUtility.Combine(RootPath, BuiltinCatalogConsts.BinaryFileName); } #endregion } diff --git a/Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/Operations/BFCLoadBundleOperation.cs b/Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/Operations/BFCLoadBundleOperation.cs index 0a428dae..e32f16d4 100644 --- a/Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/Operations/BFCLoadBundleOperation.cs +++ b/Assets/YooAsset/Runtime/FileCache/Services/BuiltinFileCache/Operations/BFCLoadBundleOperation.cs @@ -72,12 +72,12 @@ namespace YooAsset if (_loadLocalAssetBundleOp.Status == EOperationStatus.Succeeded) { - if (_loadLocalAssetBundleOp.BundleResult == null) - throw new YooInternalException("Loaded bundle result is null."); + if (_loadLocalAssetBundleOp.BundleHandle == null) + throw new YooInternalException("Loaded bundle handle is null."); _steps = ESteps.Done; Status = EOperationStatus.Succeeded; - BundleResult = _loadLocalAssetBundleOp.BundleResult; + BundleHandle = _loadLocalAssetBundleOp.BundleHandle; } else { @@ -164,12 +164,12 @@ namespace YooAsset if(_loadLocalRawBundleOp.Status == EOperationStatus.Succeeded) { - if (_loadLocalRawBundleOp.BundleResult == null) - throw new YooInternalException("Loaded bundle result is null."); + if (_loadLocalRawBundleOp.BundleHandle == null) + throw new YooInternalException("Loaded bundle handle is null."); _steps = ESteps.Done; Status = EOperationStatus.Succeeded; - BundleResult = _loadLocalRawBundleOp.BundleResult; + BundleHandle = _loadLocalRawBundleOp.BundleHandle; } else { diff --git a/Assets/YooAsset/Runtime/FileCache/Services/EditorFileCache/EditorFileCache.cs b/Assets/YooAsset/Runtime/FileCache/Services/EditorFileCache/EditorFileCache.cs index 49f62d0b..d8c24eef 100644 --- a/Assets/YooAsset/Runtime/FileCache/Services/EditorFileCache/EditorFileCache.cs +++ b/Assets/YooAsset/Runtime/FileCache/Services/EditorFileCache/EditorFileCache.cs @@ -101,9 +101,9 @@ namespace YooAsset var operation = new EFCWriteCacheOperation(this, options); return operation; } - public virtual FCClearCacheOperation ClearCacheAsync(ClearCacheOptions options) + public virtual FCClearCacheOperation ClearCacheAsync(FCClearCacheOptions options) { - var operation = new FCClearCacheCompleteOperation(); + var operation = new EFCClearCacheOperation(this, options); return operation; } public virtual FCVerifyCacheOperation VerifyCacheAsync(FCVerifyCacheOptions options) @@ -120,7 +120,7 @@ namespace YooAsset } else { - string error = $"{nameof(EditorFileCache)} not support load bundle type : {options.Bundle.BundleType}"; + string error = $"{nameof(EditorFileCache)} does not support bundle type: {options.Bundle.BundleType}"; var operation = new FCLoadBundleErrorOperation(error); return operation; } @@ -135,7 +135,15 @@ namespace YooAsset #region 内部方法 /// - /// 添加指定缓存 + /// 获取所有缓存条目 + /// + internal IReadOnlyCollection GetAllEntries() + { + return _cacheEntries.Values; + } + + /// + /// 添加指定缓存条目 /// internal void AddEntry(string bundleGUID, EditorFileCacheEntry cacheEntry) { @@ -144,6 +152,17 @@ namespace YooAsset _cacheEntries.Add(bundleGUID, cacheEntry); } + + /// + /// 删除指定缓存条目 + /// + internal void RemoveEntry(string bundleGUID) + { + if (_cacheEntries.TryGetValue(bundleGUID, out EditorFileCacheEntry entry)) + { + _cacheEntries.Remove(bundleGUID); + } + } #endregion } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileCache/Services/EditorFileCache/Operations/EFCClearCacheOperation.cs b/Assets/YooAsset/Runtime/FileCache/Services/EditorFileCache/Operations/EFCClearCacheOperation.cs new file mode 100644 index 00000000..cc9eb441 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileCache/Services/EditorFileCache/Operations/EFCClearCacheOperation.cs @@ -0,0 +1,93 @@ + +using System.Collections.Generic; + +namespace YooAsset +{ + /// + /// 清理沙盒文件缓存操作 + /// + internal class EFCClearCacheOperation : FCClearCacheOperation + { + private enum ESteps + { + None, + GetResult, + ClearCacheFiles, + Done, + } + + private readonly EditorFileCache _fileCache; + private readonly FCClearCacheOptions _options; + private List _bundleGUIDs; + private ESteps _steps = ESteps.None; + + internal EFCClearCacheOperation(EditorFileCache fileCache, FCClearCacheOptions options) + { + _fileCache = fileCache; + _options = options; + } + internal override void InternalStart() + { + _steps = ESteps.GetResult; + } + internal override void InternalUpdate() + { + if (_steps == ESteps.None || _steps == ESteps.Done) + return; + + if (_steps == ESteps.GetResult) + { + ClearResult clearResult; + if (_options.ClearMode == EFileClearMode.ClearAllBundleFiles.ToString()) + { + clearResult = GetAllCache(_fileCache.GetAllEntries()); + } + else if (_options.ClearMode == EFileClearMode.ClearUnusedBundleFiles.ToString()) + { + clearResult = GetUnusedCache(_options, _fileCache.GetAllEntries()); + } + else if (_options.ClearMode == EFileClearMode.ClearBundleFilesByLocations.ToString()) + { + clearResult = GetCacheByLocations(_options, _fileCache.GetAllEntries()); + } + else if (_options.ClearMode == EFileClearMode.ClearBundleFilesByTags.ToString()) + { + clearResult = GetCacheByTags(_options, _fileCache.GetAllEntries()); + } + else + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"Invalid clear mode: {_options.ClearMode}"; + return; + } + + if (clearResult.Succeeded == false) + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = clearResult.Error; + return; + } + + _bundleGUIDs = clearResult.BundleGUIDs; + _steps = ESteps.ClearCacheFiles; + } + + if (_steps == ESteps.ClearCacheFiles) + { + foreach(var bundleGUID in _bundleGUIDs) + { + _fileCache.RemoveEntry(bundleGUID); + } + + _steps = ESteps.Done; + Status = EOperationStatus.Succeeded; + } + } + internal override void InternalWaitForCompletion() + { + ExecuteBatch(); + } + } +} diff --git a/Assets/YooAsset/Runtime/FileCache/Services/EditorFileCache/Operations/EFCClearCacheOperation.cs.meta b/Assets/YooAsset/Runtime/FileCache/Services/EditorFileCache/Operations/EFCClearCacheOperation.cs.meta new file mode 100644 index 00000000..bf8ce1d3 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileCache/Services/EditorFileCache/Operations/EFCClearCacheOperation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4dd5972832b5c9e40874d84a0e3b4b60 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileCache/Services/EditorFileCache/Operations/EFCLoadBundleOperation.cs b/Assets/YooAsset/Runtime/FileCache/Services/EditorFileCache/Operations/EFCLoadBundleOperation.cs index 3852cd46..a274e7c8 100644 --- a/Assets/YooAsset/Runtime/FileCache/Services/EditorFileCache/Operations/EFCLoadBundleOperation.cs +++ b/Assets/YooAsset/Runtime/FileCache/Services/EditorFileCache/Operations/EFCLoadBundleOperation.cs @@ -10,6 +10,7 @@ namespace YooAsset { None, CheckCache, + CheckFilePath, LoadBundle, Done, } @@ -17,6 +18,7 @@ namespace YooAsset private readonly EditorFileCache _fileCache; private readonly PackageBundle _bundle; private int _asyncSimulateFrame; + private string _editorFilePath; private ESteps _steps = ESteps.None; public EFCLoadBundleOperation(EditorFileCache fileCache, PackageBundle bundle) @@ -44,7 +46,22 @@ namespace YooAsset return; } - _steps = ESteps.LoadBundle; + _steps = ESteps.CheckFilePath; + } + + if (_steps == ESteps.CheckFilePath) + { + _editorFilePath = EditorFileSystemTools.GetEditorFilePath(_bundle); + if (string.IsNullOrEmpty(_editorFilePath)) + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"Editor file path is null. Bundle: {_bundle.BundleName}"; + } + else + { + _steps = ESteps.LoadBundle; + } } if (_steps == ESteps.LoadBundle) @@ -61,9 +78,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Succeeded; - - string editorFilePath = EditorFileSystemTools.GetEditorFilePath(_bundle); - BundleResult = new VirtualBundleResult(editorFilePath, _bundle); + BundleHandle = new VirtualBundleHandle(_editorFilePath, _bundle); } } else @@ -73,9 +88,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Succeeded; - - string editorFilePath = EditorFileSystemTools.GetEditorFilePath(_bundle); - BundleResult = new VirtualBundleResult(editorFilePath, _bundle); + BundleHandle = new VirtualBundleHandle(_editorFilePath, _bundle); } } } diff --git a/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/Operations/Internal/SearchCacheFilesOperation.cs b/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/Operations/Internal/SearchCacheFilesOperation.cs index 4b929dba..c2fabfe9 100644 --- a/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/Operations/Internal/SearchCacheFilesOperation.cs +++ b/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/Operations/Internal/SearchCacheFilesOperation.cs @@ -92,8 +92,8 @@ namespace YooAsset // 创建验证元素类 string fileRootPath = childDirectory; - string dataFilePath = PathUtility.Combine(fileRootPath, SandboxFileCacheDefine.BundleDataFileName); - string infoFilePath = PathUtility.Combine(fileRootPath, SandboxFileCacheDefine.BundleInfoFileName); + string dataFilePath = PathUtility.Combine(fileRootPath, SandboxFileCacheConsts.BundleDataFileName); + string infoFilePath = PathUtility.Combine(fileRootPath, SandboxFileCacheConsts.BundleInfoFileName); var element = new SearchFileInfo(bundleGUID, fileRootPath, dataFilePath, infoFilePath); Result.Add(element); } diff --git a/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/Operations/Internal/VerifyCacheFilesOperation.cs b/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/Operations/Internal/VerifyCacheFilesOperation.cs index f934c5de..de8c1370 100644 --- a/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/Operations/Internal/VerifyCacheFilesOperation.cs +++ b/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/Operations/Internal/VerifyCacheFilesOperation.cs @@ -56,7 +56,7 @@ namespace YooAsset if (_maxConcurrentVerifyCount < 1) _maxConcurrentVerifyCount = 1; - YooLogger.Log($"Verify max concurrency : {_maxConcurrentVerifyCount}"); + YooLogger.Log($"Verify max concurrency: {_maxConcurrentVerifyCount}"); _activeVerifyList = new List(_maxConcurrentVerifyCount); _verifyStartTime = TimeUtility.RealtimeSinceStartup; _verifyTotalCount = _pendingVerifyList.Count; diff --git a/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/Operations/SFCClearCacheOperation.cs b/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/Operations/SFCClearCacheOperation.cs index 97ceeb79..cb90a4bf 100644 --- a/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/Operations/SFCClearCacheOperation.cs +++ b/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/Operations/SFCClearCacheOperation.cs @@ -1,46 +1,74 @@ -using System.Collections.Generic; namespace YooAsset { /// /// 清理沙盒文件缓存操作 /// - internal abstract class SFCClearCacheOperation : FCClearCacheOperation + internal class SFCClearCacheOperation : FCClearCacheOperation { - protected enum ESteps + private enum ESteps { None, - ParseOptions, + GetResult, ClearCacheFiles, Done, } - protected readonly SandboxFileCache _fileCache; - protected readonly ClearCacheOptions _options; - protected ClearCacheFilesOperation _clearCacheFilesOp; - protected List _bundleGUIDs; - protected ESteps _steps = ESteps.None; + private readonly SandboxFileCache _fileCache; + private readonly FCClearCacheOptions _options; + private ClearCacheFilesOperation _clearCacheFilesOp; + private ESteps _steps = ESteps.None; - internal SFCClearCacheOperation(SandboxFileCache fileCache, ClearCacheOptions options) + internal SFCClearCacheOperation(SandboxFileCache fileCache, FCClearCacheOptions options) { _fileCache = fileCache; _options = options; } internal override void InternalStart() { - _steps = ESteps.ParseOptions; + _steps = ESteps.GetResult; } internal override void InternalUpdate() { if (_steps == ESteps.None || _steps == ESteps.Done) return; - if (_steps == ESteps.ParseOptions) + if (_steps == ESteps.GetResult) { - if (ParseOptionsStep() == false) + ClearResult clearResult; + if (_options.ClearMode == EFileClearMode.ClearAllBundleFiles.ToString()) + { + clearResult = GetAllCache(_fileCache.GetAllEntries()); + } + else if (_options.ClearMode == EFileClearMode.ClearUnusedBundleFiles.ToString()) + { + clearResult = GetUnusedCache(_options, _fileCache.GetAllEntries()); + } + else if (_options.ClearMode == EFileClearMode.ClearBundleFilesByLocations.ToString()) + { + clearResult = GetCacheByLocations(_options, _fileCache.GetAllEntries()); + } + else if (_options.ClearMode == EFileClearMode.ClearBundleFilesByTags.ToString()) + { + clearResult = GetCacheByTags(_options, _fileCache.GetAllEntries()); + } + else + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"Invalid clear mode: {_options.ClearMode}"; return; + } - _clearCacheFilesOp = new ClearCacheFilesOperation(_fileCache, _bundleGUIDs); + if (clearResult.Succeeded == false) + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = clearResult.Error; + return; + } + + _clearCacheFilesOp = new ClearCacheFilesOperation(_fileCache, clearResult.BundleGUIDs); _clearCacheFilesOp.StartOperation(); AddChildOperation(_clearCacheFilesOp); _steps = ESteps.ClearCacheFiles; @@ -73,165 +101,5 @@ namespace YooAsset { ExecuteBatch(); } - - protected abstract bool ParseOptionsStep(); - } - - /// - /// 清理所有沙盒缓存操作 - /// - internal sealed class SFCClearAllCacheOperation : SFCClearCacheOperation - { - internal SFCClearAllCacheOperation(SandboxFileCache fileCache, ClearCacheOptions options) - : base(fileCache, options) { } - - protected override bool ParseOptionsStep() - { - var allEntries = _fileCache.GetAllEntries(); - _bundleGUIDs = new List(allEntries.Count); - foreach (var entry in allEntries) - { - _bundleGUIDs.Add(entry.BundleGUID); - } - return true; - } - } - /// - /// 清理未使用的沙盒缓存操作 - /// - internal sealed class SFCClearUnusedCacheOperation : SFCClearCacheOperation - { - internal SFCClearUnusedCacheOperation(SandboxFileCache fileCache, ClearCacheOptions options) - : base(fileCache, options) { } - - protected override bool ParseOptionsStep() - { - if (_options.Manifest == null) - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = "Active package manifest not found."; - return false; - } - - var allEntries = _fileCache.GetAllEntries(); - _bundleGUIDs = new List(allEntries.Count); - foreach (var entry in allEntries) - { - if (_options.Manifest.IsIncludeBundleFile(entry.BundleGUID) == false) - { - _bundleGUIDs.Add(entry.BundleGUID); - } - } - return true; - } - } - /// - /// 按资源地址清理沙盒缓存操作 - /// - internal sealed class SFCClearCacheByLocationsOperation : SFCClearCacheOperation - { - internal SFCClearCacheByLocationsOperation(SandboxFileCache fileCache, ClearCacheOptions options) - : base(fileCache, options) { } - - protected override bool ParseOptionsStep() - { - if (_options.Manifest == null) - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = "Active package manifest not found."; - return false; - } - - if (_options.ClearParam == null) - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = "Clear param is null."; - return false; - } - - string[] locations; - if (_options.ClearParam is string str) - locations = new string[] { str }; - else if (_options.ClearParam is List list) - locations = list.ToArray(); - else if (_options.ClearParam is string[] array) - locations = array; - else - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = $"Invalid clear param: {_options.ClearParam.GetType().FullName}"; - return false; - } - - _bundleGUIDs = new List(locations.Length); - foreach (var location in locations) - { - string assetPath = _options.Manifest.TryMappingToAssetPath(location); - if (_options.Manifest.TryGetPackageAsset(assetPath, out PackageAsset packageAsset)) - { - PackageBundle bundle = _options.Manifest.GetMainPackageBundle(packageAsset.BundleID); - _bundleGUIDs.Add(bundle.BundleGUID); - } - } - return true; - } - } - /// - /// 按标签清理沙盒缓存操作 - /// - internal sealed class SFCClearCacheByTagsOperation : SFCClearCacheOperation - { - internal SFCClearCacheByTagsOperation(SandboxFileCache fileCache, ClearCacheOptions options) - : base(fileCache, options) { } - - protected override bool ParseOptionsStep() - { - if (_options.Manifest == null) - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = "Active package manifest not found."; - return false; - } - - if (_options.ClearParam == null) - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = "Clear param is null."; - return false; - } - - string[] tags; - if (_options.ClearParam is string str) - tags = new string[] { str }; - else if (_options.ClearParam is List list) - tags = list.ToArray(); - else if (_options.ClearParam is string[] array) - tags = array; - else - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = $"Invalid clear param: {_options.ClearParam.GetType().FullName}"; - return false; - } - - var allEntries = _fileCache.GetAllEntries(); - _bundleGUIDs = new List(allEntries.Count); - foreach (var entry in allEntries) - { - if (_options.Manifest.TryGetPackageBundleByBundleGUID(entry.BundleGUID, out PackageBundle bundle)) - { - if (bundle.HasTag(tags)) - _bundleGUIDs.Add(bundle.BundleGUID); - } - } - return true; - } } } diff --git a/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/Operations/SFCLoadBundleOperation.cs b/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/Operations/SFCLoadBundleOperation.cs index c7420487..2ed18202 100644 --- a/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/Operations/SFCLoadBundleOperation.cs +++ b/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/Operations/SFCLoadBundleOperation.cs @@ -78,12 +78,12 @@ namespace YooAsset if (_loadLocalAssetBundleOp.Status == EOperationStatus.Succeeded) { - if (_loadLocalAssetBundleOp.BundleResult == null) - throw new YooInternalException("Loaded asset bundle result is null."); + if (_loadLocalAssetBundleOp.BundleHandle == null) + throw new YooInternalException("Loaded asset bundle handle is null."); _steps = ESteps.Done; Status = EOperationStatus.Succeeded; - BundleResult = _loadLocalAssetBundleOp.BundleResult; + BundleHandle = _loadLocalAssetBundleOp.BundleHandle; } else { @@ -173,7 +173,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Succeeded; - BundleResult = new AssetBundleResult(_cacheEntry.DataFilePath, _bundle, assetBundle, null); + BundleHandle = new AssetBundleHandle(_cacheEntry.DataFilePath, _bundle, assetBundle, null); } } } @@ -269,12 +269,12 @@ namespace YooAsset if (_loadLocalRawBundleOp.Status == EOperationStatus.Succeeded) { - if (_loadLocalRawBundleOp.BundleResult == null) - throw new YooInternalException("Loaded raw bundle result is null."); + if (_loadLocalRawBundleOp.BundleHandle == null) + throw new YooInternalException("Loaded raw bundle handle is null."); _steps = ESteps.Done; Status = EOperationStatus.Succeeded; - BundleResult = _loadLocalRawBundleOp.BundleResult; + BundleHandle = _loadLocalRawBundleOp.BundleHandle; } else { @@ -289,4 +289,26 @@ namespace YooAsset ExecuteBatch(); } } + +#if TUANJIE_1_7_OR_NEWER + internal class SFCLoadInstantBundleOperation : FCLoadBundleOperation + { + private enum ESteps + { + None, + GetEntry, + LoadBundle, + Done, + } + + internal override void InternalStart() + { + throw new NotImplementedException(); + } + internal override void InternalUpdate() + { + throw new NotImplementedException(); + } + } +#endif } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/SandboxFileCache.cs b/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/SandboxFileCache.cs index 86e0a19a..ba99302f 100644 --- a/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/SandboxFileCache.cs +++ b/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/SandboxFileCache.cs @@ -109,34 +109,10 @@ namespace YooAsset var operation = new SFCWriteCacheOperation(this, options); return operation; } - public virtual FCClearCacheOperation ClearCacheAsync(ClearCacheOptions options) + public virtual FCClearCacheOperation ClearCacheAsync(FCClearCacheOptions options) { - if (options.ClearMode == EFileClearMode.ClearAllBundleFiles.ToString()) - { - var operation = new SFCClearAllCacheOperation(this, options); - return operation; - } - else if (options.ClearMode == EFileClearMode.ClearUnusedBundleFiles.ToString()) - { - var operation = new SFCClearUnusedCacheOperation(this, options); - return operation; - } - else if (options.ClearMode == EFileClearMode.ClearBundleFilesByLocations.ToString()) - { - var operation = new SFCClearCacheByLocationsOperation(this, options); - return operation; - } - else if (options.ClearMode == EFileClearMode.ClearBundleFilesByTags.ToString()) - { - var operation = new SFCClearCacheByTagsOperation(this, options); - return operation; - } - else - { - string error = $"Invalid clear mode : {options.ClearMode}"; - var operation = new FCClearCacheCompleteOperation(error); - return operation; - } + var operation = new SFCClearCacheOperation(this, options); + return operation; } public virtual FCVerifyCacheOperation VerifyCacheAsync(FCVerifyCacheOptions options) { @@ -157,7 +133,7 @@ namespace YooAsset } else { - string error = $"{nameof(SandboxFileCache)} not support load bundle type : {options.Bundle.BundleType}"; + string error = $"{nameof(SandboxFileCache)} does not support bundle type: {options.Bundle.BundleType}"; var operation = new FCLoadBundleErrorOperation(error); return operation; } @@ -176,7 +152,7 @@ namespace YooAsset if (_dataFilePathMapping.TryGetValue(bundle.BundleGUID, out string filePath) == false) { string folderName = GetHashFolderName(bundle.FileHash); - filePath = PathUtility.Combine(RootPath, folderName, bundle.BundleGUID, SandboxFileCacheDefine.BundleDataFileName); + filePath = PathUtility.Combine(RootPath, folderName, bundle.BundleGUID, SandboxFileCacheConsts.BundleDataFileName); _dataFilePathMapping.Add(bundle.BundleGUID, filePath); } return filePath; @@ -190,7 +166,7 @@ namespace YooAsset if (_infoFilePathMapping.TryGetValue(bundle.BundleGUID, out string filePath) == false) { string folderName = GetHashFolderName(bundle.FileHash); - filePath = PathUtility.Combine(RootPath, folderName, bundle.BundleGUID, SandboxFileCacheDefine.BundleInfoFileName); + filePath = PathUtility.Combine(RootPath, folderName, bundle.BundleGUID, SandboxFileCacheConsts.BundleInfoFileName); _infoFilePathMapping.Add(bundle.BundleGUID, filePath); } return filePath; @@ -202,7 +178,7 @@ namespace YooAsset internal string GetDataTempFilePath(PackageBundle bundle) { string folderName = GetHashFolderName(bundle.FileHash); - return PathUtility.Combine(RootPath, folderName, bundle.BundleGUID, SandboxFileCacheDefine.BundleDataTempFileName); + return PathUtility.Combine(RootPath, folderName, bundle.BundleGUID, SandboxFileCacheConsts.BundleDataTempFileName); } /// @@ -211,11 +187,11 @@ namespace YooAsset internal string GetInfoTempFilePath(PackageBundle bundle) { string folderName = GetHashFolderName(bundle.FileHash); - return PathUtility.Combine(RootPath, folderName, bundle.BundleGUID, SandboxFileCacheDefine.BundleInfoTempFileName); + return PathUtility.Combine(RootPath, folderName, bundle.BundleGUID, SandboxFileCacheConsts.BundleInfoTempFileName); } /// - /// 获取指定缓存 + /// 获取指定缓存条目 /// internal SandboxFileCacheEntry GetEntry(string bundleGUID) { @@ -226,7 +202,7 @@ namespace YooAsset } /// - /// 获取所有缓存 + /// 获取所有缓存条目 /// internal IReadOnlyCollection GetAllEntries() { @@ -234,7 +210,7 @@ namespace YooAsset } /// - /// 添加指定缓存 + /// 添加指定缓存条目 /// internal void AddEntry(string bundleGUID, SandboxFileCacheEntry cacheEntry) { @@ -246,7 +222,7 @@ namespace YooAsset } /// - /// 删除指定缓存 + /// 删除指定缓存条目 /// internal void RemoveEntry(string bundleGUID) { diff --git a/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/SandboxFileCacheDefine.cs b/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/SandboxFileCacheConsts.cs similarity index 94% rename from Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/SandboxFileCacheDefine.cs rename to Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/SandboxFileCacheConsts.cs index a3dad407..3852e49d 100644 --- a/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/SandboxFileCacheDefine.cs +++ b/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/SandboxFileCacheConsts.cs @@ -4,7 +4,7 @@ namespace YooAsset /// /// 沙盒文件缓存常量定义 /// - internal class SandboxFileCacheDefine + internal class SandboxFileCacheConsts { /// /// 数据文件名称 diff --git a/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/SandboxFileCacheDefine.cs.meta b/Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/SandboxFileCacheConsts.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/SandboxFileCacheDefine.cs.meta rename to Assets/YooAsset/Runtime/FileCache/Services/SandboxFileCache/SandboxFileCacheConsts.cs.meta diff --git a/Assets/YooAsset/Runtime/FileCache/Services/WebRemoteFileCache/Operations/WRFCLoadBundleOperation.cs b/Assets/YooAsset/Runtime/FileCache/Services/WebRemoteFileCache/Operations/WRFCLoadBundleOperation.cs index d350d3f6..d1fee9bf 100644 --- a/Assets/YooAsset/Runtime/FileCache/Services/WebRemoteFileCache/Operations/WRFCLoadBundleOperation.cs +++ b/Assets/YooAsset/Runtime/FileCache/Services/WebRemoteFileCache/Operations/WRFCLoadBundleOperation.cs @@ -56,13 +56,14 @@ namespace YooAsset var options = new LoadWebAssetBundleOptions(); options.CacheName = _fileCache.GetType().Name; options.Bundle = _options.Bundle; - options.MainURL = _cacheEntry.MainURL; - options.FallbackURL = _cacheEntry.FallbackURL; + options.CandidateURLs = _cacheEntry.URLs; options.AssetBundleDecryptor = _fileCache.Config.AssetBundleDecryptor; options.DownloadBackend = _fileCache.Config.DownloadBackend; options.DownloadVerifyLevel = _fileCache.Config.DownloadVerifyLevel; options.WatchdogTimeout = _fileCache.Config.WatchdogTimeout; options.DisableUnityWebCache = _fileCache.Config.DisableUnityWebCache; + options.RetryPolicy = _fileCache.Config.RetryPolicy; + options.URLPolicy = _fileCache.Config.URLPolicy; if (_options.Bundle.IsEncrypted) _loadWebAssetBundleOp = new LoadWebEncryptedAssetBundleOperation(options); @@ -79,12 +80,12 @@ namespace YooAsset if (_loadWebAssetBundleOp.Status == EOperationStatus.Succeeded) { - if (_loadWebAssetBundleOp.BundleResult == null) - throw new YooInternalException("Loaded bundle result is null."); + if (_loadWebAssetBundleOp.BundleHandle == null) + throw new YooInternalException("Loaded bundle handle is null."); _steps = ESteps.Done; Status = EOperationStatus.Succeeded; - BundleResult = _loadWebAssetBundleOp.BundleResult; + BundleHandle = _loadWebAssetBundleOp.BundleHandle; } else { @@ -100,7 +101,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"{nameof(WebRemoteFileCache)} not support sync load asset bundle."; + Error = $"{nameof(WebRemoteFileCache)} does not support synchronous asset bundle loading."; YooLogger.Error(Error); } } diff --git a/Assets/YooAsset/Runtime/FileCache/Services/WebRemoteFileCache/WebRemoteFileCache.cs b/Assets/YooAsset/Runtime/FileCache/Services/WebRemoteFileCache/WebRemoteFileCache.cs index b7fef8f8..fe402aa7 100644 --- a/Assets/YooAsset/Runtime/FileCache/Services/WebRemoteFileCache/WebRemoteFileCache.cs +++ b/Assets/YooAsset/Runtime/FileCache/Services/WebRemoteFileCache/WebRemoteFileCache.cs @@ -42,6 +42,16 @@ namespace YooAsset /// 下载后台接口 /// public IDownloadBackend DownloadBackend { get; set; } + + /// + /// 下载重试判定策略 + /// + public IDownloadRetryPolicy RetryPolicy { get; set; } + + /// + /// URL 选择策略 + /// + public IDownloadURLPolicy URLPolicy { get; set; } } private readonly Dictionary _cacheEntries = new Dictionary(10000); @@ -111,7 +121,7 @@ namespace YooAsset var operation = new FCWriteCacheCompleteOperation($"{nameof(WebRemoteFileCache)} is readonly."); return operation; } - public virtual FCClearCacheOperation ClearCacheAsync(ClearCacheOptions options) + public virtual FCClearCacheOperation ClearCacheAsync(FCClearCacheOptions options) { var operation = new FCClearCacheCompleteOperation($"{nameof(WebRemoteFileCache)} is readonly."); return operation; @@ -130,7 +140,7 @@ namespace YooAsset } else { - string error = $"{nameof(WebRemoteFileCache)} not support load bundle type : {options.Bundle.BundleType}"; + string error = $"{nameof(WebRemoteFileCache)} does not support bundle type: {options.Bundle.BundleType}"; var operation = new FCLoadBundleErrorOperation(error); return operation; } @@ -152,9 +162,8 @@ namespace YooAsset } else { - string mainURL = Config.RemoteServices.GetRemoteMainURL(bundle.FileName); - string fallbackURL = Config.RemoteServices.GetRemoteFallbackURL(bundle.FileName); - var newEntry = new WebRemoteFileCacheEntry(bundle.BundleGUID, mainURL, fallbackURL); + var urls = Config.RemoteServices.GetRemoteURLs(bundle.FileName); + var newEntry = new WebRemoteFileCacheEntry(bundle.BundleGUID, urls); _cacheEntries.Add(bundle.BundleGUID, newEntry); return newEntry; } diff --git a/Assets/YooAsset/Runtime/FileCache/Services/WebRemoteFileCache/WebRemoteFileCacheEntry.cs b/Assets/YooAsset/Runtime/FileCache/Services/WebRemoteFileCache/WebRemoteFileCacheEntry.cs index c799a425..bb4ccbd5 100644 --- a/Assets/YooAsset/Runtime/FileCache/Services/WebRemoteFileCache/WebRemoteFileCacheEntry.cs +++ b/Assets/YooAsset/Runtime/FileCache/Services/WebRemoteFileCache/WebRemoteFileCacheEntry.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; namespace YooAsset { @@ -12,26 +13,19 @@ namespace YooAsset public string BundleGUID { get; private set; } /// - /// 主下载地址 + /// 候选下载地址列表 /// - public string MainURL { get; private set; } - - /// - /// 备用下载地址 - /// - public string FallbackURL { get; private set; } + public IReadOnlyList URLs { get; private set; } /// /// 创建Web远端文件缓存条目 /// /// 资源包唯一标识 - /// 主下载地址 - /// 备用下载地址 - public WebRemoteFileCacheEntry(string bundleGUID, string mainURL, string fallbackURL) + /// 候选下载地址列表 + public WebRemoteFileCacheEntry(string bundleGUID, IReadOnlyList urls) { BundleGUID = bundleGUID; - MainURL = mainURL; - FallbackURL = fallbackURL; + URLs = urls; } } -} \ No newline at end of file +} diff --git a/Assets/YooAsset/Runtime/FileCache/Services/WebServerFileCache/Operations/WSFCLoadBundleOperation.cs b/Assets/YooAsset/Runtime/FileCache/Services/WebServerFileCache/Operations/WSFCLoadBundleOperation.cs index 7fd05def..ddd5b265 100644 --- a/Assets/YooAsset/Runtime/FileCache/Services/WebServerFileCache/Operations/WSFCLoadBundleOperation.cs +++ b/Assets/YooAsset/Runtime/FileCache/Services/WebServerFileCache/Operations/WSFCLoadBundleOperation.cs @@ -57,13 +57,14 @@ namespace YooAsset var options = new LoadWebAssetBundleOptions(); options.CacheName = _fileCache.GetType().Name; options.Bundle = _options.Bundle; - options.MainURL = url; - options.FallbackURL = url; + options.CandidateURLs = new[] { url }; options.AssetBundleDecryptor = _fileCache.Config.AssetBundleDecryptor; options.DownloadBackend = _fileCache.Config.DownloadBackend; options.DownloadVerifyLevel = _fileCache.Config.DownloadVerifyLevel; options.WatchdogTimeout = _fileCache.Config.WatchdogTimeout; options.DisableUnityWebCache = _fileCache.Config.DisableUnityWebCache; + options.RetryPolicy = _fileCache.Config.RetryPolicy; + options.URLPolicy = _fileCache.Config.URLPolicy; if (_options.Bundle.IsEncrypted) _loadWebAssetBundleOp = new LoadWebEncryptedAssetBundleOperation(options); @@ -80,12 +81,12 @@ namespace YooAsset if (_loadWebAssetBundleOp.Status == EOperationStatus.Succeeded) { - if (_loadWebAssetBundleOp.BundleResult == null) - throw new YooInternalException("Loaded bundle result is null."); + if (_loadWebAssetBundleOp.BundleHandle == null) + throw new YooInternalException("Loaded bundle handle is null."); _steps = ESteps.Done; Status = EOperationStatus.Succeeded; - BundleResult = _loadWebAssetBundleOp.BundleResult; + BundleHandle = _loadWebAssetBundleOp.BundleHandle; } else { @@ -101,7 +102,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"{nameof(WebServerFileCache)} not support sync load asset bundle."; + Error = $"{nameof(WebServerFileCache)} does not support synchronous asset bundle loading."; YooLogger.Error(Error); } } diff --git a/Assets/YooAsset/Runtime/FileCache/Services/WebServerFileCache/WebServerFileCache.cs b/Assets/YooAsset/Runtime/FileCache/Services/WebServerFileCache/WebServerFileCache.cs index 7c0726c5..52134162 100644 --- a/Assets/YooAsset/Runtime/FileCache/Services/WebServerFileCache/WebServerFileCache.cs +++ b/Assets/YooAsset/Runtime/FileCache/Services/WebServerFileCache/WebServerFileCache.cs @@ -37,6 +37,16 @@ namespace YooAsset /// 下载后台 /// public IDownloadBackend DownloadBackend { get; set; } + + /// + /// 下载重试判定策略 + /// + public IDownloadRetryPolicy RetryPolicy { get; set; } + + /// + /// URL 选择策略 + /// + public IDownloadURLPolicy URLPolicy { get; set; } } private readonly Dictionary _cacheEntries = new Dictionary(10000); @@ -106,7 +116,7 @@ namespace YooAsset var operation = new FCWriteCacheCompleteOperation($"{nameof(WebServerFileCache)} is readonly."); return operation; } - public virtual FCClearCacheOperation ClearCacheAsync(ClearCacheOptions options) + public virtual FCClearCacheOperation ClearCacheAsync(FCClearCacheOptions options) { var operation = new FCClearCacheCompleteOperation($"{nameof(WebServerFileCache)} is readonly."); return operation; @@ -125,7 +135,7 @@ namespace YooAsset } else { - string error = $"{nameof(WebServerFileCache)} not support load bundle type : {options.Bundle.BundleType}"; + string error = $"{nameof(WebServerFileCache)} does not support bundle type: {options.Bundle.BundleType}"; var operation = new FCLoadBundleErrorOperation(error); return operation; } @@ -148,7 +158,7 @@ namespace YooAsset } /// - /// 添加指定缓存 + /// 添加指定缓存条目 /// internal void AddEntry(string bundleGUID, WebServerFileCacheEntry cacheEntry) { @@ -163,7 +173,7 @@ namespace YooAsset /// internal string GetCatalogBinaryFileLoadPath() { - return PathUtility.Combine(RootPath, BuiltinCatalogDefine.BinaryFileName); + return PathUtility.Combine(RootPath, BuiltinCatalogConsts.BinaryFileName); } #endregion } diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Interfaces/IBundleResult.cs b/Assets/YooAsset/Runtime/FileSystem/Bundles/Interfaces/IBundleResult.cs deleted file mode 100644 index 403775f2..00000000 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Interfaces/IBundleResult.cs +++ /dev/null @@ -1,37 +0,0 @@ -using UnityEngine.SceneManagement; - -namespace YooAsset -{ - internal interface IBundleResult - { - /// - /// 获取资源包文件的本地路径 - /// - string GetBundleFilePath(); - - /// - /// 卸载资源包文件 - /// - void UnloadBundleFile(); - - /// - /// 加载资源包内的资源对象 - /// - FSLoadAssetOperation LoadAssetAsync(AssetInfo assetInfo); - - /// - /// 加载资源包内的所有资源对象 - /// - FSLoadAllAssetsOperation LoadAllAssetsAsync(AssetInfo assetInfo); - - /// - /// 加载资源包内的资源对象及所有子资源对象 - /// - FSLoadSubAssetsOperation LoadSubAssetsAsync(AssetInfo assetInfo); - - /// - /// 加载资源包内的场景对象 - /// - FSLoadSceneOperation LoadSceneOperation(AssetInfo assetInfo, LoadSceneParameters loadParams, bool suspendLoad); - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Operations/FSLoadAllAssetsOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Bundles/Operations/FSLoadAllAssetsOperation.cs deleted file mode 100644 index 9250aac8..00000000 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Operations/FSLoadAllAssetsOperation.cs +++ /dev/null @@ -1,8 +0,0 @@ - -namespace YooAsset -{ - internal abstract class FSLoadAllAssetsOperation : AsyncOperationBase - { - public UnityEngine.Object[] Result; - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Operations/FSLoadAssetOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Bundles/Operations/FSLoadAssetOperation.cs deleted file mode 100644 index 8d104412..00000000 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Operations/FSLoadAssetOperation.cs +++ /dev/null @@ -1,8 +0,0 @@ - -namespace YooAsset -{ - internal abstract class FSLoadAssetOperation : AsyncOperationBase - { - public UnityEngine.Object Result; - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Operations/FSLoadSceneOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Bundles/Operations/FSLoadSceneOperation.cs deleted file mode 100644 index c6fc5d7a..00000000 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Operations/FSLoadSceneOperation.cs +++ /dev/null @@ -1,10 +0,0 @@ - -namespace YooAsset -{ - internal abstract class FSLoadSceneOperation : AsyncOperationBase - { - public UnityEngine.SceneManagement.Scene Result; - - public abstract void UnSuspendLoad(); - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Operations/FSLoadSubAssetsOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Bundles/Operations/FSLoadSubAssetsOperation.cs deleted file mode 100644 index a984c204..00000000 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Operations/FSLoadSubAssetsOperation.cs +++ /dev/null @@ -1,8 +0,0 @@ - -namespace YooAsset -{ - internal abstract class FSLoadSubAssetsOperation : AsyncOperationBase - { - public UnityEngine.Object[] Result; - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations/RawBundleLoadAllAssetsOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations/RawBundleLoadAllAssetsOperation.cs deleted file mode 100644 index 1bb4949a..00000000 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations/RawBundleLoadAllAssetsOperation.cs +++ /dev/null @@ -1,15 +0,0 @@ - -namespace YooAsset -{ - internal class RawBundleLoadAllAssetsOperation : FSLoadAllAssetsOperation - { - internal override void InternalStart() - { - Error = $"{nameof(RawBundleLoadAllAssetsOperation)} not support load all assets."; - Status = EOperationStatus.Failed; - } - internal override void InternalUpdate() - { - } - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations/RawBundleLoadSceneOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations/RawBundleLoadSceneOperation.cs deleted file mode 100644 index cfaf775c..00000000 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations/RawBundleLoadSceneOperation.cs +++ /dev/null @@ -1,18 +0,0 @@ - -namespace YooAsset -{ - internal class RawBundleLoadSceneOperation : FSLoadSceneOperation - { - internal override void InternalStart() - { - Error = $"{nameof(RawBundleLoadSceneOperation)} not support load scene."; - Status = EOperationStatus.Failed; - } - internal override void InternalUpdate() - { - } - public override void UnSuspendLoad() - { - } - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations/RawBundleLoadSubAssetsOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations/RawBundleLoadSubAssetsOperation.cs deleted file mode 100644 index de2d389e..00000000 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/RawBundleResult/Operations/RawBundleLoadSubAssetsOperation.cs +++ /dev/null @@ -1,15 +0,0 @@ - -namespace YooAsset -{ - internal class RawBundleLoadSubAssetsOperation : FSLoadSubAssetsOperation - { - internal override void InternalStart() - { - Error = $"{nameof(RawBundleLoadSubAssetsOperation)} not support load sub assets."; - Status = EOperationStatus.Failed; - } - internal override void InternalUpdate() - { - } - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/VirtualBundleResult.cs b/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/VirtualBundleResult.cs deleted file mode 100644 index c1d2d7d8..00000000 --- a/Assets/YooAsset/Runtime/FileSystem/Bundles/Services/VirtualBundleResult/VirtualBundleResult.cs +++ /dev/null @@ -1,44 +0,0 @@ -using UnityEngine.SceneManagement; - -namespace YooAsset -{ - internal class VirtualBundleResult : IBundleResult - { - private readonly string _bundleFilePath; - private readonly PackageBundle _packageBundle; - - public VirtualBundleResult(string bundleFilePath, PackageBundle bundle) - { - _bundleFilePath = bundleFilePath; - _packageBundle = bundle; - } - public void UnloadBundleFile() - { - } - public string GetBundleFilePath() - { - return _bundleFilePath; - } - - public FSLoadAssetOperation LoadAssetAsync(AssetInfo assetInfo) - { - var operation = new VirtualBundleLoadAssetOperation(_packageBundle, assetInfo); - return operation; - } - public FSLoadAllAssetsOperation LoadAllAssetsAsync(AssetInfo assetInfo) - { - var operation = new VirtualBundleLoadAllAssetsOperation(_packageBundle, assetInfo); - return operation; - } - public FSLoadSubAssetsOperation LoadSubAssetsAsync(AssetInfo assetInfo) - { - var operation = new VirtualBundleLoadSubAssetsOperation(_packageBundle, assetInfo); - return operation; - } - public FSLoadSceneOperation LoadSceneOperation(AssetInfo assetInfo, LoadSceneParameters loadParams, bool suspendLoad) - { - var operation = new VirtualBundleLoadSceneOperation(assetInfo, loadParams, suspendLoad); - return operation; - } - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/FileSystemParametersDefine.cs b/Assets/YooAsset/Runtime/FileSystem/FileSystemConsts.cs similarity index 82% rename from Assets/YooAsset/Runtime/FileSystem/FileSystemParametersDefine.cs rename to Assets/YooAsset/Runtime/FileSystem/FileSystemConsts.cs index 6b95fa52..22a5b9c8 100644 --- a/Assets/YooAsset/Runtime/FileSystem/FileSystemParametersDefine.cs +++ b/Assets/YooAsset/Runtime/FileSystem/FileSystemConsts.cs @@ -1,7 +1,10 @@ namespace YooAsset { - public class FileSystemParametersDefine + /// + /// 文件系统参数常量定义 + /// + public class FileSystemConsts { /// /// 初始化的时候缓存文件校验级别 @@ -16,7 +19,7 @@ namespace YooAsset /// /// 覆盖安装缓存清理模式 /// - public const string INSTALL_CLEAR_MODE = "INSTALL_CLEAR_MODE"; + public const string INSTALL_CLEANUP_MODE = "INSTALL_CLEANUP_MODE"; /// /// 远端资源地址查询服务类 @@ -61,17 +64,12 @@ namespace YooAsset /// /// 下载任务的看门狗机制超时时间 /// - public const string DOWNLOAD_WATCH_DOG_TIME = "DOWNLOAD_WATCH_DOG_TIME"; + public const string DOWNLOAD_WATCHDOG_TIMEOUT = "DOWNLOAD_WATCHDOG_TIMEOUT"; /// /// 启用断点续传的最小尺寸 /// - public const string DOWNLOAD_RESUME_MINMUM_SIZE = "DOWNLOAD_RESUME_MINMUM_SIZE"; - - /// - /// 断点续传下载器关注的错误码 > - /// - public const string DOWNLOAD_RESUME_RESPONSE_CODES = "DOWNLOAD_RESUME_RESPONSE_CODES"; + public const string DOWNLOAD_RESUME_MINIMUM_SIZE = "DOWNLOAD_RESUME_MINIMUM_SIZE"; /// /// 模拟WebGL平台模式 @@ -101,12 +99,12 @@ namespace YooAsset /// /// 拷贝内置清单 /// - public const string COPY_BUILDIN_PACKAGE_MANIFEST = "COPY_BUILDIN_PACKAGE_MANIFEST"; + public const string COPY_BUILTIN_PACKAGE_MANIFEST = "COPY_BUILTIN_PACKAGE_MANIFEST"; /// /// 拷贝内置清单的目标目录 /// - public const string COPY_BUILDIN_PACKAGE_MANIFEST_DEST_ROOT = "COPY_BUILDIN_PACKAGE_MANIFEST_DEST_ROOT"; + public const string COPY_BUILTIN_PACKAGE_MANIFEST_DEST_ROOT = "COPY_BUILTIN_PACKAGE_MANIFEST_DEST_ROOT"; /// /// 解压文件系统的根目录 @@ -127,5 +125,15 @@ namespace YooAsset /// 资源清单解密器 /// public const string MANIFEST_DECRYPTOR = "MANIFEST_DECRYPTOR"; + + /// + /// 下载重试判定策略 + /// + public const string DOWNLOAD_RETRY_POLICY = "DOWNLOAD_RETRY_POLICY"; + + /// + /// URL 选择策略 + /// + public const string DOWNLOAD_URL_POLICY = "DOWNLOAD_URL_POLICY"; } } diff --git a/Assets/YooAsset/Runtime/FileSystem/FileSystemParametersDefine.cs.meta b/Assets/YooAsset/Runtime/FileSystem/FileSystemConsts.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/FileSystemParametersDefine.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/FileSystemConsts.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/FileSystemParameters.cs b/Assets/YooAsset/Runtime/FileSystem/FileSystemParameters.cs index 5e593adf..33978859 100644 --- a/Assets/YooAsset/Runtime/FileSystem/FileSystemParameters.cs +++ b/Assets/YooAsset/Runtime/FileSystem/FileSystemParameters.cs @@ -15,12 +15,12 @@ namespace YooAsset /// 格式: "namespace.class,assembly" /// 格式: "命名空间.类型名,程序集" /// - public string FileSystemClass { private set; get; } + public string FileSystemClass { get; private set; } /// /// 文件系统的根目录 /// - public string PackageRoot { private set; get; } + public string PackageRoot { get; private set; } public FileSystemParameters(string fileSystemClass, string packageRoot) @@ -42,12 +42,12 @@ namespace YooAsset /// internal IFileSystem CreateFileSystem(string packageName) { - YooLogger.Log($"The package {packageName} create file system : {FileSystemClass}"); + YooLogger.Log($"The package {packageName} create file system: {FileSystemClass}"); Type classType = Type.GetType(FileSystemClass); if (classType == null) { - YooLogger.Error($"Can not found file system class type {FileSystemClass}"); + YooLogger.Error($"Cannot find file system class type: {FileSystemClass}"); return null; } @@ -69,8 +69,8 @@ namespace YooAsset #region 创建默认的文件系统类 /// /// 创建默认的编辑器文件系统参数 - /// 文件系统的根目录 /// + /// 文件系统的根目录 public static FileSystemParameters CreateDefaultEditorFileSystemParameters(string packageRoot) { string fileSystemClass = typeof(EditorFileSystem).FullName; @@ -82,7 +82,7 @@ namespace YooAsset /// 创建默认的内置文件系统参数 /// /// 文件系统的根目录 - public static FileSystemParameters CreateDefaultBuildinFileSystemParameters(string packageRoot = null) + public static FileSystemParameters CreateDefaultBuiltinFileSystemParameters(string packageRoot = null) { string fileSystemClass = typeof(BuiltinFileSystem).FullName; var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot); @@ -90,28 +90,27 @@ namespace YooAsset } /// - /// 创建默认的缓存文件系统参数 + /// 创建默认的沙盒文件系统参数 /// /// 远端资源地址查询服务类 /// 文件系统的根目录 - public static FileSystemParameters CreateDefaultCacheFileSystemParameters(IRemoteServices remoteServices, string packageRoot = null) + public static FileSystemParameters CreateDefaultSandboxFileSystemParameters(IRemoteServices remoteServices, string packageRoot = null) { string fileSystemClass = typeof(SandboxFileSystem).FullName; var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot); - fileSystemParams.AddParameter(FileSystemParametersDefine.REMOTE_SERVICES, remoteServices); + fileSystemParams.AddParameter(FileSystemConsts.REMOTE_SERVICES, remoteServices); return fileSystemParams; } /// /// 创建默认的WebServer文件系统参数 /// - /// 加密文件解密服务类 /// 禁用Unity的网络缓存 public static FileSystemParameters CreateDefaultWebServerFileSystemParameters(bool disableUnityWebCache = false) { string fileSystemClass = typeof(WebServerFileSystem).FullName; var fileSystemParams = new FileSystemParameters(fileSystemClass, null); - fileSystemParams.AddParameter(FileSystemParametersDefine.DISABLE_UNITY_WEB_CACHE, disableUnityWebCache); + fileSystemParams.AddParameter(FileSystemConsts.DISABLE_UNITY_WEB_CACHE, disableUnityWebCache); return fileSystemParams; } @@ -119,14 +118,13 @@ namespace YooAsset /// 创建默认的WebRemote文件系统参数 /// /// 远端资源地址查询服务类 - /// 加密文件解密服务类 /// 禁用Unity的网络缓存 public static FileSystemParameters CreateDefaultWebRemoteFileSystemParameters(IRemoteServices remoteServices, bool disableUnityWebCache = false) { string fileSystemClass = typeof(WebRemoteFileSystem).FullName; var fileSystemParams = new FileSystemParameters(fileSystemClass, null); - fileSystemParams.AddParameter(FileSystemParametersDefine.REMOTE_SERVICES, remoteServices); - fileSystemParams.AddParameter(FileSystemParametersDefine.DISABLE_UNITY_WEB_CACHE, disableUnityWebCache); + fileSystemParams.AddParameter(FileSystemConsts.REMOTE_SERVICES, remoteServices); + fileSystemParams.AddParameter(FileSystemConsts.DISABLE_UNITY_WEB_CACHE, disableUnityWebCache); return fileSystemParams; } #endregion diff --git a/Assets/YooAsset/Runtime/FileSystem/Interfaces/IFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/Interfaces/IFileSystem.cs index b12983c0..cd5f10d5 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Interfaces/IFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Interfaces/IFileSystem.cs @@ -1,6 +1,9 @@ - + namespace YooAsset { + /// + /// 文件系统接口 + /// internal interface IFileSystem { /// @@ -16,17 +19,17 @@ namespace YooAsset /// /// 查询包裹版本 /// - FSRequestVersionOperation RequestVersionAsync(RequestVersionOptions options); + FSRequestPackageVersionOperation RequestPackageVersionAsync(FSRequestPackageVersionOptions options); /// /// 加载包裹清单 /// - FSLoadManifestOperation LoadManifestAsync(LoadManifestOptions options); + FSLoadPackageManifestOperation LoadPackageManifestAsync(FSLoadPackageManifestOptions options); /// - /// 清理缓存文件 + /// 加载Bundle文件 /// - FSClearCacheOperation ClearCacheAsync(ClearCacheOptions options); + FSLoadPackageBundleOperation LoadPackageBundleAsync(FSLoadPackageBundleOptions options); /// /// 下载Bundle文件 @@ -34,9 +37,9 @@ namespace YooAsset FSDownloadFileOperation DownloadFileAsync(FSDownloadFileOptions options); /// - /// 加载Bundle文件 + /// 清理缓存文件 /// - FSLoadBundleOperation LoadBundleAsync(FCLoadBundleOptions options); + FSClearCacheOperation ClearCacheAsync(FSClearCacheOptions options); /// diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/Common/LoadWebPackageManifestOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Operations/Common/LoadWebPackageManifestOperation.cs index 4dfaa558..242dd1bb 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Operations/Common/LoadWebPackageManifestOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Operations/Common/LoadWebPackageManifestOperation.cs @@ -1,5 +1,8 @@ namespace YooAsset { + /// + /// 加载Web远端包裹清单文件操作 + /// internal class LoadWebPackageManifestOperation : AsyncOperationBase { private enum ESteps @@ -12,15 +15,14 @@ namespace YooAsset } private readonly LoadWebPackageManifestOptions _options; - private IDownloadBytesRequest _webDataRequestOp; - private DeserializeManifestOperation _deserializer; - private int _requestCount = 0; + private IDownloadBytesRequest _downloadBytesRequest; + private DeserializeManifestOperation _deserializeManifestOp; private ESteps _steps = ESteps.None; /// /// 包裹清单 /// - public PackageManifest Manifest { private set; get; } + public PackageManifest Manifest { get; private set; } internal LoadWebPackageManifestOperation(LoadWebPackageManifestOptions options) @@ -29,7 +31,6 @@ namespace YooAsset } internal override void InternalStart() { - _requestCount = DownloadFailureCounter.GetFailureCount(_options.PackageName, nameof(LoadWebPackageManifestOperation)); _steps = ESteps.RequestFileData; } internal override void InternalUpdate() @@ -39,20 +40,20 @@ namespace YooAsset if (_steps == ESteps.RequestFileData) { - if (_webDataRequestOp == null) + if (_downloadBytesRequest == null) { string fileName = YooAssetSettingsData.GetManifestBinaryFileName(_options.PackageName, _options.PackageVersion); string url = GetRequestURL(fileName); var args = new DownloadDataRequestArgs(url, _options.Timeout, 0); - _webDataRequestOp = _options.DownloadBackend.CreateBytesRequest(args); - _webDataRequestOp.SendRequest(); + _downloadBytesRequest = _options.DownloadBackend.CreateBytesRequest(args); + _downloadBytesRequest.SendRequest(); } - Progress = _webDataRequestOp.DownloadProgress; - if (_webDataRequestOp.IsDone == false) + Progress = _downloadBytesRequest.DownloadProgress; + if (_downloadBytesRequest.IsDone == false) return; - if (_webDataRequestOp.Status == EDownloadRequestStatus.Succeeded) + if (_downloadBytesRequest.Status == EDownloadRequestStatus.Succeeded) { _steps = ESteps.VerifyFileData; } @@ -60,14 +61,14 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _webDataRequestOp.Error; - DownloadFailureCounter.RecordFailure(_options.PackageName, nameof(LoadWebPackageManifestOperation)); + Error = _downloadBytesRequest.Error; + _options.URLPolicy.OnFailure(_downloadBytesRequest.Url, _downloadBytesRequest.HttpCode, _downloadBytesRequest.HttpError); } } if (_steps == ESteps.VerifyFileData) { - if (PackageManifestTools.VerifyManifestData(_webDataRequestOp.Result, _options.PackageHash)) + if (PackageManifestTools.VerifyManifestData(_downloadBytesRequest.Result, _options.PackageHash)) { _steps = ESteps.LoadManifest; } @@ -81,52 +82,49 @@ namespace YooAsset if (_steps == ESteps.LoadManifest) { - if (_deserializer == null) + if (_deserializeManifestOp == null) { - _deserializer = new DeserializeManifestOperation(_options.ManifestDecryptor, _webDataRequestOp.Result); - _deserializer.StartOperation(); - AddChildOperation(_deserializer); + _deserializeManifestOp = new DeserializeManifestOperation(_options.ManifestDecryptor, _downloadBytesRequest.Result); + _deserializeManifestOp.StartOperation(); + AddChildOperation(_deserializeManifestOp); } - _deserializer.UpdateOperation(); - Progress = _deserializer.Progress; - if (_deserializer.IsDone == false) + _deserializeManifestOp.UpdateOperation(); + Progress = _deserializeManifestOp.Progress; + if (_deserializeManifestOp.IsDone == false) return; - if (_deserializer.Status == EOperationStatus.Succeeded) + if (_deserializeManifestOp.Status == EOperationStatus.Succeeded) { _steps = ESteps.Done; - Manifest = _deserializer.Manifest; + Manifest = _deserializeManifestOp.Manifest; Status = EOperationStatus.Succeeded; } else { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _deserializer.Error; + Error = _deserializeManifestOp.Error; } } } internal override void InternalDispose() { - if (_webDataRequestOp != null) + if (_downloadBytesRequest != null) { - _webDataRequestOp.Dispose(); - _webDataRequestOp = null; + _downloadBytesRequest.Dispose(); + _downloadBytesRequest = null; } } internal override string InternalGetDescription() { - return $"PackageVersion : {_options.PackageVersion} PackageHash : {_options.PackageHash}"; + return $"PackageVersion: {_options.PackageVersion} PackageHash: {_options.PackageHash}"; } private string GetRequestURL(string fileName) { - // 轮流返回请求地址 - if (_requestCount % 2 == 0) - return _options.RemoteServices.GetRemoteMainURL(fileName); - else - return _options.RemoteServices.GetRemoteFallbackURL(fileName); + var urls = _options.RemoteServices.GetRemoteURLs(fileName); + return _options.URLPolicy.SelectURL(urls); } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/Common/LoadWebPackageManifestOptions.cs b/Assets/YooAsset/Runtime/FileSystem/Operations/Common/LoadWebPackageManifestOptions.cs index 2685308b..b5db96ad 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Operations/Common/LoadWebPackageManifestOptions.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Operations/Common/LoadWebPackageManifestOptions.cs @@ -10,5 +10,6 @@ namespace YooAsset public IRemoteServices RemoteServices { get; set; } public IManifestDecryptor ManifestDecryptor { get; set; } public IDownloadBackend DownloadBackend { get; set; } + public IDownloadURLPolicy URLPolicy { get; set; } } } diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/Common/RequestWebPackageHashOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Operations/Common/RequestWebPackageHashOperation.cs index fce6f1f2..5972b3ab 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Operations/Common/RequestWebPackageHashOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Operations/Common/RequestWebPackageHashOperation.cs @@ -1,5 +1,8 @@ namespace YooAsset { + /// + /// 请求Web远端包裹哈希操作 + /// internal class RequestWebPackageHashOperation : AsyncOperationBase { private enum ESteps @@ -10,14 +13,13 @@ namespace YooAsset } private readonly RequestWebPackageHashOptions _options; - private IDownloadTextRequest _webTextRequestOp; - private int _requestCount = 0; + private IDownloadTextRequest _downloadTextRequest; private ESteps _steps = ESteps.None; /// /// 包裹哈希值 /// - public string PackageHash { private set; get; } + public string PackageHash { get; private set; } public RequestWebPackageHashOperation(RequestWebPackageHashOptions options) @@ -26,7 +28,6 @@ namespace YooAsset } internal override void InternalStart() { - _requestCount = DownloadFailureCounter.GetFailureCount(_options.PackageName, nameof(RequestWebPackageHashOperation)); _steps = ESteps.RequestPackageHash; } internal override void InternalUpdate() @@ -36,27 +37,27 @@ namespace YooAsset if (_steps == ESteps.RequestPackageHash) { - if (_webTextRequestOp == null) + if (_downloadTextRequest == null) { string fileName = YooAssetSettingsData.GetPackageHashFileName(_options.PackageName, _options.PackageVersion); string url = GetRequestURL(fileName); var args = new DownloadDataRequestArgs(url, _options.Timeout, 0); - _webTextRequestOp = _options.DownloadBackend.CreateTextRequest(args); - _webTextRequestOp.SendRequest(); + _downloadTextRequest = _options.DownloadBackend.CreateTextRequest(args); + _downloadTextRequest.SendRequest(); } - Progress = _webTextRequestOp.DownloadProgress; - if (_webTextRequestOp.IsDone == false) + Progress = _downloadTextRequest.DownloadProgress; + if (_downloadTextRequest.IsDone == false) return; - if (_webTextRequestOp.Status == EDownloadRequestStatus.Succeeded) + if (_downloadTextRequest.Status == EDownloadRequestStatus.Succeeded) { - PackageHash = _webTextRequestOp.Result; - if (string.IsNullOrEmpty(PackageHash)) + PackageHash = _downloadTextRequest.Result; + if (TextUtility.ValidateContent(PackageHash, out string validateError) == false) { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"Web package hash file content is empty."; + Error = $"Web package hash file validate failed: {validateError}"; } else { @@ -68,27 +69,24 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _webTextRequestOp.Error; - DownloadFailureCounter.RecordFailure(_options.PackageName, nameof(RequestWebPackageHashOperation)); + Error = _downloadTextRequest.Error; + _options.URLPolicy.OnFailure(_downloadTextRequest.Url, _downloadTextRequest.HttpCode, _downloadTextRequest.HttpError); } } } internal override void InternalDispose() { - if (_webTextRequestOp != null) + if (_downloadTextRequest != null) { - _webTextRequestOp.Dispose(); - _webTextRequestOp = null; + _downloadTextRequest.Dispose(); + _downloadTextRequest = null; } } private string GetRequestURL(string fileName) { - // 轮流返回请求地址 - if (_requestCount % 2 == 0) - return _options.RemoteServices.GetRemoteMainURL(fileName); - else - return _options.RemoteServices.GetRemoteFallbackURL(fileName); + var urls = _options.RemoteServices.GetRemoteURLs(fileName); + return _options.URLPolicy.SelectURL(urls); } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/Common/RequestWebPackageHashOptions.cs b/Assets/YooAsset/Runtime/FileSystem/Operations/Common/RequestWebPackageHashOptions.cs index 96d0d119..2bca92ee 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Operations/Common/RequestWebPackageHashOptions.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Operations/Common/RequestWebPackageHashOptions.cs @@ -8,5 +8,6 @@ namespace YooAsset public IRemoteServices RemoteServices { get; set; } public IDownloadBackend DownloadBackend { get; set; } + public IDownloadURLPolicy URLPolicy { get; set; } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/Common/RequestWebPackageVersionOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Operations/Common/RequestWebPackageVersionOperation.cs index c58a463c..6a98ff5b 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Operations/Common/RequestWebPackageVersionOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Operations/Common/RequestWebPackageVersionOperation.cs @@ -1,5 +1,8 @@ namespace YooAsset { + /// + /// 请求Web远端包裹版本操作 + /// internal class RequestWebPackageVersionOperation : AsyncOperationBase { private enum ESteps @@ -10,14 +13,13 @@ namespace YooAsset } private readonly RequestWebPackageVersionOptions _options; - private IDownloadTextRequest _webTextRequestOp; - private int _requestCount = 0; + private IDownloadTextRequest _downloadTextRequest; private ESteps _steps = ESteps.None; /// /// 包裹版本 /// - public string PackageVersion { private set; get; } + public string PackageVersion { get; private set; } public RequestWebPackageVersionOperation(RequestWebPackageVersionOptions options) @@ -26,7 +28,6 @@ namespace YooAsset } internal override void InternalStart() { - _requestCount = DownloadFailureCounter.GetFailureCount(_options.PackageName, nameof(RequestWebPackageVersionOperation)); _steps = ESteps.RequestPackageVersion; } internal override void InternalUpdate() @@ -36,27 +37,27 @@ namespace YooAsset if (_steps == ESteps.RequestPackageVersion) { - if (_webTextRequestOp == null) + if (_downloadTextRequest == null) { string fileName = YooAssetSettingsData.GetPackageVersionFileName(_options.PackageName); string url = GetRequestURL(fileName); var args = new DownloadDataRequestArgs(url, _options.Timeout, 0); - _webTextRequestOp = _options.DownloadBackend.CreateTextRequest(args); - _webTextRequestOp.SendRequest(); + _downloadTextRequest = _options.DownloadBackend.CreateTextRequest(args); + _downloadTextRequest.SendRequest(); } - Progress = _webTextRequestOp.DownloadProgress; - if (_webTextRequestOp.IsDone == false) + Progress = _downloadTextRequest.DownloadProgress; + if (_downloadTextRequest.IsDone == false) return; - if (_webTextRequestOp.Status == EDownloadRequestStatus.Succeeded) + if (_downloadTextRequest.Status == EDownloadRequestStatus.Succeeded) { - PackageVersion = _webTextRequestOp.Result; - if (string.IsNullOrEmpty(PackageVersion)) + PackageVersion = _downloadTextRequest.Result; + if (TextUtility.ValidateContent(PackageVersion, out string validateError) == false) { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"Web package version file content is empty."; + Error = $"Web package version file validate failed: {validateError}"; } else { @@ -68,29 +69,24 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _webTextRequestOp.Error; - DownloadFailureCounter.RecordFailure(_options.PackageName, nameof(RequestWebPackageVersionOperation)); + Error = _downloadTextRequest.Error; + _options.URLPolicy.OnFailure(_downloadTextRequest.Url, _downloadTextRequest.HttpCode, _downloadTextRequest.HttpError); } } } internal override void InternalDispose() { - if (_webTextRequestOp != null) + if (_downloadTextRequest != null) { - _webTextRequestOp.Dispose(); - _webTextRequestOp = null; + _downloadTextRequest.Dispose(); + _downloadTextRequest = null; } } private string GetRequestURL(string fileName) { - string url; - - // 轮流返回请求地址 - if (_requestCount % 2 == 0) - url = _options.RemoteServices.GetRemoteMainURL(fileName); - else - url = _options.RemoteServices.GetRemoteFallbackURL(fileName); + var urls = _options.RemoteServices.GetRemoteURLs(fileName); + string url = _options.URLPolicy.SelectURL(urls); // 在URL末尾添加时间戳 if (_options.AppendTimeTicks) diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/Common/RequestWebPackageVersionOptions.cs b/Assets/YooAsset/Runtime/FileSystem/Operations/Common/RequestWebPackageVersionOptions.cs index 8a744ea5..22c2f6f2 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Operations/Common/RequestWebPackageVersionOptions.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Operations/Common/RequestWebPackageVersionOptions.cs @@ -8,5 +8,6 @@ namespace YooAsset public IRemoteServices RemoteServices { get; set; } public IDownloadBackend DownloadBackend { get; set; } + public IDownloadURLPolicy URLPolicy { get; set; } } } diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/FSClearCacheOptions.cs b/Assets/YooAsset/Runtime/FileSystem/Operations/FSClearCacheOptions.cs new file mode 100644 index 00000000..0d0cff73 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Operations/FSClearCacheOptions.cs @@ -0,0 +1,36 @@ + +namespace YooAsset +{ + /// + /// 清理缓存操作选项 + /// + internal struct FSClearCacheOptions + { + /// + /// 清理模式 + /// + public string ClearMode { get; set; } + + /// + /// 附加参数 + /// + public object ClearParam { get; set; } + + /// + /// 资源清单 + /// + public PackageManifest Manifest { get; set; } + + /// + /// 转换为 FileCache 的清理选项 + /// + public FCClearCacheOptions ConvertTo() + { + var options = new FCClearCacheOptions(); + options.ClearMode = ClearMode; + options.ClearParam = ClearParam; + options.Manifest = Manifest; + return options; + } + } +} diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/FSClearCacheOptions.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Operations/FSClearCacheOptions.cs.meta new file mode 100644 index 00000000..e695ac89 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Operations/FSClearCacheOptions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8b101c60f3954004daf353498f618e22 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/FSDownloadFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Operations/FSDownloadFileOperation.cs index f4f9693a..44b0a739 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Operations/FSDownloadFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Operations/FSDownloadFileOperation.cs @@ -1,26 +1,24 @@ - + namespace YooAsset { + /// + /// 下载文件操作的抽象基类 + /// internal abstract class FSDownloadFileOperation : AsyncOperationBase { - public PackageBundle Bundle { private set; get; } + /// + /// 关联的资源包信息 + /// + public PackageBundle Bundle { get; private set; } /// - /// 当前下载的字节数 + /// 下载报告 /// - public long DownloadedBytes { protected set; get; } - - /// - /// 当前下载进度(0f - 1f) - /// - public float DownloadProgress { protected set; get; } - + public DownloadReport Report { get; protected set; } public FSDownloadFileOperation(PackageBundle bundle) { Bundle = bundle; - DownloadedBytes = 0; - DownloadProgress = 0; } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadBundleOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadBundleOperation.cs deleted file mode 100644 index 2c18b185..00000000 --- a/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadBundleOperation.cs +++ /dev/null @@ -1,26 +0,0 @@ - -namespace YooAsset -{ - internal abstract class FSLoadBundleOperation : AsyncOperationBase - { - /// - /// 加载结果 - /// - public IBundleResult Result { protected set; get; } - - /// - /// 下载进度 - /// - public float DownloadProgress { protected set; get; } - - /// - /// 下载大小 - /// - public long DownloadedBytes { protected set; get; } - - /// - /// 终止下载文件 - /// - public bool AbortDownloadFile = false; - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageBundleOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageBundleOperation.cs new file mode 100644 index 00000000..63e7a984 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageBundleOperation.cs @@ -0,0 +1,19 @@ + +namespace YooAsset +{ + /// + /// 加载资源包文件操作的抽象基类 + /// + internal abstract class FSLoadPackageBundleOperation : AsyncOperationBase + { + /// + /// 资源包句柄 + /// + public IBundleHandle BundleHandle { get; protected set; } + + /// + /// 终止下载文件 + /// + public bool AbortDownloadFile = false; + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadBundleOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageBundleOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadBundleOperation.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageBundleOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageBundleOptions.cs b/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageBundleOptions.cs new file mode 100644 index 00000000..ab23ffa0 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageBundleOptions.cs @@ -0,0 +1,27 @@ + +namespace YooAsset +{ + /// + /// 加载资源包操作选项 + /// + internal readonly struct FSLoadPackageBundleOptions + { + /// + /// 资源包 + /// + public readonly PackageBundle Bundle; + + public FSLoadPackageBundleOptions(PackageBundle bundle) + { + Bundle = bundle; + } + + /// + /// 转换为 FileCache 的加载选项 + /// + public FCLoadBundleOptions ConvertTo() + { + return new FCLoadBundleOptions(Bundle); + } + } +} diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageBundleOptions.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageBundleOptions.cs.meta new file mode 100644 index 00000000..0b7d23e7 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageBundleOptions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 31b4d0371eae35749aebe94c93c7cae3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadManifestOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageManifestOperation.cs similarity index 67% rename from Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadManifestOperation.cs rename to Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageManifestOperation.cs index b69be2e4..72a99692 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadManifestOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageManifestOperation.cs @@ -1,7 +1,7 @@  namespace YooAsset { - internal abstract class FSLoadManifestOperation : AsyncOperationBase + internal abstract class FSLoadPackageManifestOperation : AsyncOperationBase { /// /// 资源清单 diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadManifestOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageManifestOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadManifestOperation.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageManifestOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageManifestOptions.cs b/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageManifestOptions.cs new file mode 100644 index 00000000..1bac69ee --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageManifestOptions.cs @@ -0,0 +1,25 @@ + +namespace YooAsset +{ + /// + /// 加载包裹清单操作选项 + /// + internal readonly struct FSLoadPackageManifestOptions + { + /// + /// 包裹版本 + /// + public readonly string PackageVersion; + + /// + /// 超时时间 + /// + public readonly int Timeout; + + public FSLoadPackageManifestOptions(string packageVersion, int timeout) + { + PackageVersion = packageVersion; + Timeout = timeout; + } + } +} diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageManifestOptions.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageManifestOptions.cs.meta new file mode 100644 index 00000000..2112ac2a --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Operations/FSLoadPackageManifestOptions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5015b71d4115e724880b025f48bbbacc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/FSRequestVersionOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Operations/FSRequestPackageVersionOperation.cs similarity index 66% rename from Assets/YooAsset/Runtime/FileSystem/Operations/FSRequestVersionOperation.cs rename to Assets/YooAsset/Runtime/FileSystem/Operations/FSRequestPackageVersionOperation.cs index 0495532f..a0cc5e40 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Operations/FSRequestVersionOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Operations/FSRequestPackageVersionOperation.cs @@ -1,7 +1,7 @@  namespace YooAsset { - internal abstract class FSRequestVersionOperation : AsyncOperationBase + internal abstract class FSRequestPackageVersionOperation : AsyncOperationBase { /// /// 资源版本 diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/FSRequestVersionOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Operations/FSRequestPackageVersionOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Operations/FSRequestVersionOperation.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/Operations/FSRequestPackageVersionOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/FSRequestPackageVersionOptions.cs b/Assets/YooAsset/Runtime/FileSystem/Operations/FSRequestPackageVersionOptions.cs new file mode 100644 index 00000000..6aabfbf1 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Operations/FSRequestPackageVersionOptions.cs @@ -0,0 +1,25 @@ + +namespace YooAsset +{ + /// + /// 请求包裹版本操作选项 + /// + internal readonly struct FSRequestPackageVersionOptions + { + /// + /// 在URL末尾添加时间戳 + /// + public readonly bool AppendTimeTicks; + + /// + /// 超时时间 + /// + public readonly int Timeout; + + public FSRequestPackageVersionOptions(bool appendTimeTicks, int timeout) + { + AppendTimeTicks = appendTimeTicks; + Timeout = timeout; + } + } +} diff --git a/Assets/YooAsset/Runtime/FileSystem/Operations/FSRequestPackageVersionOptions.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Operations/FSRequestPackageVersionOptions.cs.meta new file mode 100644 index 00000000..5bfd0222 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Operations/FSRequestPackageVersionOptions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fab7c8b0f6490b44fa8686d5348da201 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/BuiltinFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/BuiltinFileSystem.cs index 2fd15332..80bd8f30 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/BuiltinFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/BuiltinFileSystem.cs @@ -13,19 +13,19 @@ namespace YooAsset protected readonly Dictionary _builtinFilePathMapping = new Dictionary(10000); protected readonly Dictionary _tempFilePathMapping = new Dictionary(10000); protected string _packageRoot; - protected string _unpackTempFilesRoot; + protected string _tempFilesRoot; protected string _unpackManifestFilesRoot; protected string _unpackBundleFilesRoot; /// /// 内置文件缓存系统 /// - public IFileCache BuiltinFileCache { private set; get; } + public IFileCache BuiltinFileCache { get; private set; } /// /// 沙盒文件缓存系统 /// - public IFileCache UnpackFileCache { private set; get; } + public IFileCache UnpackFileCache { get; private set; } /// /// 解压调度器 @@ -35,62 +35,64 @@ namespace YooAsset /// /// 下载后台接口 /// - public IDownloadBackend DownloadBackend { private set; get; } + public IDownloadBackend DownloadBackend { get; private set; } /// /// 包裹名称 /// - public string PackageName { private set; get; } + public string PackageName { get; private set; } #region 自定义参数 /// /// 自定义参数:UnityWebRequest 创建委托 /// - public UnityWebRequestCreator WebRequestCreator { private set; get; } + public UnityWebRequestCreator WebRequestCreator { get; private set; } /// /// 自定义参数:覆盖安装缓存清理模式 /// - public EInstallCleanupMode InstallClearMode { private set; get; } = EInstallCleanupMode.ClearAllManifestFiles; + public EInstallCleanupMode InstallCleanupMode { get; private set; } = EInstallCleanupMode.None; /// /// 自定义参数:初始化的时候缓存文件校验级别 /// - public EFileVerifyLevel FileVerifyLevel { private set; get; } = EFileVerifyLevel.Middle; + public EFileVerifyLevel FileVerifyLevel { get; private set; } = EFileVerifyLevel.Low; /// /// 自定义参数:初始化的时候缓存文件校验最大并发数 + /// 默认值:8(推荐值为处理器数两倍) + /// 说明:过大的值可能导致线程池任务过多,影响系统稳定性 /// - public int FileVerifyMaxConcurrency { private set; get; } = 32; + public int FileVerifyMaxConcurrency { get; private set; } = 8; /// /// 自定义参数:拷贝内置清单 /// - public bool CopyBuildinPackageManifest { private set; get; } = false; + public bool CopyBuiltinPackageManifest { get; private set; } = false; /// /// 自定义参数:拷贝内置清单的目标目录 /// 注意:该参数为空的时候,会获取默认的沙盒目录! /// - public string CopyBuildinPackageManifestDestRoot { private set; get; } + public string CopyBuiltinPackageManifestDestRoot { get; private set; } /// /// 自定义参数:解压文件系统的根目录 /// - public string UnpackFileSystemRoot { private set; get; } + public string UnpackFileSystemRoot { get; private set; } /// /// 自定义参数:最大并发连接数 /// 默认值:8(推荐范围 1-32) /// - public int UnpackMaxConcurrency { private set; get; } + public int UnpackMaxConcurrency { get; private set; } = 8; /// /// 自定义参数:每帧发起的最大请求数 /// 默认值:8(推荐范围 1-32) /// 说明:避免单帧发起过多请求导致卡顿 /// - public int UnpackMaxRequestPerFrame { private set; get; } + public int UnpackMaxRequestPerFrame { get; private set; } = 8; /// /// 自定义参数:AssetBundle 解密器 @@ -110,7 +112,7 @@ namespace YooAsset /// /// 自定义参数:资源清单解密器 /// - public IManifestDecryptor ManifestDecryptor { private set; get; } + public IManifestDecryptor ManifestDecryptor { get; private set; } #endregion @@ -122,19 +124,19 @@ namespace YooAsset var operation = new BFSInitializeOperation(this); return operation; } - public virtual FSRequestVersionOperation RequestVersionAsync(RequestVersionOptions options) + public virtual FSRequestPackageVersionOperation RequestPackageVersionAsync(FSRequestPackageVersionOptions options) { - var operation = new BFSRequestVersionOperation(this); + var operation = new BFSRequestPackageVersionOperation(this); return operation; } - public virtual FSLoadManifestOperation LoadManifestAsync(LoadManifestOptions options) + public virtual FSLoadPackageManifestOperation LoadPackageManifestAsync(FSLoadPackageManifestOptions options) { - var operation = new BFSLoadManifestOperation(this, options.PackageVersion); + var operation = new BFSLoadPackageManifestOperation(this, options.PackageVersion); return operation; } - public virtual FSClearCacheOperation ClearCacheAsync(ClearCacheOptions options) + public virtual FSLoadPackageBundleOperation LoadPackageBundleAsync(FSLoadPackageBundleOptions options) { - var operation = new BFSClearCacheOperation(this, options); + var operation = new BFSLoadPackageBundleOperation(this, options); return operation; } public virtual FSDownloadFileOperation DownloadFileAsync(FSDownloadFileOptions options) @@ -142,48 +144,61 @@ namespace YooAsset var operation = new BFSDownloadFileOperation(this, options); return operation; } - public virtual FSLoadBundleOperation LoadBundleAsync(FCLoadBundleOptions options) + public virtual FSClearCacheOperation ClearCacheAsync(FSClearCacheOptions options) { - var operation = new BFSLoadBundleOperation(this, options); - return operation; + if (options.ClearMode == EManifestClearMode.ClearAllManifestFiles.ToString()) + { + var operation = new FSClearCacheCompleteOperation(); + return operation; + } + else if (options.ClearMode == EManifestClearMode.ClearUnusedManifestFiles.ToString()) + { + var operation = new FSClearCacheCompleteOperation(); + return operation; + } + else + { + var operation = new BFSClearCacheOperation(this, options); + return operation; + } } public virtual void SetParameter(string name, object value) { - if (name == FileSystemParametersDefine.DOWNLOAD_BACKEND) + if (name == FileSystemConsts.DOWNLOAD_BACKEND) { DownloadBackend = (IDownloadBackend)value; } - else if (name == FileSystemParametersDefine.UNITY_WEB_REQUEST_CREATOR) + else if (name == FileSystemConsts.UNITY_WEB_REQUEST_CREATOR) { WebRequestCreator = (UnityWebRequestCreator)value; } - else if (name == FileSystemParametersDefine.INSTALL_CLEAR_MODE) + else if (name == FileSystemConsts.INSTALL_CLEANUP_MODE) { - InstallClearMode = (EInstallCleanupMode)value; + InstallCleanupMode = (EInstallCleanupMode)value; } - else if (name == FileSystemParametersDefine.FILE_VERIFY_LEVEL) + else if (name == FileSystemConsts.FILE_VERIFY_LEVEL) { FileVerifyLevel = (EFileVerifyLevel)value; } - else if (name == FileSystemParametersDefine.FILE_VERIFY_MAX_CONCURRENCY) + else if (name == FileSystemConsts.FILE_VERIFY_MAX_CONCURRENCY) { int convertValue = Convert.ToInt32(value); FileVerifyMaxConcurrency = Mathf.Clamp(convertValue, 1, int.MaxValue); } - else if (name == FileSystemParametersDefine.COPY_BUILDIN_PACKAGE_MANIFEST) + else if (name == FileSystemConsts.COPY_BUILTIN_PACKAGE_MANIFEST) { - CopyBuildinPackageManifest = Convert.ToBoolean(value); + CopyBuiltinPackageManifest = Convert.ToBoolean(value); } - else if (name == FileSystemParametersDefine.COPY_BUILDIN_PACKAGE_MANIFEST_DEST_ROOT) + else if (name == FileSystemConsts.COPY_BUILTIN_PACKAGE_MANIFEST_DEST_ROOT) { - CopyBuildinPackageManifestDestRoot = (string)value; + CopyBuiltinPackageManifestDestRoot = (string)value; } - else if (name == FileSystemParametersDefine.UNPACK_FILE_SYSTEM_ROOT) + else if (name == FileSystemConsts.UNPACK_FILE_SYSTEM_ROOT) { UnpackFileSystemRoot = (string)value; } - else if (name == FileSystemParametersDefine.DOWNLOAD_MAX_CONCURRENCY) + else if (name == FileSystemConsts.DOWNLOAD_MAX_CONCURRENCY) { int convertValue = Convert.ToInt32(value); if (convertValue > 32) @@ -194,7 +209,7 @@ namespace YooAsset // 限制在合理范围内:1-32 UnpackMaxConcurrency = Mathf.Clamp(convertValue, 1, 32); } - else if (name == FileSystemParametersDefine.DOWNLOAD_MAX_REQUEST_PER_FRAME) + else if (name == FileSystemConsts.DOWNLOAD_MAX_REQUEST_PER_FRAME) { int convertValue = Convert.ToInt32(value); if (convertValue > 32) @@ -205,25 +220,25 @@ namespace YooAsset // 限制在合理范围内:1-32 UnpackMaxRequestPerFrame = Mathf.Clamp(convertValue, 1, 32); } - else if (name == FileSystemParametersDefine.ASSETBUNDLE_DECRYPTOR) + else if (name == FileSystemConsts.ASSETBUNDLE_DECRYPTOR) { AssetBundleDecryptor = (IBundleDecryptor)value; } - else if (name == FileSystemParametersDefine.RAWBUNDLE_DECRYPTOR) + else if (name == FileSystemConsts.RAWBUNDLE_DECRYPTOR) { RawBundleDecryptor = (IBundleDecryptor)value; } - else if (name == FileSystemParametersDefine.ASSETBUNDLE_FALLBACK_DECRYPTOR) + else if (name == FileSystemConsts.ASSETBUNDLE_FALLBACK_DECRYPTOR) { AssetBundleFallbackDecryptor = (IBundleMemoryDecryptor)value; } - else if (name == FileSystemParametersDefine.MANIFEST_DECRYPTOR) + else if (name == FileSystemConsts.MANIFEST_DECRYPTOR) { ManifestDecryptor = (IManifestDecryptor)value; } else { - YooLogger.Warning($"Invalid parameter : {name}"); + YooLogger.Warning($"Invalid parameter: {name}"); } } public virtual void OnCreate(string packageName, string packageRoot) @@ -238,12 +253,12 @@ namespace YooAsset // 设置根目录 string unpackRoot; if (string.IsNullOrEmpty(UnpackFileSystemRoot)) - unpackRoot = GetDefaultUnpackPathRoot(packageName); + unpackRoot = GetDefaultUnpackPackageRoot(packageName); else unpackRoot = UnpackFileSystemRoot; - _unpackManifestFilesRoot = PathUtility.Combine(unpackRoot, BuiltinFileSystemDefine.UnpackManifestFilesFolderName); - _unpackBundleFilesRoot = PathUtility.Combine(unpackRoot, BuiltinFileSystemDefine.UnpackBundleFilesFolderName); - _unpackTempFilesRoot = PathUtility.Combine(unpackRoot, BuiltinFileSystemDefine.UnpackTempFilesFolderName); + _unpackManifestFilesRoot = PathUtility.Combine(unpackRoot, BuiltinFileSystemConsts.UnpackManifestFilesFolderName); + _unpackBundleFilesRoot = PathUtility.Combine(unpackRoot, BuiltinFileSystemConsts.UnpackBundleFilesFolderName); + _tempFilesRoot = PathUtility.Combine(unpackRoot, BuiltinFileSystemConsts.UnpackTempFilesFolderName); // 创建默认的下载后台接口 if (DownloadBackend == null) @@ -285,7 +300,7 @@ namespace YooAsset if (UnpackScheduler != null) { - UnpackScheduler.Dispose(); + UnpackScheduler.AbortOperation(); UnpackScheduler = null; } @@ -342,12 +357,19 @@ namespace YooAsset } #region 内部方法 + /// + /// 获取默认的内置包裹根目录 + /// public string GetDefaultBuiltinPackageRoot(string packageName) { - string rootDirectory = YooAssetSettingsData.GetYooDefaultBuildinRoot(); + string rootDirectory = YooAssetSettingsData.GetYooDefaultBuiltinRoot(); return PathUtility.Combine(rootDirectory, packageName); } - public string GetBuiltinFileLoadPath(PackageBundle bundle) + + /// + /// 获取内置文件路径 + /// + public string GetBuiltinBundleFilePath(PackageBundle bundle) { if (_builtinFilePathMapping.TryGetValue(bundle.BundleGUID, out string filePath) == false) { @@ -356,28 +378,44 @@ namespace YooAsset } return filePath; } + + /// + /// 获取内置包裹版本文件路径 + /// public string GetBuiltinPackageVersionFilePath() { string fileName = YooAssetSettingsData.GetPackageVersionFileName(PackageName); return PathUtility.Combine(_packageRoot, fileName); } + + /// + /// 获取内置包裹哈希文件路径 + /// public string GetBuiltinPackageHashFilePath(string packageVersion) { string fileName = YooAssetSettingsData.GetPackageHashFileName(PackageName, packageVersion); return PathUtility.Combine(_packageRoot, fileName); } + + /// + /// 获取内置包裹清单文件路径 + /// public string GetBuiltinPackageManifestFilePath(string packageVersion) { string fileName = YooAssetSettingsData.GetManifestBinaryFileName(PackageName, packageVersion); return PathUtility.Combine(_packageRoot, fileName); } - public string GetSandboxAppFootPrintFilePath() + + /// + /// 获取沙盒应用程序水印文件路径 + /// + public string GetSandboxAppFootprintFilePath() { - return PathUtility.Combine(_unpackManifestFilesRoot, SandboxFileSystemDefine.AppFootPrintFileName); + return PathUtility.Combine(_unpackManifestFilesRoot, SandboxFileSystemConsts.AppFootprintFileName); } /// - /// 删除所有解压的资源文件 + /// 删除所有缓存的资源文件 /// public void DeleteAllBundleFiles() { @@ -387,10 +425,32 @@ namespace YooAsset } } + /// + /// 删除所有缓存的清单文件 + /// + public void DeleteAllManifestFiles() + { + if (Directory.Exists(_unpackManifestFilesRoot)) + { + Directory.Delete(_unpackManifestFilesRoot, true); + } + } + + /// + /// 删除所有缓存的临时文件 + /// + public void DeleteAllTempFIles() + { + if (Directory.Exists(_tempFilesRoot)) + { + Directory.Delete(_tempFilesRoot, true); + } + } + /// /// 获取默认的解压根目录 /// - public string GetDefaultUnpackPathRoot(string packageName) + public string GetDefaultUnpackPackageRoot(string packageName) { string rootDirectory = YooAssetSettingsData.GetYooDefaultCacheRoot(); return PathUtility.Combine(rootDirectory, packageName); @@ -403,7 +463,7 @@ namespace YooAsset { if (_tempFilePathMapping.TryGetValue(bundle.BundleGUID, out string filePath) == false) { - filePath = PathUtility.Combine(_unpackTempFilesRoot, bundle.BundleGUID); + filePath = PathUtility.Combine(_tempFilesRoot, bundle.BundleGUID); _tempFilePathMapping.Add(bundle.BundleGUID, filePath); } return filePath; diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/BuiltinFileSystemDefine.cs b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/BuiltinFileSystemConsts.cs similarity index 82% rename from Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/BuiltinFileSystemDefine.cs rename to Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/BuiltinFileSystemConsts.cs index 10012505..d4cfead5 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/BuiltinFileSystemDefine.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/BuiltinFileSystemConsts.cs @@ -1,7 +1,10 @@ namespace YooAsset { - internal class BuiltinFileSystemDefine + /// + /// 内置文件系统常量定义 + /// + internal class BuiltinFileSystemConsts { /// /// 解压清单文件的文件夹名称 diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/BuiltinFileSystemDefine.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/BuiltinFileSystemConsts.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/BuiltinFileSystemDefine.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/BuiltinFileSystemConsts.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSClearCacheOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSClearCacheOperation.cs index 61ce1a75..d4ebe6a5 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSClearCacheOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSClearCacheOperation.cs @@ -1,6 +1,9 @@ - + namespace YooAsset { + /// + /// 内置文件系统的清理缓存操作 + /// internal class BFSClearCacheOperation : FSClearCacheOperation { private enum ESteps @@ -11,11 +14,11 @@ namespace YooAsset } private readonly BuiltinFileSystem _fileSystem; - private readonly ClearCacheOptions _options; + private readonly FSClearCacheOptions _options; private FCClearCacheOperation _clearCacheOp; private ESteps _steps = ESteps.None; - internal BFSClearCacheOperation(BuiltinFileSystem fileSystem, ClearCacheOptions options) + internal BFSClearCacheOperation(BuiltinFileSystem fileSystem, FSClearCacheOptions options) { _fileSystem = fileSystem; _options = options; @@ -33,7 +36,7 @@ namespace YooAsset { if (_clearCacheOp == null) { - _clearCacheOp = _fileSystem.UnpackFileCache.ClearCacheAsync(_options); + _clearCacheOp = _fileSystem.UnpackFileCache.ClearCacheAsync(_options.ConvertTo()); _clearCacheOp.StartOperation(); AddChildOperation(_clearCacheOp); } diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSDownloadFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSDownloadFileOperation.cs index 7d6037aa..2614e771 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSDownloadFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSDownloadFileOperation.cs @@ -1,15 +1,17 @@ -using UnityEngine; namespace YooAsset { + /// + /// 内置文件系统的解压文件操作 + /// internal class BFSDownloadFileOperation : FSDownloadFileOperation { private enum ESteps { None, CheckExists, - UnpackAndCache, - TryAgain, + CreateUnpack, + CheckUnpack, Done, } @@ -18,15 +20,10 @@ namespace YooAsset private DownloadFileBaseOperation _downloadFileOp; private ESteps _steps = ESteps.None; - // 失败重试 - private float _tryAgainTimer = 0; - private int _failedTryAgain; - internal BFSDownloadFileOperation(BuiltinFileSystem fileSystem, FSDownloadFileOptions options) : base(options.Bundle) { _fileSystem = fileSystem; _options = options; - _failedTryAgain = options.RetryCount; } internal override void InternalStart() { @@ -47,31 +44,33 @@ namespace YooAsset } else { - _steps = ESteps.UnpackAndCache; + _steps = ESteps.CreateUnpack; } } - // 下载并缓存文件 - if (_steps == ESteps.UnpackAndCache) + // 创建解压器 + if (_steps == ESteps.CreateUnpack) { + _downloadFileOp = _fileSystem.UnpackScheduler.TryGetDownloadFile(Bundle); if (_downloadFileOp == null) { - _downloadFileOp = _fileSystem.UnpackScheduler.TryGetDownloadFile(Bundle); - if (_downloadFileOp == null) - { - string builtinFilePath = _fileSystem.GetBuiltinFileLoadPath(Bundle); - _downloadFileOp = new UnpackAndCacheFileOperation(_fileSystem, Bundle, builtinFilePath); - _fileSystem.UnpackScheduler.AddDownloadFile(_downloadFileOp); - } + string builtinFilePath = _fileSystem.GetBuiltinBundleFilePath(Bundle); + _downloadFileOp = new UnpackAndCacheFileOperation(_fileSystem, Bundle, builtinFilePath); + _fileSystem.UnpackScheduler.AddDownloadFile(_downloadFileOp); } + _steps = ESteps.CheckUnpack; + } + + // 检测结果 + if (_steps == ESteps.CheckUnpack) + { if (IsWaitForCompletion) _downloadFileOp.WaitForCompletion(); _downloadFileOp.UpdateOperation(); Progress = _downloadFileOp.Progress; - DownloadedBytes = _downloadFileOp.DownloadedBytes; - DownloadProgress = _downloadFileOp.DownloadProgress; + Report = _downloadFileOp.Report; if (_downloadFileOp.IsDone == false) return; @@ -82,33 +81,10 @@ namespace YooAsset } else { - if (IsWaitForCompletion == false && _failedTryAgain > 0) - { - _steps = ESteps.TryAgain; - YooLogger.Warning($"Failed download : {_downloadFileOp.Url} Try again."); - } - else - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = _downloadFileOp.Error; - YooLogger.Error(Error); - } - } - } - - // 重新尝试下载 - if (_steps == ESteps.TryAgain) - { - _tryAgainTimer += Time.unscaledDeltaTime; - if (_tryAgainTimer > 1f) - { - _tryAgainTimer = 0f; - _failedTryAgain--; - Progress = 0f; - DownloadProgress = 0f; - DownloadedBytes = 0; - _steps = ESteps.UnpackAndCache; + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = _downloadFileOp.Error; + YooLogger.Error(Error); } } } diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSInitializeOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSInitializeOperation.cs index f15ba5f7..a50f3af2 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSInitializeOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSInitializeOperation.cs @@ -1,11 +1,15 @@ - + namespace YooAsset { + /// + /// 内置文件系统的初始化操作 + /// internal class BFSInitializeOperation : FSInitializeOperation { private enum ESteps { None, + CheckPlatform, CheckAppFootprint, CopyPackageManifest, InitializeBuiltinFileCache, @@ -17,7 +21,7 @@ namespace YooAsset private readonly BuiltinFileSystem _fileSystem; private FCInitializeOperation _initializeBuiltinFileCacheOp; private FCInitializeOperation _initializeUnpackFileCacheOp; - private CopyBuiltinPackageManifest _copyBuiltinPackageManifestOp; + private CopyBuiltinPackageManifestOperation _copyBuiltinPackageManifestOp; private ESteps _steps = ESteps.None; internal BFSInitializeOperation(BuiltinFileSystem fileSystem) @@ -26,52 +30,60 @@ namespace YooAsset } internal override void InternalStart() { -#if UNITY_WEBGL - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = $"{nameof(DefaultBuildinFileSystem)} is not support WEBGL platform."; -#else - _steps = ESteps.CheckAppFootprint; -#endif + _steps = ESteps.CheckPlatform; } internal override void InternalUpdate() { if (_steps == ESteps.None || _steps == ESteps.Done) return; + if (_steps == ESteps.CheckPlatform) + { +#if UNITY_WEBGL + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"{nameof(BuiltinFileSystem)} does not support the WebGL platform."; +#else + _steps = ESteps.CheckAppFootprint; +#endif + } + if (_steps == ESteps.CheckAppFootprint) { - string footprintFilePath = _fileSystem.GetSandboxAppFootPrintFilePath(); + string footprintFilePath = _fileSystem.GetSandboxAppFootprintFilePath(); var appFootprint = new ApplicationFootprint(footprintFilePath); appFootprint.Load(_fileSystem.PackageName); // 如果水印发生变化,则说明覆盖安装后首次打开游戏 if (appFootprint.IsDirty()) { - if (_fileSystem.InstallClearMode == EInstallCleanupMode.None) + if (_fileSystem.InstallCleanupMode == EInstallCleanupMode.None) { - YooLogger.Warning("Do nothing when overwrite install application."); + YooLogger.Warning("No action required on overwrite installation."); } - else if (_fileSystem.InstallClearMode == EInstallCleanupMode.ClearAllCacheFiles) + else if (_fileSystem.InstallCleanupMode == EInstallCleanupMode.ClearAllCacheFiles) { _fileSystem.DeleteAllBundleFiles(); - YooLogger.Warning("Delete all cache files when overwrite install application."); + _fileSystem.DeleteAllManifestFiles(); + _fileSystem.DeleteAllTempFIles(); + YooLogger.Warning("Deleted all cache files on overwrite installation."); } - else if (_fileSystem.InstallClearMode == EInstallCleanupMode.ClearAllBundleFiles) + else if (_fileSystem.InstallCleanupMode == EInstallCleanupMode.ClearAllBundleFiles) { _fileSystem.DeleteAllBundleFiles(); - YooLogger.Warning("Delete all bundle files when overwrite install application."); + YooLogger.Warning("Deleted all bundle files on overwrite installation."); } - else if (_fileSystem.InstallClearMode == EInstallCleanupMode.ClearAllManifestFiles) + else if (_fileSystem.InstallCleanupMode == EInstallCleanupMode.ClearAllManifestFiles) { - YooLogger.Warning("Do nothing when overwrite install application."); + _fileSystem.DeleteAllManifestFiles(); + YooLogger.Warning("Deleted all manifest files on overwrite installation."); } else { - throw new System.NotImplementedException(_fileSystem.InstallClearMode.ToString()); + throw new System.NotImplementedException(_fileSystem.InstallCleanupMode.ToString()); } - appFootprint.Coverage(_fileSystem.PackageName); + appFootprint.Overwrite(_fileSystem.PackageName); } _steps = ESteps.CopyPackageManifest; @@ -79,11 +91,11 @@ namespace YooAsset if (_steps == ESteps.CopyPackageManifest) { - if (_fileSystem.CopyBuildinPackageManifest) + if (_fileSystem.CopyBuiltinPackageManifest) { if (_copyBuiltinPackageManifestOp == null) { - _copyBuiltinPackageManifestOp = new CopyBuiltinPackageManifest(_fileSystem); + _copyBuiltinPackageManifestOp = new CopyBuiltinPackageManifestOperation(_fileSystem); _copyBuiltinPackageManifestOp.StartOperation(); AddChildOperation(_copyBuiltinPackageManifestOp); } diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSLoadBundleOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSLoadBundleOperation.cs deleted file mode 100644 index 390dc9b8..00000000 --- a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSLoadBundleOperation.cs +++ /dev/null @@ -1,308 +0,0 @@ - -namespace YooAsset -{ - internal class BFSLoadBundleOperation : FSLoadBundleOperation - { - private enum ESteps - { - None, - Prepare, - UnpackFile, - AbortUnpack, - LoadUnpackBundle, - LoadBuiltinBundle, - CheckResult, - Done, - } - - private readonly BuiltinFileSystem _fileSystem; - private readonly FCLoadBundleOptions _options; - private FSDownloadFileOperation _unpackFileOp; - private FCLoadBundleOperation _loadBundleOp; - private ESteps _steps = ESteps.None; - - internal BFSLoadBundleOperation(BuiltinFileSystem fileSystem, FCLoadBundleOptions options) - { - _fileSystem = fileSystem; - _options = options; - } - internal override void InternalStart() - { - _steps = ESteps.Prepare; - } - internal override void InternalUpdate() - { - if (_steps == ESteps.None || _steps == ESteps.Done) - return; - - if (_steps == ESteps.Prepare) - { - if (_fileSystem.IsUnpackBundleFile(_options.Bundle)) - { - if (_fileSystem.UnpackFileCache.IsCached(_options.Bundle.BundleGUID)) - { - DownloadProgress = 1f; - DownloadedBytes = _options.Bundle.FileSize; - _steps = ESteps.LoadUnpackBundle; - } - else - { - _steps = ESteps.UnpackFile; - } - } - else - { - DownloadProgress = 1f; - DownloadedBytes = _options.Bundle.FileSize; - _steps = ESteps.LoadBuiltinBundle; - } - } - - if (_steps == ESteps.UnpackFile) - { - // 中断解压 - if (AbortDownloadFile) - { - if (_unpackFileOp != null) - _unpackFileOp.AbortOperation(); - _steps = ESteps.AbortUnpack; - } - } - - if (_steps == ESteps.UnpackFile) - { - if (_unpackFileOp == null) - { - var options = new FSDownloadFileOptions(_options.Bundle, int.MaxValue); - _unpackFileOp = _fileSystem.DownloadFileAsync(options); // 注意:异步任务的开启由调度器统一控制 - AddChildOperation(_unpackFileOp); - } - - if (IsWaitForCompletion) - _unpackFileOp.WaitForCompletion(); - - _unpackFileOp.UpdateOperation(); - DownloadProgress = _unpackFileOp.DownloadProgress; - DownloadedBytes = _unpackFileOp.DownloadedBytes; - if (_unpackFileOp.IsDone == false) - return; - - if (_unpackFileOp.Status == EOperationStatus.Succeeded) - { - _steps = ESteps.LoadUnpackBundle; - } - else - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = _unpackFileOp.Error; - } - } - - if (_steps == ESteps.AbortUnpack) - { - if (_unpackFileOp != null) - { - if (IsWaitForCompletion) - _unpackFileOp.WaitForCompletion(); - - _unpackFileOp.UpdateOperation(); - if (_unpackFileOp.IsDone == false) - return; - } - - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = "Abort download file."; - } - - if (_steps == ESteps.LoadUnpackBundle) - { - _loadBundleOp = _fileSystem.UnpackFileCache.LoadBundleAsync(_options); - _loadBundleOp.StartOperation(); - AddChildOperation(_loadBundleOp); - _steps = ESteps.CheckResult; - } - - if (_steps == ESteps.LoadBuiltinBundle) - { - _loadBundleOp = _fileSystem.BuiltinFileCache.LoadBundleAsync(_options); - _loadBundleOp.StartOperation(); - AddChildOperation(_loadBundleOp); - _steps = ESteps.CheckResult; - } - - if (_steps == ESteps.CheckResult) - { - if (IsWaitForCompletion) - _loadBundleOp.WaitForCompletion(); - - _loadBundleOp.UpdateOperation(); - if (_loadBundleOp.IsDone == false) - return; - - if (_loadBundleOp.Status == EOperationStatus.Succeeded) - { - if (_loadBundleOp.BundleResult == null) - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = "Loaded bundle result is null."; - YooLogger.Error(Error); - } - else - { - _steps = ESteps.Done; - Status = EOperationStatus.Succeeded; - Result = _loadBundleOp.BundleResult; - } - } - else - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = _loadBundleOp.Error; - YooLogger.Error(Error); - } - } - } - internal override void InternalWaitForCompletion() - { - ExecuteBatch(); - } - } - -#if TUANJIE_1_7_OR_NEWER - /// - /// 加载团结文件 - /// - internal class BFSLoadInstantBundleOperation - { - private enum ESteps - { - None, - LoadInstantBundle, - CheckResult, - Done, - } - - private readonly DefaultBuildinFileSystem _fileSystem; - private readonly PackageBundle _bundle; - private AssetBundleCreateRequest _createRequest; - private AssetBundle _assetBundle; - private Stream _managedStream; - private ESteps _steps = ESteps.None; - - - internal BFSLoadInstantBundleOperation(DefaultBuildinFileSystem fileSystem, PackageBundle bundle) - { - _fileSystem = fileSystem; - _bundle = bundle; - } - internal override void InternalStart() - { - DownloadProgress = 1f; - DownloadedBytes = _bundle.FileSize; - _steps = ESteps.LoadInstantBundle; - } - internal override void InternalUpdate() - { - if (_steps == ESteps.None || _steps == ESteps.Done) - return; - - if (_steps == ESteps.LoadInstantBundle) - { - if (_bundle.Encrypted) - { - if (_fileSystem.DecryptionServices == null) - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = $"The {nameof(IDecryptionServices)} is null."; - YooLogger.Error(Error); - return; - } - } - - if (IsWaitingForAsyncComplete) - { - if (_bundle.Encrypted) - { - var decryptResult = _fileSystem.LoadEncryptedAssetBundle(_bundle); - _assetBundle = decryptResult.Result; - _managedStream = decryptResult.ManagedStream; - } - else - { - string filePath = _fileSystem.GetBuildinFileLoadPath(_bundle); - _assetBundle = AssetBundle.LoadFromFile(filePath); - } - } - else - { - if (_bundle.Encrypted) - { - var decryptResult = _fileSystem.LoadEncryptedAssetBundleAsync(_bundle); - _createRequest = decryptResult.CreateRequest; - _managedStream = decryptResult.ManagedStream; - } - else - { - string filePath = _fileSystem.GetBuildinFileLoadPath(_bundle); - _createRequest = AssetBundle.LoadFromFileAsync(filePath); - } - } - - _steps = ESteps.CheckResult; - } - - if (_steps == ESteps.CheckResult) - { - if (_createRequest != null) - { - if (IsWaitingForAsyncComplete) - { - // 强制挂起主线程(注意:该操作会很耗时) - YooLogger.Warning("Suspend the main thread to load unity bundle."); - _assetBundle = _createRequest.assetBundle; - } - else - { - if (_createRequest.isDone == false) - return; - _assetBundle = _createRequest.assetBundle; - } - } - - if (_assetBundle == null) - { - if (_bundle.Encrypted) - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = $"Failed to load encrypted buildin asset bundle file : {_bundle.BundleName}"; - YooLogger.Error(Error); - } - else - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = $"Failed to load buildin asset bundle file : {_bundle.BundleName}"; - YooLogger.Error(Error); - } - } - else - { - _steps = ESteps.Done; - Result = new AssetBundleResult(_fileSystem, _bundle, _assetBundle, _managedStream); - Status = EOperationStatus.Succeed; - } - } - } - internal override void InternalWaitForAsyncComplete() - { - RunBatchExecution(); - } - } -#endif -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSLoadPackageBundleOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSLoadPackageBundleOperation.cs new file mode 100644 index 00000000..1700d560 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSLoadPackageBundleOperation.cs @@ -0,0 +1,169 @@ + +namespace YooAsset +{ + /// + /// 内置文件系统的加载资源包操作 + /// + internal class BFSLoadPackageBundleOperation : FSLoadPackageBundleOperation + { + private enum ESteps + { + None, + Prepare, + UnpackFile, + AbortUnpack, + LoadUnpackBundle, + LoadBundle, + CheckResult, + Done, + } + + private readonly BuiltinFileSystem _fileSystem; + private readonly FSLoadPackageBundleOptions _options; + private FSDownloadFileOperation _unpackFileOp; + private FCLoadBundleOperation _loadBundleOp; + private ESteps _steps = ESteps.None; + + internal BFSLoadPackageBundleOperation(BuiltinFileSystem fileSystem, FSLoadPackageBundleOptions options) + { + _fileSystem = fileSystem; + _options = options; + } + internal override void InternalStart() + { + _steps = ESteps.Prepare; + } + internal override void InternalUpdate() + { + if (_steps == ESteps.None || _steps == ESteps.Done) + return; + + if (_steps == ESteps.Prepare) + { + if (_fileSystem.IsUnpackBundleFile(_options.Bundle)) + { + if (_fileSystem.UnpackFileCache.IsCached(_options.Bundle.BundleGUID)) + _steps = ESteps.LoadUnpackBundle; + else + _steps = ESteps.UnpackFile; + } + else + { + _steps = ESteps.LoadBundle; + } + } + + if (_steps == ESteps.UnpackFile) + { + // 中断解压 + if (AbortDownloadFile) + { + if (_unpackFileOp != null) + _unpackFileOp.AbortOperation(); + _steps = ESteps.AbortUnpack; + } + } + + if (_steps == ESteps.UnpackFile) + { + if (_unpackFileOp == null) + { + // 注意:内置文件解压不做失败尝试 + var options = new FSDownloadFileOptions(_options.Bundle, 0); + _unpackFileOp = _fileSystem.DownloadFileAsync(options); + _unpackFileOp.StartOperation(); + AddChildOperation(_unpackFileOp); + } + + if (IsWaitForCompletion) + _unpackFileOp.WaitForCompletion(); + + _unpackFileOp.UpdateOperation(); + if (_unpackFileOp.IsDone == false) + return; + + if (_unpackFileOp.Status == EOperationStatus.Succeeded) + { + _steps = ESteps.LoadUnpackBundle; + } + else + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = _unpackFileOp.Error; + } + } + + if (_steps == ESteps.AbortUnpack) + { + if (_unpackFileOp != null) + { + if (IsWaitForCompletion) + _unpackFileOp.WaitForCompletion(); + + _unpackFileOp.UpdateOperation(); + if (_unpackFileOp.IsDone == false) + return; + } + + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = "File download aborted."; + } + + if (_steps == ESteps.LoadUnpackBundle) + { + _loadBundleOp = _fileSystem.UnpackFileCache.LoadBundleAsync(_options.ConvertTo()); + _loadBundleOp.StartOperation(); + AddChildOperation(_loadBundleOp); + _steps = ESteps.CheckResult; + } + + if (_steps == ESteps.LoadBundle) + { + _loadBundleOp = _fileSystem.BuiltinFileCache.LoadBundleAsync(_options.ConvertTo()); + _loadBundleOp.StartOperation(); + AddChildOperation(_loadBundleOp); + _steps = ESteps.CheckResult; + } + + if (_steps == ESteps.CheckResult) + { + if (IsWaitForCompletion) + _loadBundleOp.WaitForCompletion(); + + _loadBundleOp.UpdateOperation(); + if (_loadBundleOp.IsDone == false) + return; + + if (_loadBundleOp.Status == EOperationStatus.Succeeded) + { + if (_loadBundleOp.BundleHandle == null) + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = "Loaded bundle handle is null."; + YooLogger.Error(Error); + } + else + { + _steps = ESteps.Done; + Status = EOperationStatus.Succeeded; + BundleHandle = _loadBundleOp.BundleHandle; + } + } + else + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = _loadBundleOp.Error; + YooLogger.Error(Error); + } + } + } + internal override void InternalWaitForCompletion() + { + ExecuteBatch(); + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSLoadBundleOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSLoadPackageBundleOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSLoadBundleOperation.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSLoadPackageBundleOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSLoadManifestOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSLoadPackageManifestOperation.cs similarity index 83% rename from Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSLoadManifestOperation.cs rename to Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSLoadPackageManifestOperation.cs index 2cb9d00e..8ebdd3ff 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSLoadManifestOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSLoadPackageManifestOperation.cs @@ -1,13 +1,16 @@ - + namespace YooAsset { - internal class BFSLoadManifestOperation : FSLoadManifestOperation + /// + /// 内置文件系统的加载包裹清单操作 + /// + internal class BFSLoadPackageManifestOperation : FSLoadPackageManifestOperation { private enum ESteps { None, - RequestBuiltinPackageHash, - LoadBuiltinPackageManifest, + RequestPackageHash, + LoadPackageManifest, Done, } @@ -18,21 +21,21 @@ namespace YooAsset private ESteps _steps = ESteps.None; - public BFSLoadManifestOperation(BuiltinFileSystem fileSystem, string packageVersion) + public BFSLoadPackageManifestOperation(BuiltinFileSystem fileSystem, string packageVersion) { _fileSystem = fileSystem; _packageVersion = packageVersion; } internal override void InternalStart() { - _steps = ESteps.RequestBuiltinPackageHash; + _steps = ESteps.RequestPackageHash; } internal override void InternalUpdate() { if (_steps == ESteps.None || _steps == ESteps.Done) return; - if (_steps == ESteps.RequestBuiltinPackageHash) + if (_steps == ESteps.RequestPackageHash) { if (_requestBuiltinPackageHashOp == null) { @@ -47,7 +50,7 @@ namespace YooAsset if (_requestBuiltinPackageHashOp.Status == EOperationStatus.Succeeded) { - _steps = ESteps.LoadBuiltinPackageManifest; + _steps = ESteps.LoadPackageManifest; } else { @@ -57,7 +60,7 @@ namespace YooAsset } } - if (_steps == ESteps.LoadBuiltinPackageManifest) + if (_steps == ESteps.LoadPackageManifest) { if (_loadBuiltinPackageManifestOp == null) { @@ -74,8 +77,8 @@ namespace YooAsset if (_loadBuiltinPackageManifestOp.Status == EOperationStatus.Succeeded) { _steps = ESteps.Done; - Manifest = _loadBuiltinPackageManifestOp.Manifest; Status = EOperationStatus.Succeeded; + Manifest = _loadBuiltinPackageManifestOp.Manifest; } else { diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSLoadManifestOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSLoadPackageManifestOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSLoadManifestOperation.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSLoadPackageManifestOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSRequestVersionOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSRequestPackageVersionOperation.cs similarity index 87% rename from Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSRequestVersionOperation.cs rename to Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSRequestPackageVersionOperation.cs index 441f6dec..20104b4e 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSRequestVersionOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSRequestPackageVersionOperation.cs @@ -1,7 +1,10 @@ - + namespace YooAsset { - internal class BFSRequestVersionOperation : FSRequestVersionOperation + /// + /// 内置文件系统的查询包裹版本操作 + /// + internal class BFSRequestPackageVersionOperation : FSRequestPackageVersionOperation { private enum ESteps { @@ -15,7 +18,7 @@ namespace YooAsset private ESteps _steps = ESteps.None; - internal BFSRequestVersionOperation(BuiltinFileSystem fileSystem) + internal BFSRequestPackageVersionOperation(BuiltinFileSystem fileSystem) { _fileSystem = fileSystem; } diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSRequestVersionOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSRequestPackageVersionOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSRequestVersionOperation.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/BFSRequestPackageVersionOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/CopyBuiltinPackageManifest.cs b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/Internal/CopyBuiltinPackageManifestOperation.cs similarity index 80% rename from Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/CopyBuiltinPackageManifest.cs rename to Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/Internal/CopyBuiltinPackageManifestOperation.cs index 07529125..3d88063c 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/CopyBuiltinPackageManifest.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/Internal/CopyBuiltinPackageManifestOperation.cs @@ -1,7 +1,10 @@ namespace YooAsset { - internal class CopyBuiltinPackageManifest : AsyncOperationBase + /// + /// 拷贝内置包裹清单到沙盒操作 + /// + internal class CopyBuiltinPackageManifestOperation : AsyncOperationBase { private enum ESteps { @@ -13,12 +16,12 @@ namespace YooAsset } private readonly BuiltinFileSystem _fileSystem; - private RequestBuiltinPackageVersionOperation _requestBuildinPackageVersionOp; + private RequestBuiltinPackageVersionOperation _requestBuiltinPackageVersionOp; private CopyBuiltinFileOperation _copyBuiltinHashFileOp; private CopyBuiltinFileOperation _copyBuiltinManifestFileOp; private ESteps _steps = ESteps.None; - public CopyBuiltinPackageManifest(BuiltinFileSystem fileSystem) + public CopyBuiltinPackageManifestOperation(BuiltinFileSystem fileSystem) { _fileSystem = fileSystem; } @@ -33,18 +36,18 @@ namespace YooAsset if (_steps == ESteps.LoadBuiltinPackageVersion) { - if (_requestBuildinPackageVersionOp == null) + if (_requestBuiltinPackageVersionOp == null) { - _requestBuildinPackageVersionOp = new RequestBuiltinPackageVersionOperation(_fileSystem); - _requestBuildinPackageVersionOp.StartOperation(); - AddChildOperation(_requestBuildinPackageVersionOp); + _requestBuiltinPackageVersionOp = new RequestBuiltinPackageVersionOperation(_fileSystem); + _requestBuiltinPackageVersionOp.StartOperation(); + AddChildOperation(_requestBuiltinPackageVersionOp); } - _requestBuildinPackageVersionOp.UpdateOperation(); - if (_requestBuildinPackageVersionOp.IsDone == false) + _requestBuiltinPackageVersionOp.UpdateOperation(); + if (_requestBuiltinPackageVersionOp.IsDone == false) return; - if (_requestBuildinPackageVersionOp.Status == EOperationStatus.Succeeded) + if (_requestBuiltinPackageVersionOp.Status == EOperationStatus.Succeeded) { _steps = ESteps.CopyBuiltinPackageHash; } @@ -52,7 +55,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _requestBuildinPackageVersionOp.Error; + Error = _requestBuiltinPackageVersionOp.Error; } } @@ -60,7 +63,8 @@ namespace YooAsset { if (_copyBuiltinHashFileOp == null) { - string packageVersion = _requestBuildinPackageVersionOp.PackageVersion; + // 注意:只负责拷贝文件,不负责校验文件。 + string packageVersion = _requestBuiltinPackageVersionOp.PackageVersion; string destFilePath = GetCopyPackageHashDestPath(packageVersion); string sourceFilePath = _fileSystem.GetBuiltinPackageHashFilePath(packageVersion); _copyBuiltinHashFileOp = new CopyBuiltinFileOperation(_fileSystem, sourceFilePath, destFilePath); @@ -88,7 +92,8 @@ namespace YooAsset { if (_copyBuiltinManifestFileOp == null) { - string packageVersion = _requestBuildinPackageVersionOp.PackageVersion; + // 注意:只负责拷贝文件,不负责校验文件。 + string packageVersion = _requestBuiltinPackageVersionOp.PackageVersion; string destFilePath = GetCopyPackageManifestDestPath(packageVersion); string sourceFilePath = _fileSystem.GetBuiltinPackageManifestFilePath(packageVersion); _copyBuiltinManifestFileOp = new CopyBuiltinFileOperation(_fileSystem, sourceFilePath, destFilePath); @@ -116,11 +121,11 @@ namespace YooAsset private string GetCopyManifestFileRoot() { - string destRoot = _fileSystem.CopyBuildinPackageManifestDestRoot; + string destRoot = _fileSystem.CopyBuiltinPackageManifestDestRoot; if (string.IsNullOrEmpty(destRoot)) { string defaultCacheRoot = YooAssetSettingsData.GetYooDefaultCacheRoot(); - destRoot = PathUtility.Combine(defaultCacheRoot, _fileSystem.PackageName, SandboxFileSystemDefine.ManifestFilesFolderName); + destRoot = PathUtility.Combine(defaultCacheRoot, _fileSystem.PackageName, SandboxFileSystemConsts.ManifestFilesFolderName); } return destRoot; } diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/CopyBuiltinPackageManifest.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/Internal/CopyBuiltinPackageManifestOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/CopyBuiltinPackageManifest.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/Internal/CopyBuiltinPackageManifestOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/CopyBuiltinFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/CopyBuiltinFileOperation.cs index 3b51b3ba..165aca10 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/CopyBuiltinFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/CopyBuiltinFileOperation.cs @@ -3,6 +3,9 @@ using System.IO; namespace YooAsset { + /// + /// 拷贝内置文件操作 + /// internal class CopyBuiltinFileOperation : AsyncOperationBase { private enum ESteps @@ -17,7 +20,7 @@ namespace YooAsset private readonly BuiltinFileSystem _fileSystem; private readonly string _sourceFilePath; private readonly string _destFilePath; - private IDownloadFileRequest _webFileRequestOp; + private IDownloadFileRequest _downloadFileRequest; private ESteps _steps = ESteps.None; public CopyBuiltinFileOperation(BuiltinFileSystem fileSystem, string sourceFilePath, string destFilePath) @@ -63,7 +66,7 @@ namespace YooAsset } catch (Exception ex) { - YooLogger.Warning($"Failed copy buildin file : {ex.Message}"); + YooLogger.Warning($"Failed to copy builtin file: {ex.Message}"); _steps = ESteps.UnpackFile; } } @@ -75,19 +78,19 @@ namespace YooAsset if (_steps == ESteps.UnpackFile) { - if (_webFileRequestOp == null) + if (_downloadFileRequest == null) { //TODO 团结引擎,在某些安卓机型(红米),通过UnityWebRequest拷贝包内文件会小概率失败!需要借助其它方式来拷贝包内文件。 string url = DownloadSystemTools.ToLocalUrl(_sourceFilePath); var args = new DownloadFileRequestArgs(url, _destFilePath, 60, 0); - _webFileRequestOp = _fileSystem.DownloadBackend.CreateFileRequest(args); - _webFileRequestOp.SendRequest(); + _downloadFileRequest = _fileSystem.DownloadBackend.CreateFileRequest(args); + _downloadFileRequest.SendRequest(); } - if (_webFileRequestOp.IsDone == false) + if (_downloadFileRequest.IsDone == false) return; - if (_webFileRequestOp.Status == EDownloadRequestStatus.Succeeded) + if (_downloadFileRequest.Status == EDownloadRequestStatus.Succeeded) { _steps = ESteps.Done; Status = EOperationStatus.Succeeded; @@ -96,16 +99,16 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _webFileRequestOp.Error; + Error = _downloadFileRequest.Error; } } } internal override void InternalDispose() { - if (_webFileRequestOp != null) + if (_downloadFileRequest != null) { - _webFileRequestOp.Dispose(); - _webFileRequestOp = null; + _downloadFileRequest.Dispose(); + _downloadFileRequest = null; } } internal override void InternalWaitForCompletion() diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/LoadBuiltinPackageManifestOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/LoadBuiltinPackageManifestOperation.cs index a8ae6f6b..d5e01e3f 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/LoadBuiltinPackageManifestOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/LoadBuiltinPackageManifestOperation.cs @@ -2,6 +2,9 @@ using System.IO; namespace YooAsset { + /// + /// 加载内置包裹清单文件操作 + /// internal class LoadBuiltinPackageManifestOperation : AsyncOperationBase { private enum ESteps @@ -17,15 +20,15 @@ namespace YooAsset private readonly BuiltinFileSystem _fileSystem; private readonly string _packageVersion; private readonly string _packageHash; - private IDownloadBytesRequest _webDataRequestOp; - private DeserializeManifestOperation _deserializer; + private IDownloadBytesRequest _downloadBytesRequest; + private DeserializeManifestOperation _deserializeManifestOp; private byte[] _fileData; private ESteps _steps = ESteps.None; /// /// 包裹清单 /// - public PackageManifest Manifest { private set; get; } + public PackageManifest Manifest { get; private set; } internal LoadBuiltinPackageManifestOperation(BuiltinFileSystem fileSystem, string packageVersion, string packageHash) @@ -59,28 +62,28 @@ namespace YooAsset if (_steps == ESteps.RequestFileData) { - if (_webDataRequestOp == null) + if (_downloadBytesRequest == null) { string filePath = _fileSystem.GetBuiltinPackageManifestFilePath(_packageVersion); string url = DownloadSystemTools.ToLocalUrl(filePath); var args = new DownloadDataRequestArgs(url, 60, 0); - _webDataRequestOp = _fileSystem.DownloadBackend.CreateBytesRequest(args); - _webDataRequestOp.SendRequest(); + _downloadBytesRequest = _fileSystem.DownloadBackend.CreateBytesRequest(args); + _downloadBytesRequest.SendRequest(); } - if (_webDataRequestOp.IsDone == false) + if (_downloadBytesRequest.IsDone == false) return; - if (_webDataRequestOp.Status == EDownloadRequestStatus.Succeeded) + if (_downloadBytesRequest.Status == EDownloadRequestStatus.Succeeded) { - _fileData = _webDataRequestOp.Result; + _fileData = _downloadBytesRequest.Result; _steps = ESteps.VerifyFileData; } else { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _webDataRequestOp.Error; + Error = _downloadBytesRequest.Error; } } @@ -94,49 +97,49 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = "Failed to verify buildin package manifest file."; + Error = "Failed to verify builtin package manifest file."; } } if (_steps == ESteps.LoadManifest) { - if (_deserializer == null) + if (_deserializeManifestOp == null) { - _deserializer = new DeserializeManifestOperation(_fileSystem.ManifestDecryptor, _fileData); - _deserializer.StartOperation(); - AddChildOperation(_deserializer); + _deserializeManifestOp = new DeserializeManifestOperation(_fileSystem.ManifestDecryptor, _fileData); + _deserializeManifestOp.StartOperation(); + AddChildOperation(_deserializeManifestOp); } - _deserializer.UpdateOperation(); - Progress = _deserializer.Progress; - if (_deserializer.IsDone == false) + _deserializeManifestOp.UpdateOperation(); + Progress = _deserializeManifestOp.Progress; + if (_deserializeManifestOp.IsDone == false) return; - if (_deserializer.Status == EOperationStatus.Succeeded) + if (_deserializeManifestOp.Status == EOperationStatus.Succeeded) { _steps = ESteps.Done; - Manifest = _deserializer.Manifest; + Manifest = _deserializeManifestOp.Manifest; Status = EOperationStatus.Succeeded; } else { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _deserializer.Error; + Error = _deserializeManifestOp.Error; } } } internal override void InternalDispose() { - if (_webDataRequestOp != null) + if (_downloadBytesRequest != null) { - _webDataRequestOp.Dispose(); - _webDataRequestOp = null; + _downloadBytesRequest.Dispose(); + _downloadBytesRequest = null; } } internal override string InternalGetDescription() { - return $"PackageVersion : {_packageVersion} PackageHash : {_packageHash}"; + return $"PackageVersion: {_packageVersion} PackageHash: {_packageHash}"; } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/RequestBuiltinPackageHashOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/RequestBuiltinPackageHashOperation.cs index d3ed542a..7a383ceb 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/RequestBuiltinPackageHashOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/RequestBuiltinPackageHashOperation.cs @@ -2,6 +2,9 @@ using System.IO; namespace YooAsset { + /// + /// 请求内置包裹哈希操作 + /// internal class RequestBuiltinPackageHashOperation : AsyncOperationBase { private enum ESteps @@ -15,13 +18,13 @@ namespace YooAsset private readonly BuiltinFileSystem _fileSystem; private readonly string _packageVersion; - private IDownloadTextRequest _webTextRequestOp; + private IDownloadTextRequest _downloadTextRequest; private ESteps _steps = ESteps.None; /// /// 包裹哈希值 /// - public string PackageHash { private set; get; } + public string PackageHash { get; private set; } internal RequestBuiltinPackageHashOperation(BuiltinFileSystem fileSystem, string packageVersion) @@ -54,38 +57,38 @@ namespace YooAsset if (_steps == ESteps.RequestPackageHash) { - if (_webTextRequestOp == null) + if (_downloadTextRequest == null) { string filePath = _fileSystem.GetBuiltinPackageHashFilePath(_packageVersion); string url = DownloadSystemTools.ToLocalUrl(filePath); var args = new DownloadDataRequestArgs(url, 60, 0); - _webTextRequestOp = _fileSystem.DownloadBackend.CreateTextRequest(args); - _webTextRequestOp.SendRequest(); + _downloadTextRequest = _fileSystem.DownloadBackend.CreateTextRequest(args); + _downloadTextRequest.SendRequest(); } - if (_webTextRequestOp.IsDone == false) + if (_downloadTextRequest.IsDone == false) return; - if (_webTextRequestOp.Status == EDownloadRequestStatus.Succeeded) + if (_downloadTextRequest.Status == EDownloadRequestStatus.Succeeded) { - PackageHash = _webTextRequestOp.Result; + PackageHash = _downloadTextRequest.Result; _steps = ESteps.CheckResult; } else { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _webTextRequestOp.Error; + Error = _downloadTextRequest.Error; } } if (_steps == ESteps.CheckResult) { - if (string.IsNullOrEmpty(PackageHash)) + if (TextUtility.ValidateContent(PackageHash, out string validateError) == false) { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"Builtin package hash file content is empty."; + Error = $"Builtin package hash file validate failed: {validateError}"; } else { @@ -96,10 +99,10 @@ namespace YooAsset } internal override void InternalDispose() { - if (_webTextRequestOp != null) + if (_downloadTextRequest != null) { - _webTextRequestOp.Dispose(); - _webTextRequestOp = null; + _downloadTextRequest.Dispose(); + _downloadTextRequest = null; } } } diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/RequestBuiltinPackageVersionOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/RequestBuiltinPackageVersionOperation.cs index 970492a4..b4069837 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/RequestBuiltinPackageVersionOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/RequestBuiltinPackageVersionOperation.cs @@ -2,6 +2,9 @@ using System.IO; namespace YooAsset { + /// + /// 请求内置包裹版本操作 + /// internal class RequestBuiltinPackageVersionOperation : AsyncOperationBase { private enum ESteps @@ -14,13 +17,13 @@ namespace YooAsset } private readonly BuiltinFileSystem _fileSystem; - private IDownloadTextRequest _webTextRequestOp; + private IDownloadTextRequest _downloadTextRequest; private ESteps _steps = ESteps.None; /// /// 包裹版本 /// - public string PackageVersion { private set; get; } + public string PackageVersion { get; private set; } internal RequestBuiltinPackageVersionOperation(BuiltinFileSystem fileSystem) @@ -52,38 +55,38 @@ namespace YooAsset if (_steps == ESteps.RequestPackageVersion) { - if (_webTextRequestOp == null) + if (_downloadTextRequest == null) { string filePath = _fileSystem.GetBuiltinPackageVersionFilePath(); string url = DownloadSystemTools.ToLocalUrl(filePath); var args = new DownloadDataRequestArgs(url, 60, 0); - _webTextRequestOp = _fileSystem.DownloadBackend.CreateTextRequest(args); - _webTextRequestOp.SendRequest(); + _downloadTextRequest = _fileSystem.DownloadBackend.CreateTextRequest(args); + _downloadTextRequest.SendRequest(); } - if (_webTextRequestOp.IsDone == false) + if (_downloadTextRequest.IsDone == false) return; - if (_webTextRequestOp.Status == EDownloadRequestStatus.Succeeded) + if (_downloadTextRequest.Status == EDownloadRequestStatus.Succeeded) { - PackageVersion = _webTextRequestOp.Result; + PackageVersion = _downloadTextRequest.Result; _steps = ESteps.CheckResult; } else { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _webTextRequestOp.Error; + Error = _downloadTextRequest.Error; } } if (_steps == ESteps.CheckResult) { - if (string.IsNullOrEmpty(PackageVersion)) + if (TextUtility.ValidateContent(PackageVersion, out string validateError) == false) { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"Builtin package version file content is empty."; + Error = $"Builtin package version file validate failed: {validateError}"; } else { @@ -94,10 +97,10 @@ namespace YooAsset } internal override void InternalDispose() { - if (_webTextRequestOp != null) + if (_downloadTextRequest != null) { - _webTextRequestOp.Dispose(); - _webTextRequestOp = null; + _downloadTextRequest.Dispose(); + _downloadTextRequest = null; } } } diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/UnpackAndCacheFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/UnpackAndCacheFileOperation.cs index 7eaee322..6d2fa64d 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/UnpackAndCacheFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/BuiltinFileSystem/Operations/internal/UnpackAndCacheFileOperation.cs @@ -2,6 +2,9 @@ using System.IO; namespace YooAsset { + /// + /// 解压并缓存文件操作 + /// internal sealed class UnpackAndCacheFileOperation : DownloadFileBaseOperation { private enum ESteps @@ -65,6 +68,10 @@ namespace YooAsset if (_copyBuiltinFileOp.IsDone == false) return; + // 更新下载报告 + Report.DownloadedBytes = Bundle.FileSize; + Report.DownloadProgress = 1f; + if (_copyBuiltinFileOp.Status == EOperationStatus.Succeeded) { _steps = ESteps.CacheFile; diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/EditorFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/EditorFileSystem.cs index 79301432..3e4e1dde 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/EditorFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/EditorFileSystem.cs @@ -1,4 +1,4 @@ -using System; +using System; using UnityEngine; namespace YooAsset @@ -13,67 +13,70 @@ namespace YooAsset /// /// 虚拟文件缓存系统 /// - public IFileCache FileCache { private set; get; } + public IFileCache FileCache { get; private set; } /// - /// 解压调度器 + /// 下载调度器 /// public DownloadSchedulerOperation DownloadScheduler { get; set; } /// /// 下载后台接口 /// - public IDownloadBackend DownloadBackend { private set; get; } + public IDownloadBackend DownloadBackend { get; private set; } /// /// 包裹名称 /// - public string PackageName { private set; get; } + public string PackageName { get; private set; } #region 自定义参数 /// /// 自定义参数:UnityWebRequest 创建委托 /// - public UnityWebRequestCreator WebRequestCreator { private set; get; } + public UnityWebRequestCreator WebRequestCreator { get; private set; } /// /// 自定义参数:模拟WebGL平台模式 /// - public bool VirtualWebGLMode { private set; get; } = false; + public bool VirtualWebGLMode { get; private set; } = false; /// /// 自定义参数:模拟虚拟下载模式 /// - public bool VirtualDownloadMode { private set; get; } = false; + public bool VirtualDownloadMode { get; private set; } = false; /// /// 自定义参数:模拟虚拟下载的网速(单位:字节) + /// 默认值:1024 /// - public int VirtualDownloadSpeed { private set; get; } = 1024; + public int VirtualDownloadSpeed { get; private set; } = 1024; /// /// 自定义参数:最大并发连接数 /// 默认值:8(推荐范围 1-32) /// 说明:过大的并发数可能被服务器限流,也会增加本地资源消耗 /// - public int DownloadMaxConcurrency { private set; get; } = 8; + public int DownloadMaxConcurrency { get; private set; } = 8; /// /// 自定义参数:每帧发起的最大请求数 /// 默认值:8(推荐范围 1-32) /// 说明:避免单帧发起过多请求导致卡顿 /// - public int DownloadMaxRequestPerFrame { private set; get; } = 8; + public int DownloadMaxRequestPerFrame { get; private set; } = 8; /// /// 自定义参数:异步模拟加载最小帧数 + /// 默认值:1 /// - public int AsyncSimulateMinFrame { private set; get; } = 1; + public int AsyncSimulateMinFrame { get; private set; } = 1; /// /// 自定义参数:异步模拟加载最大帧数 + /// 默认值:1 /// - public int AsyncSimulateMaxFrame { private set; get; } = 1; + public int AsyncSimulateMaxFrame { get; private set; } = 1; #endregion public EditorFileSystem() @@ -84,19 +87,19 @@ namespace YooAsset var operation = new EFSInitializeOperation(this); return operation; } - public virtual FSRequestVersionOperation RequestVersionAsync(RequestVersionOptions options) + public virtual FSRequestPackageVersionOperation RequestPackageVersionAsync(FSRequestPackageVersionOptions options) { - var operation = new EFSRequestVersionOperation(this); + var operation = new EFSRequestPackageVersionOperation(this); return operation; } - public virtual FSLoadManifestOperation LoadManifestAsync(LoadManifestOptions options) + public virtual FSLoadPackageManifestOperation LoadPackageManifestAsync(FSLoadPackageManifestOptions options) { - var operation = new EFSLoadManifestOperation(this, options.PackageVersion); + var operation = new EFSLoadPackageManifestOperation(this, options.PackageVersion); return operation; } - public virtual FSClearCacheOperation ClearCacheAsync(ClearCacheOptions options) + public virtual FSLoadPackageBundleOperation LoadPackageBundleAsync(FSLoadPackageBundleOptions options) { - var operation = new FSClearCacheCompleteOperation(); + var operation = new EFSLoadPackageBundleOperation(this, options); return operation; } public virtual FSDownloadFileOperation DownloadFileAsync(FSDownloadFileOptions options) @@ -104,35 +107,48 @@ namespace YooAsset var downloader = new EFSDownloadFileOperation(this, options); return downloader; } - public virtual FSLoadBundleOperation LoadBundleAsync(FCLoadBundleOptions options) + public virtual FSClearCacheOperation ClearCacheAsync(FSClearCacheOptions options) { - var operation = new EFSLoadBundleOperation(this, options); - return operation; + if (options.ClearMode == EManifestClearMode.ClearAllManifestFiles.ToString()) + { + var operation = new FSClearCacheCompleteOperation(); + return operation; + } + else if (options.ClearMode == EManifestClearMode.ClearUnusedManifestFiles.ToString()) + { + var operation = new FSClearCacheCompleteOperation(); + return operation; + } + else + { + var operation = new EFSClearCacheOperation(this, options); + return operation; + } } public virtual void SetParameter(string name, object value) { - if (name == FileSystemParametersDefine.DOWNLOAD_BACKEND) + if (name == FileSystemConsts.DOWNLOAD_BACKEND) { DownloadBackend = (IDownloadBackend)value; } - else if (name == FileSystemParametersDefine.UNITY_WEB_REQUEST_CREATOR) + else if (name == FileSystemConsts.UNITY_WEB_REQUEST_CREATOR) { WebRequestCreator = (UnityWebRequestCreator)value; } - else if (name == FileSystemParametersDefine.VIRTUAL_WEBGL_MODE) + else if (name == FileSystemConsts.VIRTUAL_WEBGL_MODE) { VirtualWebGLMode = Convert.ToBoolean(value); } - else if (name == FileSystemParametersDefine.VIRTUAL_DOWNLOAD_MODE) + else if (name == FileSystemConsts.VIRTUAL_DOWNLOAD_MODE) { VirtualDownloadMode = Convert.ToBoolean(value); } - else if (name == FileSystemParametersDefine.VIRTUAL_DOWNLOAD_SPEED) + else if (name == FileSystemConsts.VIRTUAL_DOWNLOAD_SPEED) { VirtualDownloadSpeed = Convert.ToInt32(value); } - else if (name == FileSystemParametersDefine.DOWNLOAD_MAX_CONCURRENCY) + else if (name == FileSystemConsts.DOWNLOAD_MAX_CONCURRENCY) { int convertValue = Convert.ToInt32(value); if (convertValue > 32) @@ -143,7 +159,7 @@ namespace YooAsset // 限制在合理范围内:1-32 DownloadMaxConcurrency = Mathf.Clamp(convertValue, 1, 32); } - else if (name == FileSystemParametersDefine.DOWNLOAD_MAX_REQUEST_PER_FRAME) + else if (name == FileSystemConsts.DOWNLOAD_MAX_REQUEST_PER_FRAME) { int convertValue = Convert.ToInt32(value); if (convertValue > 32) @@ -154,17 +170,17 @@ namespace YooAsset // 限制在合理范围内:1-32 DownloadMaxRequestPerFrame = Mathf.Clamp(convertValue, 1, 32); } - else if (name == FileSystemParametersDefine.ASYNC_SIMULATE_MIN_FRAME) + else if (name == FileSystemConsts.ASYNC_SIMULATE_MIN_FRAME) { AsyncSimulateMinFrame = Convert.ToInt32(value); } - else if (name == FileSystemParametersDefine.ASYNC_SIMULATE_MAX_FRAME) + else if (name == FileSystemConsts.ASYNC_SIMULATE_MAX_FRAME) { AsyncSimulateMaxFrame = Convert.ToInt32(value); } else { - YooLogger.Warning($"Invalid parameter : {name}"); + YooLogger.Warning($"Invalid parameter: {name}"); } } public virtual void OnCreate(string packageName, string packageRoot) @@ -200,7 +216,7 @@ namespace YooAsset if (DownloadScheduler != null) { - DownloadScheduler.Dispose(); + DownloadScheduler.AbortOperation(); DownloadScheduler = null; } @@ -232,16 +248,27 @@ namespace YooAsset } #region 内部方法 + /// + /// 获取编辑器包裹版本文件路径 + /// public string GetEditorPackageVersionFilePath() { string fileName = YooAssetSettingsData.GetPackageVersionFileName(PackageName); return PathUtility.Combine(_packageRoot, fileName); } + + /// + /// 获取编辑器包裹哈希文件路径 + /// public string GetEditorPackageHashFilePath(string packageVersion) { string fileName = YooAssetSettingsData.GetPackageHashFileName(PackageName, packageVersion); return PathUtility.Combine(_packageRoot, fileName); } + + /// + /// 获取编辑器包裹清单文件路径 + /// public string GetEditorPackageManifestFilePath(string packageVersion) { string fileName = YooAssetSettingsData.GetManifestBinaryFileName(PackageName, packageVersion); diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/EditorFileSystemTools.cs b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/EditorFileSystemTools.cs index 83e3cd41..92753d64 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/EditorFileSystemTools.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/EditorFileSystemTools.cs @@ -1,15 +1,21 @@ - + namespace YooAsset { + /// + /// 编辑器文件系统工具类 + /// internal static class EditorFileSystemTools { + /// + /// 获取编辑器环境下资源包对应的源文件路径 + /// public static string GetEditorFilePath(PackageBundle bundle) { if (bundle.IncludeMainAssets.Count == 0) return string.Empty; - var pacakgeAsset = bundle.IncludeMainAssets[0]; - return pacakgeAsset.AssetPath; + var packageAsset = bundle.IncludeMainAssets[0]; + return packageAsset.AssetPath; } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSClearCacheOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSClearCacheOperation.cs new file mode 100644 index 00000000..9e6c7f4a --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSClearCacheOperation.cs @@ -0,0 +1,62 @@ + +namespace YooAsset +{ + /// + /// 编辑器文件系统的清理缓存操作 + /// + internal class EFSClearCacheOperation : FSClearCacheOperation + { + private enum ESteps + { + None, + ClearCache, + Done, + } + + private readonly EditorFileSystem _fileSystem; + private readonly FSClearCacheOptions _options; + private FCClearCacheOperation _clearCacheOp; + private ESteps _steps = ESteps.None; + + internal EFSClearCacheOperation(EditorFileSystem fileSystem, FSClearCacheOptions options) + { + _fileSystem = fileSystem; + _options = options; + } + internal override void InternalStart() + { + _steps = ESteps.ClearCache; + } + internal override void InternalUpdate() + { + if (_steps == ESteps.None || _steps == ESteps.Done) + return; + + if (_steps == ESteps.ClearCache) + { + if (_clearCacheOp == null) + { + _clearCacheOp = _fileSystem.FileCache.ClearCacheAsync(_options.ConvertTo()); + _clearCacheOp.StartOperation(); + AddChildOperation(_clearCacheOp); + } + + _clearCacheOp.UpdateOperation(); + if (_clearCacheOp.IsDone == false) + return; + + if (_clearCacheOp.Status == EOperationStatus.Succeeded) + { + _steps = ESteps.Done; + Status = EOperationStatus.Succeeded; + } + else + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = _clearCacheOp.Error; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSClearCacheOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSClearCacheOperation.cs.meta new file mode 100644 index 00000000..36e32d54 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSClearCacheOperation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7c7447804168ec04c8c4690db6074f2f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSDownloadFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSDownloadFileOperation.cs index d2732c11..9c9a3a58 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSDownloadFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSDownloadFileOperation.cs @@ -1,15 +1,17 @@ -using UnityEngine; namespace YooAsset { + /// + /// 编辑器文件系统的下载文件操作 + /// internal class EFSDownloadFileOperation : FSDownloadFileOperation { protected enum ESteps { None, CheckExists, - DownloadAndCache, - TryAgain, + CreateDownload, + CheckDownload, Done, } @@ -18,15 +20,10 @@ namespace YooAsset private DownloadFileBaseOperation _downloadFileOp; private ESteps _steps = ESteps.None; - // 失败重试 - private float _tryAgainTimer = 0; - private int _failedTryAgain; - internal EFSDownloadFileOperation(EditorFileSystem fileSystem, FSDownloadFileOptions options) : base(options.Bundle) { _fileSystem = fileSystem; _options = options; - _failedTryAgain = options.RetryCount; } internal override void InternalStart() { @@ -47,31 +44,33 @@ namespace YooAsset } else { - _steps = ESteps.DownloadAndCache; + _steps = ESteps.CreateDownload; } } - // 下载并缓存文件 - if (_steps == ESteps.DownloadAndCache) + // 创建下载器 + if (_steps == ESteps.CreateDownload) { + _downloadFileOp = _fileSystem.DownloadScheduler.TryGetDownloadFile(Bundle); if (_downloadFileOp == null) { - _downloadFileOp = _fileSystem.DownloadScheduler.TryGetDownloadFile(Bundle); - if (_downloadFileOp == null) - { - string editorFilePath = EditorFileSystemTools.GetEditorFilePath(Bundle); - _downloadFileOp = new SimulateAndCacheFileOperation(_fileSystem, Bundle, editorFilePath); - _fileSystem.DownloadScheduler.AddDownloadFile(_downloadFileOp); - } + string editorFilePath = EditorFileSystemTools.GetEditorFilePath(Bundle); + _downloadFileOp = new SimulateAndCacheFileOperation(_fileSystem, Bundle, editorFilePath); + _fileSystem.DownloadScheduler.AddDownloadFile(_downloadFileOp); } + _steps = ESteps.CheckDownload; + } + + // 检测结果 + if (_steps == ESteps.CheckDownload) + { if (IsWaitForCompletion) _downloadFileOp.WaitForCompletion(); _downloadFileOp.UpdateOperation(); Progress = _downloadFileOp.Progress; - DownloadedBytes = _downloadFileOp.DownloadedBytes; - DownloadProgress = _downloadFileOp.DownloadProgress; + Report = _downloadFileOp.Report; if (_downloadFileOp.IsDone == false) return; @@ -82,33 +81,10 @@ namespace YooAsset } else { - if (IsWaitForCompletion == false && _failedTryAgain > 0) - { - _steps = ESteps.TryAgain; - YooLogger.Warning($"Failed download : {_downloadFileOp.Url} Try again."); - } - else - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = _downloadFileOp.Error; - YooLogger.Error(Error); - } - } - } - - // 重新尝试下载 - if (_steps == ESteps.TryAgain) - { - _tryAgainTimer += Time.unscaledDeltaTime; - if (_tryAgainTimer > 1f) - { - _tryAgainTimer = 0f; - _failedTryAgain--; - Progress = 0f; - DownloadProgress = 0f; - DownloadedBytes = 0; - _steps = ESteps.DownloadAndCache; + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = _downloadFileOp.Error; + YooLogger.Error(Error); } } } diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSInitializeOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSInitializeOperation.cs index 0d584036..7e95701e 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSInitializeOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSInitializeOperation.cs @@ -1,17 +1,20 @@ - + namespace YooAsset { + /// + /// 编辑器文件系统的初始化操作 + /// internal class EFSInitializeOperation : FSInitializeOperation { private enum ESteps { None, + CheckPlatform, InitializeFileCache, CreateScheduler, Done, } - private readonly EditorFileSystem _fileSystem; private FCInitializeOperation _initializeFileCacheOp; private ESteps _steps = ESteps.None; @@ -22,10 +25,24 @@ namespace YooAsset } internal override void InternalStart() { - _steps = ESteps.InitializeFileCache; + _steps = ESteps.CheckPlatform; } internal override void InternalUpdate() { + if (_steps == ESteps.None || _steps == ESteps.Done) + return; + + if (_steps == ESteps.CheckPlatform) + { +#if !UNITY_EDITOR + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"{nameof(EditorFileSystem)} only support the Unity Editor."; +#else + _steps = ESteps.InitializeFileCache; +#endif + } + if (_steps == ESteps.InitializeFileCache) { if (_initializeFileCacheOp == null) diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSLoadBundleOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSLoadPackageBundleOperation.cs similarity index 78% rename from Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSLoadBundleOperation.cs rename to Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSLoadPackageBundleOperation.cs index b68da20b..c5fe0a2e 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSLoadBundleOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSLoadPackageBundleOperation.cs @@ -1,7 +1,10 @@ - + namespace YooAsset { - internal class EFSLoadBundleOperation : FSLoadBundleOperation + /// + /// 编辑器文件系统的加载资源包操作 + /// + internal class EFSLoadPackageBundleOperation : FSLoadPackageBundleOperation { private enum ESteps { @@ -9,18 +12,18 @@ namespace YooAsset Prepare, DownloadFile, AbortDownload, - LoadVirtualBundle, + LoadBundle, CheckResult, Done, } private readonly EditorFileSystem _fileSystem; - private readonly FCLoadBundleOptions _options; + private readonly FSLoadPackageBundleOptions _options; private FSDownloadFileOperation _downloadFileOp; private FCLoadBundleOperation _loadBundleOp; private ESteps _steps = ESteps.None; - internal EFSLoadBundleOperation(EditorFileSystem fileSystem, FCLoadBundleOptions options) + internal EFSLoadPackageBundleOperation(EditorFileSystem fileSystem, FSLoadPackageBundleOptions options) { _fileSystem = fileSystem; _options = options; @@ -37,15 +40,9 @@ namespace YooAsset if (_steps == ESteps.Prepare) { if (_fileSystem.FileCache.IsCached(_options.Bundle.BundleGUID)) - { - DownloadProgress = 1f; - DownloadedBytes = _options.Bundle.FileSize; - _steps = ESteps.LoadVirtualBundle; - } + _steps = ESteps.LoadBundle; else - { _steps = ESteps.DownloadFile; - } } if (_steps == ESteps.DownloadFile) @@ -63,7 +60,8 @@ namespace YooAsset { if (_downloadFileOp == null) { - FSDownloadFileOptions options = new FSDownloadFileOptions(_options.Bundle, int.MaxValue); + // 注意:模拟文件下载不做失败尝试 + var options = new FSDownloadFileOptions(_options.Bundle, 0); _downloadFileOp = _fileSystem.DownloadFileAsync(options); _downloadFileOp.StartOperation(); AddChildOperation(_downloadFileOp); @@ -73,14 +71,12 @@ namespace YooAsset _downloadFileOp.WaitForCompletion(); _downloadFileOp.UpdateOperation(); - DownloadProgress = _downloadFileOp.DownloadProgress; - DownloadedBytes = _downloadFileOp.DownloadedBytes; if (_downloadFileOp.IsDone == false) return; if (_downloadFileOp.Status == EOperationStatus.Succeeded) { - _steps = ESteps.LoadVirtualBundle; + _steps = ESteps.LoadBundle; } else { @@ -104,12 +100,12 @@ namespace YooAsset _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = "Abort download file."; + Error = "File download aborted."; } - if (_steps == ESteps.LoadVirtualBundle) + if (_steps == ESteps.LoadBundle) { - _loadBundleOp = _fileSystem.FileCache.LoadBundleAsync(_options); + _loadBundleOp = _fileSystem.FileCache.LoadBundleAsync(_options.ConvertTo()); _loadBundleOp.StartOperation(); AddChildOperation(_loadBundleOp); _steps = ESteps.CheckResult; @@ -126,18 +122,18 @@ namespace YooAsset if (_loadBundleOp.Status == EOperationStatus.Succeeded) { - if (_loadBundleOp.BundleResult == null) + if (_loadBundleOp.BundleHandle == null) { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = "Loaded bundle result is null."; + Error = "Loaded bundle handle is null."; YooLogger.Error(Error); } else { _steps = ESteps.Done; Status = EOperationStatus.Succeeded; - Result = _loadBundleOp.BundleResult; + BundleHandle = _loadBundleOp.BundleHandle; } } else diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSLoadBundleOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSLoadPackageBundleOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSLoadBundleOperation.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSLoadPackageBundleOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSLoadManifestOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSLoadPackageManifestOperation.cs similarity index 83% rename from Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSLoadManifestOperation.cs rename to Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSLoadPackageManifestOperation.cs index 9d031c02..185806e8 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSLoadManifestOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSLoadPackageManifestOperation.cs @@ -1,13 +1,16 @@ - + namespace YooAsset { - internal class EFSLoadManifestOperation : FSLoadManifestOperation + /// + /// 编辑器文件系统的加载包裹清单操作 + /// + internal class EFSLoadPackageManifestOperation : FSLoadPackageManifestOperation { private enum ESteps { None, - LoadEditorPackageHash, - LoadEditorPackageManifest, + LoadPackageHash, + LoadPackageManifest, Done, } @@ -18,21 +21,21 @@ namespace YooAsset private ESteps _steps = ESteps.None; - internal EFSLoadManifestOperation(EditorFileSystem fileSystem, string packageVersion) + internal EFSLoadPackageManifestOperation(EditorFileSystem fileSystem, string packageVersion) { _fileSystem = fileSystem; _packageVersion = packageVersion; } internal override void InternalStart() { - _steps = ESteps.LoadEditorPackageHash; + _steps = ESteps.LoadPackageHash; } internal override void InternalUpdate() { if (_steps == ESteps.None || _steps == ESteps.Done) return; - if (_steps == ESteps.LoadEditorPackageHash) + if (_steps == ESteps.LoadPackageHash) { if (_loadEditorPackageHashOpe == null) { @@ -47,7 +50,7 @@ namespace YooAsset if (_loadEditorPackageHashOpe.Status == EOperationStatus.Succeeded) { - _steps = ESteps.LoadEditorPackageManifest; + _steps = ESteps.LoadPackageManifest; } else { @@ -57,7 +60,7 @@ namespace YooAsset } } - if (_steps == ESteps.LoadEditorPackageManifest) + if (_steps == ESteps.LoadPackageManifest) { if (_loadEditorPackageManifestOp == null) { @@ -75,8 +78,8 @@ namespace YooAsset if (_loadEditorPackageManifestOp.Status == EOperationStatus.Succeeded) { _steps = ESteps.Done; - Manifest = _loadEditorPackageManifestOp.Manifest; Status = EOperationStatus.Succeeded; + Manifest = _loadEditorPackageManifestOp.Manifest; } else { diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSLoadManifestOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSLoadPackageManifestOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSLoadManifestOperation.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSLoadPackageManifestOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSRequestVersionOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSRequestPackageVersionOperation.cs similarity index 86% rename from Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSRequestVersionOperation.cs rename to Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSRequestPackageVersionOperation.cs index 7fee32a0..f0193f41 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSRequestVersionOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSRequestPackageVersionOperation.cs @@ -1,7 +1,10 @@ - + namespace YooAsset { - internal class EFSRequestVersionOperation : FSRequestVersionOperation + /// + /// 编辑器文件系统的查询包裹版本操作 + /// + internal class EFSRequestPackageVersionOperation : FSRequestPackageVersionOperation { private enum ESteps { @@ -15,7 +18,7 @@ namespace YooAsset private ESteps _steps = ESteps.None; - internal EFSRequestVersionOperation(EditorFileSystem fileSystem) + internal EFSRequestPackageVersionOperation(EditorFileSystem fileSystem) { _fileSystem = fileSystem; } diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSRequestVersionOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSRequestPackageVersionOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSRequestVersionOperation.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/EFSRequestPackageVersionOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/internal/LoadEditorPackageHashOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/internal/LoadEditorPackageHashOperation.cs index 5c4d5848..83e18a0c 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/internal/LoadEditorPackageHashOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/internal/LoadEditorPackageHashOperation.cs @@ -1,7 +1,10 @@ -using System.IO; +using System.IO; namespace YooAsset { + /// + /// 加载编辑器包裹哈希文件操作 + /// internal class LoadEditorPackageHashOperation : AsyncOperationBase { private enum ESteps @@ -18,7 +21,7 @@ namespace YooAsset /// /// 包裹哈希值 /// - public string PackageHash { private set; get; } + public string PackageHash { get; private set; } internal LoadEditorPackageHashOperation(EditorFileSystem fileSystem, string packageVersion) @@ -40,15 +43,24 @@ namespace YooAsset string hashFilePath = _fileSystem.GetEditorPackageHashFilePath(_packageVersion); if (File.Exists(hashFilePath)) { - _steps = ESteps.Done; PackageHash = FileUtility.ReadAllText(hashFilePath); - Status = EOperationStatus.Succeeded; + if (TextUtility.ValidateContent(PackageHash, out string validateError) == false) + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"Simulation package hash file validate failed: {validateError}"; + } + else + { + _steps = ESteps.Done; + Status = EOperationStatus.Succeeded; + } } else { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"Can not found simulation package hash file : {hashFilePath}"; + Error = $"Cannot find simulation package hash file: {hashFilePath}"; } } } diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/internal/LoadEditorPackageManifestOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/internal/LoadEditorPackageManifestOperation.cs index 360ae81d..d790a59a 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/internal/LoadEditorPackageManifestOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/internal/LoadEditorPackageManifestOperation.cs @@ -1,7 +1,10 @@ -using System.IO; +using System.IO; namespace YooAsset { + /// + /// 加载编辑器包裹清单文件操作 + /// internal class LoadEditorPackageManifestOperation : AsyncOperationBase { private enum ESteps @@ -16,14 +19,14 @@ namespace YooAsset private readonly EditorFileSystem _fileSystem; private readonly string _packageVersion; private readonly string _packageHash; - private DeserializeManifestOperation _deserializer; + private DeserializeManifestOperation _deserializeManifestOp; private byte[] _fileData; private ESteps _steps = ESteps.None; /// /// 包裹清单 /// - public PackageManifest Manifest { private set; get; } + public PackageManifest Manifest { get; private set; } internal LoadEditorPackageManifestOperation(EditorFileSystem fileSystem, string packageVersion, string packageHash) @@ -53,7 +56,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"Can not found simulation package manifest file : {manifestFilePath}"; + Error = $"Cannot find simulation package manifest file: {manifestFilePath}"; } } @@ -73,35 +76,35 @@ namespace YooAsset if (_steps == ESteps.LoadManifest) { - if (_deserializer == null) + if (_deserializeManifestOp == null) { - _deserializer = new DeserializeManifestOperation(null, _fileData); - _deserializer.StartOperation(); - AddChildOperation(_deserializer); + _deserializeManifestOp = new DeserializeManifestOperation(null, _fileData); + _deserializeManifestOp.StartOperation(); + AddChildOperation(_deserializeManifestOp); } - _deserializer.UpdateOperation(); - Progress = _deserializer.Progress; - if (_deserializer.IsDone == false) + _deserializeManifestOp.UpdateOperation(); + Progress = _deserializeManifestOp.Progress; + if (_deserializeManifestOp.IsDone == false) return; - if (_deserializer.Status == EOperationStatus.Succeeded) + if (_deserializeManifestOp.Status == EOperationStatus.Succeeded) { _steps = ESteps.Done; - Manifest = _deserializer.Manifest; + Manifest = _deserializeManifestOp.Manifest; Status = EOperationStatus.Succeeded; } else { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _deserializer.Error; + Error = _deserializeManifestOp.Error; } } } internal override string InternalGetDescription() { - return $"PackageVersion : {_packageVersion} PackageHash : {_packageHash}"; + return $"PackageVersion: {_packageVersion} PackageHash: {_packageHash}"; } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/internal/LoadEditorPackageVersionOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/internal/LoadEditorPackageVersionOperation.cs index cd4e9996..5ca94e3c 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/internal/LoadEditorPackageVersionOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/internal/LoadEditorPackageVersionOperation.cs @@ -1,7 +1,10 @@ -using System.IO; +using System.IO; namespace YooAsset { + /// + /// 加载编辑器包裹版本文件操作 + /// internal class LoadEditorPackageVersionOperation : AsyncOperationBase { private enum ESteps @@ -17,7 +20,7 @@ namespace YooAsset /// /// 包裹版本 /// - public string PackageVersion { private set; get; } + public string PackageVersion { get; private set; } internal LoadEditorPackageVersionOperation(EditorFileSystem fileSystem) @@ -38,15 +41,24 @@ namespace YooAsset string versionFilePath = _fileSystem.GetEditorPackageVersionFilePath(); if (File.Exists(versionFilePath)) { - _steps = ESteps.Done; PackageVersion = FileUtility.ReadAllText(versionFilePath); - Status = EOperationStatus.Succeeded; + if (TextUtility.ValidateContent(PackageVersion, out string validateError) == false) + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"Simulation package version file validate failed: {validateError}"; + } + else + { + _steps = ESteps.Done; + Status = EOperationStatus.Succeeded; + } } else { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"Can not found simulation package version file : {versionFilePath}"; + Error = $"Cannot find simulation package version file: {versionFilePath}"; } } } diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/internal/SimulateAndCacheFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/internal/SimulateAndCacheFileOperation.cs index a9d3f7dc..49a6ce3a 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/internal/SimulateAndCacheFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/EditorFileSystem/Operations/internal/SimulateAndCacheFileOperation.cs @@ -1,6 +1,9 @@ namespace YooAsset { + /// + /// 模拟下载并缓存文件操作 + /// internal class SimulateAndCacheFileOperation : DownloadFileBaseOperation { protected enum ESteps @@ -43,12 +46,18 @@ namespace YooAsset // 检测下载结果 if (_steps == ESteps.CheckRequest) { - DownloadedBytes = _downloadRequest.DownloadedBytes; - DownloadProgress = _downloadRequest.DownloadProgress; - Progress = DownloadProgress; + Report.DownloadedBytes = _downloadRequest.DownloadedBytes; + Report.DownloadProgress = _downloadRequest.DownloadProgress; + Progress = _downloadRequest.DownloadProgress; if (_downloadRequest.IsDone == false) return; + // 更新下载报告 + Report.DownloadedBytes = _downloadRequest.DownloadedBytes; + Report.DownloadProgress = _downloadRequest.DownloadProgress; + Report.HttpCode = _downloadRequest.HttpCode; + Report.HttpError = _downloadRequest.HttpError; + // 检查网络错误 if (_downloadRequest.Status == EDownloadRequestStatus.Succeeded) { @@ -104,8 +113,9 @@ namespace YooAsset { if (_steps != ESteps.Done) { - // 注意:不中断下载任务,保持后台继续下载 - YooLogger.Error($"Try load bundle {Bundle.BundleName} from remote : {Url}"); + // 注意:不中断下载任务,保持下载后台继续下载 + // 注意:上层异步操作会被动失败 + YooLogger.Error($"Attempting to load bundle {Bundle.BundleName} from remote: {Url}"); } } } diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/ApplicationFootprint.cs b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/ApplicationFootprint.cs index 3c689fe7..34d99bfb 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/ApplicationFootprint.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/ApplicationFootprint.cs @@ -1,4 +1,4 @@ -using System.IO; +using System.IO; using UnityEngine; namespace YooAsset @@ -27,7 +27,7 @@ namespace YooAsset } else { - Coverage(packageName); + Overwrite(packageName); } } @@ -46,7 +46,7 @@ namespace YooAsset /// /// 覆盖掉水印 /// - public void Coverage(string packageName) + public void Overwrite(string packageName) { #if UNITY_EDITOR _footprint = Application.version; @@ -54,7 +54,7 @@ namespace YooAsset _footprint = Application.buildGUID; #endif FileUtility.WriteAllText(_filePath, _footprint); - YooLogger.Log($"Save application footprint : {_footprint}"); + YooLogger.Log($"Save application footprint: {_footprint}"); } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/DownloadAndCacheFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/DownloadAndCacheFileOperation.cs index 380e2d45..d2daa285 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/DownloadAndCacheFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/DownloadAndCacheFileOperation.cs @@ -18,10 +18,10 @@ namespace YooAsset private readonly SandboxFileSystem _fileSystem; private readonly string _tempFilePath; - private bool _enableResume = false; - private long _fileOriginLength = 0; - private IDownloadRequest _downloadRequest; + private IDownloadFileRequest _downloadFileRequest; private FCWriteCacheOperation _writeCacheOp; + private bool _enableResume; + private long _fileOriginLength = 0; private ESteps _steps = ESteps.None; internal DownloadAndCacheFileOperation(SandboxFileSystem fileSystem, PackageBundle bundle, string url) : base(bundle, url) @@ -42,18 +42,17 @@ namespace YooAsset if (_steps == ESteps.CreateRequest) { FileUtility.EnsureFileDirectory(_tempFilePath); - _enableResume = Bundle.FileSize >= _fileSystem.ResumeDownloadMinimumSize; if (_enableResume) { - _downloadRequest = CreateResumeRequest(); - _downloadRequest.SendRequest(); + _downloadFileRequest = CreateResumeRequest(); + _downloadFileRequest.SendRequest(); _steps = ESteps.CheckRequest; } else { - _downloadRequest = CreateNormalRequest(); - _downloadRequest.SendRequest(); + _downloadFileRequest = CreateNormalRequest(); + _downloadFileRequest.SendRequest(); _steps = ESteps.CheckRequest; } } @@ -61,14 +60,28 @@ namespace YooAsset // 检测下载结果 if (_steps == ESteps.CheckRequest) { - DownloadProgress = _downloadRequest.DownloadProgress; - DownloadedBytes = _fileOriginLength + _downloadRequest.DownloadedBytes; - Progress = DownloadProgress; - if (_downloadRequest.IsDone == false) + bool isDone = _downloadFileRequest.IsDone; + if (_enableResume) + { + Report.DownloadedBytes = _fileOriginLength + _downloadFileRequest.DownloadedBytes; + Report.DownloadProgress = (float)((double)Report.DownloadedBytes / Bundle.FileSize); + Progress = Report.DownloadProgress; + } + else + { + Report.DownloadedBytes = _downloadFileRequest.DownloadedBytes; + Report.DownloadProgress = _downloadFileRequest.DownloadProgress; + Progress = Report.DownloadProgress; + } + if (isDone == false) return; + // 更新下载报告 + Report.HttpCode = _downloadFileRequest.HttpCode; + Report.HttpError = _downloadFileRequest.HttpError; + // 检查网络错误 - if (_downloadRequest.Status == EDownloadRequestStatus.Succeeded) + if (_downloadFileRequest.Status == EDownloadRequestStatus.Succeeded) { _steps = ESteps.CacheFile; } @@ -76,12 +89,19 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _downloadRequest.Error; - } + Error = _downloadFileRequest.Error; - // 在遇到特殊错误的时候删除文件 - if (_enableResume) - ClearTempFileWhenError(_downloadRequest.HttpCode); + if (_enableResume) + { + // 注意: HTTP 416 Range Not Satisfiable 表示服务器无法满足客户端在 Range 请求头中指定的字节范围请求。 + if (_downloadFileRequest.HttpCode == 416) + DeleteTempFile(); + } + else + { + DeleteTempFile(); + } + } } // 缓存文件 @@ -114,28 +134,28 @@ namespace YooAsset } // 注意:缓存完成后直接删除临时文件 - if (File.Exists(_tempFilePath)) - File.Delete(_tempFilePath); + DeleteTempFile(); } } internal override void InternalDispose() { - if (_downloadRequest != null) + if (_downloadFileRequest != null) { - _downloadRequest.Dispose(); - _downloadRequest = null; + _downloadFileRequest.Dispose(); + _downloadFileRequest = null; } } internal override void InternalWaitForCompletion() { if (_steps != ESteps.Done) { - // 注意:不中断下载任务,保持后台继续下载 - YooLogger.Error($"Try load bundle {Bundle.BundleName} from remote : {Url}"); + // 注意:不中断下载任务,保持下载后台继续下载 + // 注意:上层异步操作会被动失败 + YooLogger.Error($"Attempting to load bundle {Bundle.BundleName} from remote: {Url}"); } } - private IDownloadRequest CreateResumeRequest() + private IDownloadFileRequest CreateResumeRequest() { // 获取下载起始位置 if (File.Exists(_tempFilePath)) @@ -143,7 +163,7 @@ namespace YooAsset FileInfo fileInfo = new FileInfo(_tempFilePath); if (fileInfo.Length >= Bundle.FileSize) { - File.Delete(_tempFilePath); + DeleteTempFile(); } else { @@ -151,7 +171,7 @@ namespace YooAsset } } - int watchdogTime = _fileSystem.DownloadWatchDogTimeout; + int watchdogTime = _fileSystem.DownloadWatchdogTimeout; int timeout = 0; //注意:文件下载不做超时检测 bool appendToFile = true; bool removeFileOnAbort = false; @@ -159,28 +179,19 @@ namespace YooAsset var args = new DownloadFileRequestArgs(Url, _tempFilePath, timeout, watchdogTime, appendToFile, removeFileOnAbort, resumeOffset); return _fileSystem.DownloadBackend.CreateFileRequest(args); } - private IDownloadRequest CreateNormalRequest() + private IDownloadFileRequest CreateNormalRequest() { - // 删除历史缓存文件 - if (File.Exists(_tempFilePath)) - File.Delete(_tempFilePath); + DeleteTempFile(); - int watchdogTime = _fileSystem.DownloadWatchDogTimeout; + int watchdogTime = _fileSystem.DownloadWatchdogTimeout; int timeout = 0; //注意:文件下载不做超时检测 var args = new DownloadFileRequestArgs(Url, _tempFilePath, timeout, watchdogTime); return _fileSystem.DownloadBackend.CreateFileRequest(args); } - private void ClearTempFileWhenError(long httpCode) + private void DeleteTempFile() { - if (_fileSystem.ResumeDownloadResponseCodes == null) - return; - - //说明:如果遇到以下错误返回码,验证失败直接删除文件 - if (_fileSystem.ResumeDownloadResponseCodes.Contains(httpCode)) - { - if (File.Exists(_tempFilePath)) - File.Delete(_tempFilePath); - } + if (File.Exists(_tempFilePath)) + File.Delete(_tempFilePath); } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/DownloadPackageHashOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/DownloadPackageHashOperation.cs index d1c63b7b..be24ece7 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/DownloadPackageHashOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/DownloadPackageHashOperation.cs @@ -2,6 +2,9 @@ using System.IO; namespace YooAsset { + /// + /// 下载包裹哈希文件操作 + /// internal class DownloadPackageHashOperation : AsyncOperationBase { private enum ESteps @@ -9,14 +12,16 @@ namespace YooAsset None, CheckExist, DownloadFile, + VerifyFile, Done, } private readonly SandboxFileSystem _fileSystem; private readonly string _packageVersion; private readonly int _timeout; - private IDownloadFileRequest _webFileRequestOp; - private int _requestCount = 0; + private IDownloadFileRequest _downloadFileRequest; + private string _savePath; + private string _tempPath; private ESteps _steps = ESteps.None; @@ -28,7 +33,8 @@ namespace YooAsset } internal override void InternalStart() { - _requestCount = DownloadFailureCounter.GetFailureCount(_fileSystem.PackageName, nameof(DownloadPackageHashOperation)); + _savePath = _fileSystem.GetCachePackageHashFilePath(_packageVersion); + _tempPath = _savePath + ".tmp"; _steps = ESteps.CheckExist; } internal override void InternalUpdate() @@ -38,8 +44,7 @@ namespace YooAsset if (_steps == ESteps.CheckExist) { - string filePath = _fileSystem.GetCachePackageHashFilePath(_packageVersion); - if (File.Exists(filePath)) + if (File.Exists(_savePath)) { _steps = ESteps.Done; Status = EOperationStatus.Succeeded; @@ -52,50 +57,86 @@ namespace YooAsset if (_steps == ESteps.DownloadFile) { - if (_webFileRequestOp == null) + if (_downloadFileRequest == null) { - string savePath = _fileSystem.GetCachePackageHashFilePath(_packageVersion); + // 删除历史临时文件 + if (File.Exists(_tempPath)) + File.Delete(_tempPath); + string fileName = YooAssetSettingsData.GetPackageHashFileName(_fileSystem.PackageName, _packageVersion); string webURL = GetWebRequestURL(fileName); - int watchdogTime = _fileSystem.DownloadWatchDogTimeout; - var args = new DownloadFileRequestArgs(webURL, savePath, _timeout, watchdogTime); - _webFileRequestOp = _fileSystem.DownloadBackend.CreateFileRequest(args); - _webFileRequestOp.SendRequest(); + int watchdogTime = _fileSystem.DownloadWatchdogTimeout; + var args = new DownloadFileRequestArgs(webURL, _tempPath, _timeout, watchdogTime); + _downloadFileRequest = _fileSystem.DownloadBackend.CreateFileRequest(args); + _downloadFileRequest.SendRequest(); } - if (_webFileRequestOp.IsDone == false) + if (_downloadFileRequest.IsDone == false) return; - if (_webFileRequestOp.Status == EDownloadRequestStatus.Succeeded) + if (_downloadFileRequest.Status == EDownloadRequestStatus.Succeeded) { - _steps = ESteps.Done; - Status = EOperationStatus.Succeeded; + _steps = ESteps.VerifyFile; } else { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _webFileRequestOp.Error; - DownloadFailureCounter.RecordFailure(_fileSystem.PackageName, nameof(DownloadPackageHashOperation)); + Error = _downloadFileRequest.Error; + _fileSystem.DownloadURLPolicy.OnFailure(_downloadFileRequest.Url, _downloadFileRequest.HttpCode, _downloadFileRequest.HttpError); + DeleteTempFile(); + } + } + + if (_steps == ESteps.VerifyFile) + { + // 严格校验临时文件内容 + string content = FileUtility.ReadAllText(_tempPath); + if (TextUtility.ValidateContent(content, out string validateError) == false) + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"Downloaded package hash file validate failed: {validateError}"; + DeleteTempFile(); + return; + } + + // 原子移动到最终缓存路径 + try + { + if (File.Exists(_savePath)) + File.Delete(_savePath); + File.Move(_tempPath, _savePath); + _steps = ESteps.Done; + Status = EOperationStatus.Succeeded; + } + catch (System.Exception ex) + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"Failed to move hash temp file to cache path: {ex.Message}"; + DeleteTempFile(); } } } internal override void InternalDispose() { - if (_webFileRequestOp != null) + if (_downloadFileRequest != null) { - _webFileRequestOp.Dispose(); - _webFileRequestOp = null; + _downloadFileRequest.Dispose(); + _downloadFileRequest = null; } } + private void DeleteTempFile() + { + if (File.Exists(_tempPath)) + File.Delete(_tempPath); + } private string GetWebRequestURL(string fileName) { - // 轮流返回请求地址 - if (_requestCount % 2 == 0) - return _fileSystem.RemoteServices.GetRemoteMainURL(fileName); - else - return _fileSystem.RemoteServices.GetRemoteFallbackURL(fileName); + var urls = _fileSystem.RemoteServices.GetRemoteURLs(fileName); + return _fileSystem.DownloadURLPolicy.SelectURL(urls); } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/DownloadPackageManifestOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/DownloadPackageManifestOperation.cs index 47a45dc7..659d3ab8 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/DownloadPackageManifestOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/DownloadPackageManifestOperation.cs @@ -2,6 +2,9 @@ using System.IO; namespace YooAsset { + /// + /// 下载包裹清单文件操作 + /// internal class DownloadPackageManifestOperation : AsyncOperationBase { private enum ESteps @@ -9,14 +12,16 @@ namespace YooAsset None, CheckExist, DownloadFile, + VerifyFile, Done, } private readonly SandboxFileSystem _fileSystem; private readonly string _packageVersion; private readonly int _timeout; - private IDownloadFileRequest _webFileRequestOp; - private int _requestCount = 0; + private IDownloadFileRequest _downloadFileRequest; + private string _savePath; + private string _tempPath; private ESteps _steps = ESteps.None; @@ -28,7 +33,8 @@ namespace YooAsset } internal override void InternalStart() { - _requestCount = DownloadFailureCounter.GetFailureCount(_fileSystem.PackageName, nameof(DownloadPackageManifestOperation)); + _savePath = _fileSystem.GetCachePackageManifestFilePath(_packageVersion); + _tempPath = _savePath + ".tmp"; _steps = ESteps.CheckExist; } internal override void InternalUpdate() @@ -38,8 +44,7 @@ namespace YooAsset if (_steps == ESteps.CheckExist) { - string filePath = _fileSystem.GetCachePackageManifestFilePath(_packageVersion); - if (File.Exists(filePath)) + if (File.Exists(_savePath)) { _steps = ESteps.Done; Status = EOperationStatus.Succeeded; @@ -52,50 +57,86 @@ namespace YooAsset if (_steps == ESteps.DownloadFile) { - if (_webFileRequestOp == null) + if (_downloadFileRequest == null) { - string savePath = _fileSystem.GetCachePackageManifestFilePath(_packageVersion); + // 删除历史临时文件 + if (File.Exists(_tempPath)) + File.Delete(_tempPath); + string fileName = YooAssetSettingsData.GetManifestBinaryFileName(_fileSystem.PackageName, _packageVersion); string webURL = GetDownloadRequestURL(fileName); - int watchdogTime = _fileSystem.DownloadWatchDogTimeout; - var args = new DownloadFileRequestArgs(webURL, savePath, _timeout, watchdogTime); - _webFileRequestOp = _fileSystem.DownloadBackend.CreateFileRequest(args); - _webFileRequestOp.SendRequest(); + int watchdogTime = _fileSystem.DownloadWatchdogTimeout; + var args = new DownloadFileRequestArgs(webURL, _tempPath, _timeout, watchdogTime); + _downloadFileRequest = _fileSystem.DownloadBackend.CreateFileRequest(args); + _downloadFileRequest.SendRequest(); } - if (_webFileRequestOp.IsDone == false) + if (_downloadFileRequest.IsDone == false) return; - if (_webFileRequestOp.Status == EDownloadRequestStatus.Succeeded) + if (_downloadFileRequest.Status == EDownloadRequestStatus.Succeeded) { - _steps = ESteps.Done; - Status = EOperationStatus.Succeeded; + _steps = ESteps.VerifyFile; } else { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _webFileRequestOp.Error; - DownloadFailureCounter.RecordFailure(_fileSystem.PackageName, nameof(DownloadPackageManifestOperation)); + Error = _downloadFileRequest.Error; + _fileSystem.DownloadURLPolicy.OnFailure(_downloadFileRequest.Url, _downloadFileRequest.HttpCode, _downloadFileRequest.HttpError); + DeleteTempFile(); + } + } + + if (_steps == ESteps.VerifyFile) + { + // 验证临时文件存在且大小有效 + FileInfo fileInfo = new FileInfo(_tempPath); + if (fileInfo.Exists == false || fileInfo.Length == 0) + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = "Downloaded package manifest temp file is invalid."; + DeleteTempFile(); + return; + } + + // 原子移动到最终缓存路径 + try + { + if (File.Exists(_savePath)) + File.Delete(_savePath); + File.Move(_tempPath, _savePath); + _steps = ESteps.Done; + Status = EOperationStatus.Succeeded; + } + catch (System.Exception ex) + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"Failed to move manifest temp file to cache path: {ex.Message}"; + DeleteTempFile(); } } } internal override void InternalDispose() { - if (_webFileRequestOp != null) + if (_downloadFileRequest != null) { - _webFileRequestOp.Dispose(); - _webFileRequestOp = null; + _downloadFileRequest.Dispose(); + _downloadFileRequest = null; } } + private void DeleteTempFile() + { + if (File.Exists(_tempPath)) + File.Delete(_tempPath); + } private string GetDownloadRequestURL(string fileName) { - // 轮流返回请求地址 - if (_requestCount % 2 == 0) - return _fileSystem.RemoteServices.GetRemoteMainURL(fileName); - else - return _fileSystem.RemoteServices.GetRemoteFallbackURL(fileName); + var urls = _fileSystem.RemoteServices.GetRemoteURLs(fileName); + return _fileSystem.DownloadURLPolicy.SelectURL(urls); } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/ImportAndCacheFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/ImportAndCacheFileOperation.cs index d0b3f192..f3d8e6da 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/ImportAndCacheFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/ImportAndCacheFileOperation.cs @@ -2,6 +2,9 @@ using System.IO; namespace YooAsset { + /// + /// 导入并缓存文件操作 + /// internal sealed class ImportAndCacheFileOperation : DownloadFileBaseOperation { private enum ESteps @@ -51,13 +54,17 @@ namespace YooAsset try { File.Copy(_sourceFilePath, _tempFilePath, true); + + // 更新下载报告 + Report.DownloadedBytes = Bundle.FileSize; + Report.DownloadProgress = 1f; _steps = ESteps.CacheFile; } catch (System.Exception ex) { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"Failed copy local file : {ex.Message}"; + Error = $"Failed to copy local file: {ex.Message}"; } } diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/LoadCachePackageHashOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/LoadCachePackageHashOperation.cs index 2dd1566d..f2304384 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/LoadCachePackageHashOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/LoadCachePackageHashOperation.cs @@ -1,7 +1,10 @@ -using System.IO; +using System.IO; namespace YooAsset { + /// + /// 加载缓存包裹哈希文件操作 + /// internal class LoadCachePackageHashOperation : AsyncOperationBase { private enum ESteps @@ -18,7 +21,7 @@ namespace YooAsset /// /// 包裹哈希值 /// - public string PackageHash { private set; get; } + public string PackageHash { get; private set; } internal LoadCachePackageHashOperation(SandboxFileSystem fileSystem, string packageVersion) @@ -42,16 +45,16 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"Can not found cache package hash file : {filePath}"; + Error = $"Cannot find cache package hash file: {filePath}"; return; } PackageHash = FileUtility.ReadAllText(filePath); - if (string.IsNullOrEmpty(PackageHash)) + if (TextUtility.ValidateContent(PackageHash, out string validateError) == false) { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"Cache package hash file content is empty."; + Error = $"Cache package hash file validate failed: {validateError}"; } else { diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/LoadCachePackageManifestOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/LoadCachePackageManifestOperation.cs index a35442c9..7c532091 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/LoadCachePackageManifestOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/LoadCachePackageManifestOperation.cs @@ -1,7 +1,10 @@ -using System.IO; +using System.IO; namespace YooAsset { + /// + /// 加载缓存包裹清单文件操作 + /// internal class LoadCachePackageManifestOperation : AsyncOperationBase { private enum ESteps @@ -16,14 +19,14 @@ namespace YooAsset private readonly SandboxFileSystem _fileSystem; private readonly string _packageVersion; private readonly string _packageHash; - private DeserializeManifestOperation _deserializer; + private DeserializeManifestOperation _deserializeManifestOp; private byte[] _fileData; private ESteps _steps = ESteps.None; /// /// 包裹清单 /// - public PackageManifest Manifest { private set; get; } + public PackageManifest Manifest { get; private set; } internal LoadCachePackageManifestOperation(SandboxFileSystem fileSystem, string packageVersion, string packageHash) @@ -53,7 +56,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"Can not found cache manifest file : {manifestFilePath}"; + Error = $"Cannot find cache manifest file: {manifestFilePath}"; } } @@ -73,35 +76,35 @@ namespace YooAsset if (_steps == ESteps.LoadManifest) { - if (_deserializer == null) + if (_deserializeManifestOp == null) { - _deserializer = new DeserializeManifestOperation(_fileSystem.ManifestDecryptor, _fileData); - _deserializer.StartOperation(); - AddChildOperation(_deserializer); + _deserializeManifestOp = new DeserializeManifestOperation(_fileSystem.ManifestDecryptor, _fileData); + _deserializeManifestOp.StartOperation(); + AddChildOperation(_deserializeManifestOp); } - _deserializer.UpdateOperation(); - Progress = _deserializer.Progress; - if (_deserializer.IsDone == false) + _deserializeManifestOp.UpdateOperation(); + Progress = _deserializeManifestOp.Progress; + if (_deserializeManifestOp.IsDone == false) return; - if (_deserializer.Status == EOperationStatus.Succeeded) + if (_deserializeManifestOp.Status == EOperationStatus.Succeeded) { _steps = ESteps.Done; - Manifest = _deserializer.Manifest; + Manifest = _deserializeManifestOp.Manifest; Status = EOperationStatus.Succeeded; } else { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _deserializer.Error; + Error = _deserializeManifestOp.Error; } } } internal override string InternalGetDescription() { - return $"PackageVersion : {_packageVersion} PackageHash : {_packageHash}"; + return $"PackageVersion: {_packageVersion} PackageHash: {_packageHash}"; } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/RequestRemotePackageVersionOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/RequestRemotePackageVersionOperation.cs index a674b47c..5bdd85a7 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/RequestRemotePackageVersionOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/Internal/RequestRemotePackageVersionOperation.cs @@ -1,6 +1,9 @@ namespace YooAsset { + /// + /// 请求远端包裹版本操作 + /// internal class RequestRemotePackageVersionOperation : AsyncOperationBase { private enum ESteps @@ -13,8 +16,7 @@ namespace YooAsset private readonly SandboxFileSystem _fileSystem; private readonly bool _appendTimeTicks; private readonly int _timeout; - private IDownloadTextRequest _webTextRequestOp; - private int _requestCount = 0; + private IDownloadTextRequest _downloadTextRequest; private ESteps _steps = ESteps.None; /// @@ -31,7 +33,6 @@ namespace YooAsset } internal override void InternalStart() { - _requestCount = DownloadFailureCounter.GetFailureCount(_fileSystem.PackageName, nameof(RequestRemotePackageVersionOperation)); _steps = ESteps.RequestPackageVersion; } internal override void InternalUpdate() @@ -41,28 +42,28 @@ namespace YooAsset if (_steps == ESteps.RequestPackageVersion) { - if (_webTextRequestOp == null) + if (_downloadTextRequest == null) { string fileName = YooAssetSettingsData.GetPackageVersionFileName(_fileSystem.PackageName); string url = GetWebRequestURL(fileName); - int watchDogTime = _fileSystem.DownloadWatchDogTimeout; + int watchDogTime = _fileSystem.DownloadWatchdogTimeout; var args = new DownloadDataRequestArgs(url, _timeout, watchDogTime); - _webTextRequestOp = _fileSystem.DownloadBackend.CreateTextRequest(args); - _webTextRequestOp.SendRequest(); + _downloadTextRequest = _fileSystem.DownloadBackend.CreateTextRequest(args); + _downloadTextRequest.SendRequest(); } - Progress = _webTextRequestOp.DownloadProgress; - if (_webTextRequestOp.IsDone == false) + Progress = _downloadTextRequest.DownloadProgress; + if (_downloadTextRequest.IsDone == false) return; - if (_webTextRequestOp.Status == EDownloadRequestStatus.Succeeded) + if (_downloadTextRequest.Status == EDownloadRequestStatus.Succeeded) { - PackageVersion = _webTextRequestOp.Result; - if (string.IsNullOrEmpty(PackageVersion)) + PackageVersion = _downloadTextRequest.Result; + if (TextUtility.ValidateContent(PackageVersion, out string validateError) == false) { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"Remote package version file content is empty."; + Error = $"Remote package version file validate failed: {validateError}"; } else { @@ -74,29 +75,24 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _webTextRequestOp.Error; - DownloadFailureCounter.RecordFailure(_fileSystem.PackageName, nameof(RequestRemotePackageVersionOperation)); + Error = _downloadTextRequest.Error; + _fileSystem.DownloadURLPolicy.OnFailure(_downloadTextRequest.Url, _downloadTextRequest.HttpCode, _downloadTextRequest.HttpError); } } } internal override void InternalDispose() { - if (_webTextRequestOp != null) + if (_downloadTextRequest != null) { - _webTextRequestOp.Dispose(); - _webTextRequestOp = null; + _downloadTextRequest.Dispose(); + _downloadTextRequest = null; } } private string GetWebRequestURL(string fileName) { - string url; - - // 轮流返回请求地址 - if (_requestCount % 2 == 0) - url = _fileSystem.RemoteServices.GetRemoteMainURL(fileName); - else - url = _fileSystem.RemoteServices.GetRemoteFallbackURL(fileName); + var urls = _fileSystem.RemoteServices.GetRemoteURLs(fileName); + string url = _fileSystem.DownloadURLPolicy.SelectURL(urls); // 在URL末尾添加时间戳 if (_appendTimeTicks) diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSClearCacheOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSClearCacheOperation.cs index 45839d78..1ac6cd01 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSClearCacheOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSClearCacheOperation.cs @@ -1,8 +1,11 @@ -using System; +using System; using System.IO; namespace YooAsset { + /// + /// 沙盒文件系统的清理缓存操作 + /// internal class SFSClearCacheOperation : FSClearCacheOperation { private enum ESteps @@ -13,11 +16,11 @@ namespace YooAsset } private readonly SandboxFileSystem _fileSystem; - private readonly ClearCacheOptions _options; + private readonly FSClearCacheOptions _options; private FCClearCacheOperation _clearCacheOp; private ESteps _steps = ESteps.None; - internal SFSClearCacheOperation(SandboxFileSystem fileSystem, ClearCacheOptions options) + internal SFSClearCacheOperation(SandboxFileSystem fileSystem, FSClearCacheOptions options) { _fileSystem = fileSystem; _options = options; @@ -35,7 +38,7 @@ namespace YooAsset { if (_clearCacheOp == null) { - _clearCacheOp = _fileSystem.FileCache.ClearCacheAsync(_options); + _clearCacheOp = _fileSystem.FileCache.ClearCacheAsync(_options.ConvertTo()); _clearCacheOp.StartOperation(); AddChildOperation(_clearCacheOp); } @@ -59,7 +62,10 @@ namespace YooAsset } } - internal class CFSClearAllCacheManifestOperation : FSClearCacheOperation + /// + /// 沙盒文件系统的清理所有缓存清单操作 + /// + internal class SFSClearAllCacheManifestOperation : FSClearCacheOperation { private enum ESteps { @@ -71,7 +77,7 @@ namespace YooAsset private readonly SandboxFileSystem _fileSystem; private ESteps _steps = ESteps.None; - internal CFSClearAllCacheManifestOperation(SandboxFileSystem fileSystem) + internal SFSClearAllCacheManifestOperation(SandboxFileSystem fileSystem) { _fileSystem = fileSystem; } @@ -96,7 +102,7 @@ namespace YooAsset foreach (FileInfo fileInfo in directoryInfo.GetFiles()) { string fileName = fileInfo.Name; - if (fileName == SandboxFileSystemDefine.AppFootPrintFileName) + if (fileName == SandboxFileSystemConsts.AppFootprintFileName) continue; fileInfo.Delete(); @@ -109,14 +115,17 @@ namespace YooAsset catch (Exception ex) { _steps = ESteps.Done; - Error = ex.Message; Status = EOperationStatus.Failed; + Error = ex.Message; } } } } - internal class CFSClearUnusedCacheManifestOperation : FSClearCacheOperation + /// + /// 沙盒文件系统的清理未使用缓存清单操作 + /// + internal class SFSClearUnusedCacheManifestOperation : FSClearCacheOperation { private enum ESteps { @@ -130,7 +139,7 @@ namespace YooAsset private readonly PackageManifest _manifest; private ESteps _steps = ESteps.None; - internal CFSClearUnusedCacheManifestOperation(SandboxFileSystem fileSystem, PackageManifest manifest) + internal SFSClearUnusedCacheManifestOperation(SandboxFileSystem fileSystem, PackageManifest manifest) { _fileSystem = fileSystem; _manifest = manifest; @@ -150,7 +159,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = "Can not found active package manifest."; + Error = "Cannot find active package manifest."; } else { @@ -173,7 +182,7 @@ namespace YooAsset foreach (FileInfo fileInfo in directoryInfo.GetFiles()) { string fileName = fileInfo.Name; - if (fileName == SandboxFileSystemDefine.AppFootPrintFileName) + if (fileName == SandboxFileSystemConsts.AppFootprintFileName) continue; if (fileName == activeManifestFileName || fileName == activeHashFileName) continue; @@ -188,8 +197,8 @@ namespace YooAsset catch (Exception ex) { _steps = ESteps.Done; - Error = ex.Message; Status = EOperationStatus.Failed; + Error = ex.Message; } } } diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSDownloadFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSDownloadFileOperation.cs index 85e401e6..00cb79b0 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSDownloadFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSDownloadFileOperation.cs @@ -2,32 +2,32 @@ using UnityEngine; namespace YooAsset { + /// + /// 沙盒文件系统的下载文件操作 + /// internal class SFSDownloadFileOperation : FSDownloadFileOperation { protected enum ESteps { None, CheckExists, - DownloadAndCache, + CreateDownload, + CheckDownload, TryAgain, Done, } private readonly SandboxFileSystem _fileSystem; private readonly FSDownloadFileOptions _options; + private readonly DownloadRetry _downloadRetry; private DownloadFileBaseOperation _downloadFileOp; private ESteps _steps = ESteps.None; - // 失败重试 - private int _requestCount = 0; - private float _tryAgainTimer = 0; - private int _failedTryAgain; - internal SFSDownloadFileOperation(SandboxFileSystem fileSystem, FSDownloadFileOptions options) : base(options.Bundle) { _fileSystem = fileSystem; _options = options; - _failedTryAgain = options.RetryCount; + _downloadRetry = new DownloadRetry(options.RetryCount, _fileSystem.DownloadRetryPolicy); } internal override void InternalStart() { @@ -48,57 +48,62 @@ namespace YooAsset } else { - _steps = ESteps.DownloadAndCache; + _steps = ESteps.CreateDownload; } } - // 下载并缓存文件 - if (_steps == ESteps.DownloadAndCache) + // 创建下载器 + if (_steps == ESteps.CreateDownload) { + _downloadFileOp = _fileSystem.DownloadScheduler.TryGetDownloadFile(Bundle); if (_downloadFileOp == null) { - _downloadFileOp = _fileSystem.DownloadScheduler.TryGetDownloadFile(Bundle); - if (_downloadFileOp == null) + if (string.IsNullOrEmpty(_options.ImportFilePath)) { - if (string.IsNullOrEmpty(_options.ImportFilePath)) - { - // 下载远端文件 - string mainURL = _fileSystem.RemoteServices.GetRemoteMainURL(Bundle.FileName); - string fallbackURL = _fileSystem.RemoteServices.GetRemoteFallbackURL(Bundle.FileName); - string url = GetRequestURL(mainURL, fallbackURL); - _downloadFileOp = new DownloadAndCacheFileOperation(_fileSystem, Bundle, url); - _fileSystem.DownloadScheduler.AddDownloadFile(_downloadFileOp); - } - else - { - // 导入本地文件 - _downloadFileOp = new ImportAndCacheFileOperation(_fileSystem, Bundle, _options.ImportFilePath); - _fileSystem.DownloadScheduler.AddDownloadFile(_downloadFileOp); - } + // 下载远端文件 + string url = GetRequestURL(Bundle.FileName); + _downloadFileOp = new DownloadAndCacheFileOperation(_fileSystem, Bundle, url); + _fileSystem.DownloadScheduler.AddDownloadFile(_downloadFileOp); + } + else + { + // 导入本地文件 + _downloadFileOp = new ImportAndCacheFileOperation(_fileSystem, Bundle, _options.ImportFilePath); + _fileSystem.DownloadScheduler.AddDownloadFile(_downloadFileOp); } } + _steps = ESteps.CheckDownload; + } + + // 检测结果 + if (_steps == ESteps.CheckDownload) + { if (IsWaitForCompletion) _downloadFileOp.WaitForCompletion(); _downloadFileOp.UpdateOperation(); Progress = _downloadFileOp.Progress; - DownloadedBytes = _downloadFileOp.DownloadedBytes; - DownloadProgress = _downloadFileOp.DownloadProgress; + Report = _downloadFileOp.Report; if (_downloadFileOp.IsDone == false) return; if (_downloadFileOp.Status == EOperationStatus.Succeeded) { + _fileSystem.DownloadURLPolicy.OnSuccess(_downloadFileOp.Url); _steps = ESteps.Done; Status = EOperationStatus.Succeeded; } else { - if (IsWaitForCompletion == false && _failedTryAgain > 0) + string url = _downloadFileOp.Url; + long httpCode = _downloadFileOp.Report.HttpCode; + string httpError = _downloadFileOp.Report.HttpError; + _fileSystem.DownloadURLPolicy.OnFailure(url, httpCode, httpError); + if (IsWaitForCompletion == false && _downloadRetry.CanRetry(url, httpCode, httpError)) { + _downloadRetry.BeginWait(); _steps = ESteps.TryAgain; - YooLogger.Warning($"Failed download : {_downloadFileOp.Url} Try again."); } else { @@ -113,15 +118,11 @@ namespace YooAsset // 重新尝试下载 if (_steps == ESteps.TryAgain) { - _tryAgainTimer += Time.unscaledDeltaTime; - if (_tryAgainTimer > 1f) + if (_downloadRetry.Tick()) { - _tryAgainTimer = 0f; - _failedTryAgain--; Progress = 0f; - DownloadProgress = 0f; - DownloadedBytes = 0; - _steps = ESteps.DownloadAndCache; + Report = DownloadReport.Default; + _steps = ESteps.CreateDownload; } } } @@ -144,14 +145,10 @@ namespace YooAsset /// /// 获取网络请求地址 /// - private string GetRequestURL(string mainURL, string fallbackURL) + private string GetRequestURL(string fileName) { - // 轮流返回请求地址 - _requestCount++; - if (_requestCount % 2 == 0) - return fallbackURL; - else - return mainURL; + var urls = _fileSystem.RemoteServices.GetRemoteURLs(fileName); + return _fileSystem.DownloadURLPolicy.SelectURL(urls); } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSInitializeOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSInitializeOperation.cs index ac6397e9..7070607c 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSInitializeOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSInitializeOperation.cs @@ -1,11 +1,16 @@ namespace YooAsset { + /// + /// 沙盒文件系统的初始化操作 + /// internal class SFSInitializeOperation : FSInitializeOperation { private enum ESteps { None, + CheckPlatform, + CheckParameter, CheckAppFootprint, InitializeFileCache, CreateScheduler, @@ -23,22 +28,40 @@ namespace YooAsset } internal override void InternalStart() { -#if UNITY_WEBGL - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = $"{nameof(DefaultCacheFileSystem)} is not support WEBGL platform."; -#else - _steps = ESteps.CheckAppFootprint; -#endif + _steps = ESteps.CheckPlatform; } internal override void InternalUpdate() { if (_steps == ESteps.None || _steps == ESteps.Done) return; + if (_steps == ESteps.CheckPlatform) + { +#if UNITY_WEBGL + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"{nameof(SandboxFileSystem)} does not support the WebGL platform."; +#else + _steps = ESteps.CheckParameter; +#endif + } + + if (_steps == ESteps.CheckParameter) + { + if (_fileSystem.RemoteServices == null) + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"{nameof(IRemoteServices)} is null."; + return; + } + + _steps = ESteps.CheckAppFootprint; + } + if (_steps == ESteps.CheckAppFootprint) { - string footprintFilePath = _fileSystem.GetSandboxAppFootPrintFilePath(); + string footprintFilePath = _fileSystem.GetSandboxAppFootprintFilePath(); var appFootprint = new ApplicationFootprint(footprintFilePath); appFootprint.Load(_fileSystem.PackageName); @@ -47,30 +70,31 @@ namespace YooAsset { if (_fileSystem.InstallCleanupMode == EInstallCleanupMode.None) { - YooLogger.Warning("Do nothing when overwrite install application."); + YooLogger.Warning("No action required on overwrite installation."); } else if (_fileSystem.InstallCleanupMode == EInstallCleanupMode.ClearAllCacheFiles) { _fileSystem.DeleteAllBundleFiles(); _fileSystem.DeleteAllManifestFiles(); - YooLogger.Warning("Delete all cache files when overwrite install application."); + _fileSystem.DeleteAllTempFiles(); + YooLogger.Warning("Deleted all cache files on overwrite installation."); } else if (_fileSystem.InstallCleanupMode == EInstallCleanupMode.ClearAllBundleFiles) { _fileSystem.DeleteAllBundleFiles(); - YooLogger.Warning("Delete all bundle files when overwrite install application."); + YooLogger.Warning("Deleted all bundle files on overwrite installation."); } else if (_fileSystem.InstallCleanupMode == EInstallCleanupMode.ClearAllManifestFiles) { _fileSystem.DeleteAllManifestFiles(); - YooLogger.Warning("Delete all manifest files when overwrite install application."); + YooLogger.Warning("Deleted all manifest files on overwrite installation."); } else { throw new System.NotImplementedException(_fileSystem.InstallCleanupMode.ToString()); } - appFootprint.Coverage(_fileSystem.PackageName); + appFootprint.Overwrite(_fileSystem.PackageName); } _steps = ESteps.InitializeFileCache; diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSLoadBundleOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSLoadPackageBundleOperation.cs similarity index 77% rename from Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSLoadBundleOperation.cs rename to Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSLoadPackageBundleOperation.cs index ee40d4df..b84ce9ae 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSLoadBundleOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSLoadPackageBundleOperation.cs @@ -1,7 +1,10 @@ namespace YooAsset { - internal class SFSLoadBundleOperation : FSLoadBundleOperation + /// + /// 沙盒文件系统的加载资源包操作 + /// + internal class SFSLoadPackageBundleOperation : FSLoadPackageBundleOperation { private enum ESteps { @@ -9,18 +12,18 @@ namespace YooAsset Prepare, DownloadFile, AbortDownload, - LoadSandboxBundle, + LoadBundle, CheckResult, Done, } private readonly SandboxFileSystem _fileSystem; - private readonly FCLoadBundleOptions _options; + private readonly FSLoadPackageBundleOptions _options; private FSDownloadFileOperation _downloadFileOp; private FCLoadBundleOperation _loadBundleOp; private ESteps _steps = ESteps.None; - internal SFSLoadBundleOperation(SandboxFileSystem fileSystem, FCLoadBundleOptions options) + internal SFSLoadPackageBundleOperation(SandboxFileSystem fileSystem, FSLoadPackageBundleOptions options) { _fileSystem = fileSystem; _options = options; @@ -38,9 +41,7 @@ namespace YooAsset { if (_fileSystem.FileCache.IsCached(_options.Bundle.BundleGUID)) { - DownloadProgress = 1f; - DownloadedBytes = _options.Bundle.FileSize; - _steps = ESteps.LoadSandboxBundle; + _steps = ESteps.LoadBundle; } else { @@ -48,7 +49,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"The bundle not cached : {_options.Bundle.BundleName}"; + Error = $"The bundle is not cached: {_options.Bundle.BundleName}"; YooLogger.Warning(Error); } else @@ -73,8 +74,10 @@ namespace YooAsset { if (_downloadFileOp == null) { - FSDownloadFileOptions options = new FSDownloadFileOptions(_options.Bundle, int.MaxValue); - _downloadFileOp = _fileSystem.DownloadFileAsync(options); // 注意:异步任务的开启由调度器统一控制 + // 注意:网络原因失败后,重新尝试直到成功 + var options = new FSDownloadFileOptions(_options.Bundle, int.MaxValue); + _downloadFileOp = _fileSystem.DownloadFileAsync(options); + _downloadFileOp.StartOperation(); AddChildOperation(_downloadFileOp); } @@ -82,14 +85,12 @@ namespace YooAsset _downloadFileOp.WaitForCompletion(); _downloadFileOp.UpdateOperation(); - DownloadProgress = _downloadFileOp.DownloadProgress; - DownloadedBytes = _downloadFileOp.DownloadedBytes; if (_downloadFileOp.IsDone == false) return; if (_downloadFileOp.Status == EOperationStatus.Succeeded) { - _steps = ESteps.LoadSandboxBundle; + _steps = ESteps.LoadBundle; } else { @@ -113,12 +114,12 @@ namespace YooAsset _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = "Abort download file."; + Error = "File download aborted."; } - if (_steps == ESteps.LoadSandboxBundle) + if (_steps == ESteps.LoadBundle) { - _loadBundleOp = _fileSystem.FileCache.LoadBundleAsync(_options); + _loadBundleOp = _fileSystem.FileCache.LoadBundleAsync(_options.ConvertTo()); _loadBundleOp.StartOperation(); AddChildOperation(_loadBundleOp); _steps = ESteps.CheckResult; @@ -135,18 +136,18 @@ namespace YooAsset if (_loadBundleOp.Status == EOperationStatus.Succeeded) { - if (_loadBundleOp.BundleResult == null) + if (_loadBundleOp.BundleHandle == null) { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = "Fatal error: loaded bundle result is null."; + Error = "Fatal error: loaded bundle handle is null."; YooLogger.Error(Error); } else { _steps = ESteps.Done; Status = EOperationStatus.Succeeded; - Result = _loadBundleOp.BundleResult; + BundleHandle = _loadBundleOp.BundleHandle; } } else @@ -158,5 +159,9 @@ namespace YooAsset } } } + internal override void InternalWaitForCompletion() + { + ExecuteBatch(); + } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSLoadBundleOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSLoadPackageBundleOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSLoadBundleOperation.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSLoadPackageBundleOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSLoadManifestOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSLoadPackageManifestOperation.cs similarity index 89% rename from Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSLoadManifestOperation.cs rename to Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSLoadPackageManifestOperation.cs index e175838e..be48762e 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSLoadManifestOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSLoadPackageManifestOperation.cs @@ -1,16 +1,19 @@ -using System.IO; +using System.IO; namespace YooAsset { - internal class SFSLoadPackageManifestOperation : FSLoadManifestOperation + /// + /// 沙盒文件系统的加载包裹清单操作 + /// + internal class SFSLoadPackageManifestOperation : FSLoadPackageManifestOperation { private enum ESteps { None, DownloadPackageHash, DownloadPackageManifest, - LoadCachePackageHash, - LoadCachePackageManifest, + LoadPackageHash, + LoadPackageManifest, Done, } @@ -79,7 +82,7 @@ namespace YooAsset if (_downloadPackageManifestOp.Status == EOperationStatus.Succeeded) { - _steps = ESteps.LoadCachePackageHash; + _steps = ESteps.LoadPackageHash; } else { @@ -89,7 +92,7 @@ namespace YooAsset } } - if (_steps == ESteps.LoadCachePackageHash) + if (_steps == ESteps.LoadPackageHash) { if (_loadCachePackageHashOp == null) { @@ -104,7 +107,7 @@ namespace YooAsset if (_loadCachePackageHashOp.Status == EOperationStatus.Succeeded) { - _steps = ESteps.LoadCachePackageManifest; + _steps = ESteps.LoadPackageManifest; } else { @@ -115,7 +118,7 @@ namespace YooAsset } } - if (_steps == ESteps.LoadCachePackageManifest) + if (_steps == ESteps.LoadPackageManifest) { if (_loadCachePackageManifestOp == null) { @@ -133,8 +136,8 @@ namespace YooAsset if (_loadCachePackageManifestOp.Status == EOperationStatus.Succeeded) { _steps = ESteps.Done; - Manifest = _loadCachePackageManifestOp.Manifest; Status = EOperationStatus.Succeeded; + Manifest = _loadCachePackageManifestOp.Manifest; } else { @@ -152,13 +155,14 @@ namespace YooAsset string manifestFilePath = _fileSystem.GetCachePackageManifestFilePath(_packageVersion); if (File.Exists(manifestFilePath)) { - YooLogger.Warning($"Invalid cache manifest file have been removed : {manifestFilePath}"); + YooLogger.Warning($"Invalid package manifest file has been removed: {manifestFilePath}"); File.Delete(manifestFilePath); } string hashFilePath = _fileSystem.GetCachePackageHashFilePath(_packageVersion); if (File.Exists(hashFilePath)) { + YooLogger.Warning($"Invalid package hash file has been removed: {hashFilePath}"); File.Delete(hashFilePath); } } diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSLoadManifestOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSLoadPackageManifestOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSLoadManifestOperation.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSLoadPackageManifestOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSRequestVersionOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSRequestPackageVersionOperation.cs similarity index 95% rename from Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSRequestVersionOperation.cs rename to Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSRequestPackageVersionOperation.cs index 776ebbc9..1cb7b422 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSRequestVersionOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSRequestPackageVersionOperation.cs @@ -1,7 +1,10 @@ - + namespace YooAsset { - internal class SFSRequestPackageVersionOperation : FSRequestVersionOperation + /// + /// 沙盒文件系统的查询包裹版本操作 + /// + internal class SFSRequestPackageVersionOperation : FSRequestPackageVersionOperation { private enum ESteps { diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSRequestVersionOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSRequestPackageVersionOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSRequestVersionOperation.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/Operations/SFSRequestPackageVersionOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/SandboxFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/SandboxFileSystem.cs index 43f417e4..8ac13622 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/SandboxFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/SandboxFileSystem.cs @@ -41,63 +41,58 @@ namespace YooAsset /// /// 自定义参数:UnityWebRequest 创建委托 /// - public UnityWebRequestCreator WebRequestCreator { private set; get; } + public UnityWebRequestCreator WebRequestCreator { get; private set; } /// /// 自定义参数:远程服务接口的实例类 /// - public IRemoteServices RemoteServices { private set; get; } + public IRemoteServices RemoteServices { get; private set; } /// /// 自定义参数:覆盖安装缓存清理模式 /// - public EInstallCleanupMode InstallCleanupMode { private set; get; } = EInstallCleanupMode.None; + public EInstallCleanupMode InstallCleanupMode { get; private set; } = EInstallCleanupMode.None; /// /// 自定义参数:初始化的时候缓存文件校验级别 /// - public EFileVerifyLevel FileVerifyLevel { private set; get; } = EFileVerifyLevel.Low; + public EFileVerifyLevel FileVerifyLevel { get; private set; } = EFileVerifyLevel.Low; /// /// 自定义参数:初始化的时候缓存文件校验最大并发数 - /// 默认值:8(推荐范围 1-32) + /// 默认值:8(推荐值为处理器数两倍) /// 说明:过大的值可能导致线程池任务过多,影响系统稳定性 /// - public int FileVerifyMaxConcurrency { private set; get; } = 8; + public int FileVerifyMaxConcurrency { get; private set; } = 8; /// /// 自定义参数:禁用边玩边下机制 /// - public bool DisableOnDemandDownload { private set; get; } = false; + public bool DisableOnDemandDownload { get; private set; } = false; /// /// 自定义参数:最大并发连接数 /// 默认值:8(推荐范围 1-32) /// 说明:过大的并发数可能被服务器限流,也会增加本地资源消耗 /// - public int DownloadMaxConcurrency { private set; get; } = 8; + public int DownloadMaxConcurrency { get; private set; } = 8; /// /// 自定义参数:每帧发起的最大请求数 /// 默认值:8(推荐范围 1-32) /// 说明:避免单帧发起过多请求导致卡顿 /// - public int DownloadMaxRequestPerFrame { private set; get; } = 8; + public int DownloadMaxRequestPerFrame { get; private set; } = 8; /// /// 自定义参数:下载任务的看门狗机制超时时间 /// - public int DownloadWatchDogTimeout { private set; get; } = 0; + public int DownloadWatchdogTimeout { get; private set; } = 0; /// /// 自定义参数:启用断点续传的最小尺寸 /// - public long ResumeDownloadMinimumSize { private set; get; } = long.MaxValue; - - /// - /// 自定义参数:断点续传下载器关注的错误码 - /// - public List ResumeDownloadResponseCodes { private set; get; } = null; + public long ResumeDownloadMinimumSize { get; private set; } = long.MaxValue; /// /// 自定义参数:AssetBundle 解密器 @@ -117,7 +112,17 @@ namespace YooAsset /// /// 自定义参数:资源清单解密器 /// - public IManifestDecryptor ManifestDecryptor { private set; get; } + public IManifestDecryptor ManifestDecryptor { get; private set; } + + /// + /// 自定义参数:下载重试判定策略 + /// + public IDownloadRetryPolicy DownloadRetryPolicy { get; private set; } + + /// + /// 自定义参数:URL 选择策略 + /// + public IDownloadURLPolicy DownloadURLPolicy { get; private set; } #endregion public SandboxFileSystem() @@ -128,26 +133,36 @@ namespace YooAsset var operation = new SFSInitializeOperation(this); return operation; } - public virtual FSRequestVersionOperation RequestVersionAsync(RequestVersionOptions options) + public virtual FSRequestPackageVersionOperation RequestPackageVersionAsync(FSRequestPackageVersionOptions options) { var operation = new SFSRequestPackageVersionOperation(this, options.AppendTimeTicks, options.Timeout); return operation; } - public virtual FSLoadManifestOperation LoadManifestAsync(LoadManifestOptions options) + public virtual FSLoadPackageManifestOperation LoadPackageManifestAsync(FSLoadPackageManifestOptions options) { var operation = new SFSLoadPackageManifestOperation(this, options.PackageVersion, options.Timeout); return operation; } - public virtual FSClearCacheOperation ClearCacheAsync(ClearCacheOptions options) + public virtual FSLoadPackageBundleOperation LoadPackageBundleAsync(FSLoadPackageBundleOptions options) + { + var operation = new SFSLoadPackageBundleOperation(this, options); + return operation; + } + public virtual FSDownloadFileOperation DownloadFileAsync(FSDownloadFileOptions options) + { + var downloader = new SFSDownloadFileOperation(this, options); + return downloader; + } + public virtual FSClearCacheOperation ClearCacheAsync(FSClearCacheOptions options) { if (options.ClearMode == EManifestClearMode.ClearAllManifestFiles.ToString()) { - var operation = new CFSClearAllCacheManifestOperation(this); + var operation = new SFSClearAllCacheManifestOperation(this); return operation; } else if (options.ClearMode == EManifestClearMode.ClearUnusedManifestFiles.ToString()) { - var operation = new CFSClearUnusedCacheManifestOperation(this, options.Manifest); + var operation = new SFSClearUnusedCacheManifestOperation(this, options.Manifest); return operation; } else @@ -156,40 +171,30 @@ namespace YooAsset return operation; } } - public virtual FSDownloadFileOperation DownloadFileAsync(FSDownloadFileOptions options) - { - var downloader = new SFSDownloadFileOperation(this, options); - return downloader; - } - public virtual FSLoadBundleOperation LoadBundleAsync(FCLoadBundleOptions options) - { - var operation = new SFSLoadBundleOperation(this, options); - return operation; - } public virtual void SetParameter(string name, object value) { - if (name == FileSystemParametersDefine.DOWNLOAD_BACKEND) + if (name == FileSystemConsts.DOWNLOAD_BACKEND) { DownloadBackend = (IDownloadBackend)value; } - else if (name == FileSystemParametersDefine.UNITY_WEB_REQUEST_CREATOR) + else if (name == FileSystemConsts.UNITY_WEB_REQUEST_CREATOR) { WebRequestCreator = (UnityWebRequestCreator)value; } - else if (name == FileSystemParametersDefine.REMOTE_SERVICES) + else if (name == FileSystemConsts.REMOTE_SERVICES) { RemoteServices = (IRemoteServices)value; } - else if (name == FileSystemParametersDefine.INSTALL_CLEAR_MODE) + else if (name == FileSystemConsts.INSTALL_CLEANUP_MODE) { InstallCleanupMode = (EInstallCleanupMode)value; } - else if (name == FileSystemParametersDefine.FILE_VERIFY_LEVEL) + else if (name == FileSystemConsts.FILE_VERIFY_LEVEL) { FileVerifyLevel = (EFileVerifyLevel)value; } - else if (name == FileSystemParametersDefine.FILE_VERIFY_MAX_CONCURRENCY) + else if (name == FileSystemConsts.FILE_VERIFY_MAX_CONCURRENCY) { int convertValue = Convert.ToInt32(value); if (convertValue > 32) @@ -200,11 +205,11 @@ namespace YooAsset // 限制在合理范围内:1-32 FileVerifyMaxConcurrency = Mathf.Clamp(convertValue, 1, 32); } - else if (name == FileSystemParametersDefine.DOWNLOAD_DISABLE_ONDEMAND) + else if (name == FileSystemConsts.DOWNLOAD_DISABLE_ONDEMAND) { DisableOnDemandDownload = Convert.ToBoolean(value); } - else if (name == FileSystemParametersDefine.DOWNLOAD_MAX_CONCURRENCY) + else if (name == FileSystemConsts.DOWNLOAD_MAX_CONCURRENCY) { int convertValue = Convert.ToInt32(value); if (convertValue > 32) @@ -215,7 +220,7 @@ namespace YooAsset // 限制在合理范围内:1-32 DownloadMaxConcurrency = Mathf.Clamp(convertValue, 1, 32); } - else if (name == FileSystemParametersDefine.DOWNLOAD_MAX_REQUEST_PER_FRAME) + else if (name == FileSystemConsts.DOWNLOAD_MAX_REQUEST_PER_FRAME) { int convertValue = Convert.ToInt32(value); if (convertValue > 32) @@ -226,38 +231,42 @@ namespace YooAsset // 限制在合理范围内:1-32 DownloadMaxRequestPerFrame = Mathf.Clamp(convertValue, 1, 32); } - else if (name == FileSystemParametersDefine.DOWNLOAD_WATCH_DOG_TIME) + else if (name == FileSystemConsts.DOWNLOAD_WATCHDOG_TIMEOUT) { int convertValue = Convert.ToInt32(value); - DownloadWatchDogTimeout = Mathf.Clamp(convertValue, 0, int.MaxValue); + DownloadWatchdogTimeout = Mathf.Clamp(convertValue, 0, int.MaxValue); } - else if (name == FileSystemParametersDefine.DOWNLOAD_RESUME_MINMUM_SIZE) + else if (name == FileSystemConsts.DOWNLOAD_RESUME_MINIMUM_SIZE) { ResumeDownloadMinimumSize = Convert.ToInt64(value); } - else if (name == FileSystemParametersDefine.DOWNLOAD_RESUME_RESPONSE_CODES) - { - ResumeDownloadResponseCodes = (List)value; - } - else if (name == FileSystemParametersDefine.ASSETBUNDLE_DECRYPTOR) + else if (name == FileSystemConsts.ASSETBUNDLE_DECRYPTOR) { AssetBundleDecryptor = (IBundleDecryptor)value; } - else if (name == FileSystemParametersDefine.RAWBUNDLE_DECRYPTOR) + else if (name == FileSystemConsts.RAWBUNDLE_DECRYPTOR) { RawBundleDecryptor = (IBundleDecryptor)value; } - else if (name == FileSystemParametersDefine.ASSETBUNDLE_FALLBACK_DECRYPTOR) + else if (name == FileSystemConsts.ASSETBUNDLE_FALLBACK_DECRYPTOR) { AssetBundleFallbackDecryptor = (IBundleMemoryDecryptor)value; } - else if (name == FileSystemParametersDefine.MANIFEST_DECRYPTOR) + else if (name == FileSystemConsts.MANIFEST_DECRYPTOR) { ManifestDecryptor = (IManifestDecryptor)value; } + else if (name == FileSystemConsts.DOWNLOAD_RETRY_POLICY) + { + DownloadRetryPolicy = (IDownloadRetryPolicy)value; + } + else if (name == FileSystemConsts.DOWNLOAD_URL_POLICY) + { + DownloadURLPolicy = (IDownloadURLPolicy)value; + } else { - YooLogger.Warning($"Invalid parameter : {name}"); + YooLogger.Warning($"Invalid parameter: {name}"); } } public virtual void OnCreate(string packageName, string packageRoot) @@ -269,9 +278,21 @@ namespace YooAsset else _packageRoot = packageRoot; - _cacheBundleFilesRoot = PathUtility.Combine(_packageRoot, SandboxFileSystemDefine.BundleFilesFolderName); - _cacheManifestFilesRoot = PathUtility.Combine(_packageRoot, SandboxFileSystemDefine.ManifestFilesFolderName); - _tempFilesRoot = PathUtility.Combine(_packageRoot, SandboxFileSystemDefine.TempFilesFolderName); + _cacheBundleFilesRoot = PathUtility.Combine(_packageRoot, SandboxFileSystemConsts.BundleFilesFolderName); + _cacheManifestFilesRoot = PathUtility.Combine(_packageRoot, SandboxFileSystemConsts.ManifestFilesFolderName); + _tempFilesRoot = PathUtility.Combine(_packageRoot, SandboxFileSystemConsts.TempFilesFolderName); + + // 创建默认的下载后台接口 + if (DownloadBackend == null) + DownloadBackend = new UnityWebRequestBackend(WebRequestCreator); + + // 创建默认的下载重试策略 + if (DownloadRetryPolicy == null) + DownloadRetryPolicy = new DefaultDownloadRetryPolicy(); + + // 创建默认的 URL 选择策略 + if (DownloadURLPolicy == null) + DownloadURLPolicy = new DefaultDownloadURLPolicy(); // 创建文件缓存系统 { @@ -283,10 +304,6 @@ namespace YooAsset cacheConfig.AssetBundleFallbackDecryptor = AssetBundleFallbackDecryptor; FileCache = new SandboxFileCache(PackageName, _cacheBundleFilesRoot, cacheConfig); } - - // 创建默认的下载后台接口 - if (DownloadBackend == null) - DownloadBackend = new UnityWebRequestBackend(WebRequestCreator); } public virtual void OnDestroy() { @@ -298,7 +315,7 @@ namespace YooAsset if (DownloadScheduler != null) { - DownloadScheduler.Dispose(); + DownloadScheduler.AbortOperation(); DownloadScheduler = null; } @@ -311,7 +328,7 @@ namespace YooAsset public virtual bool Belong(PackageBundle bundle) { - // 注意:沙盒文件系统保底加载! + // 注意:保底加载! return true; } public virtual bool NeedDownload(PackageBundle bundle) @@ -334,29 +351,52 @@ namespace YooAsset } #region 内部方法 + /// + /// 获取默认的缓存包裹根目录 + /// public string GetDefaultCachePackageRoot(string packageName) { string rootDirectory = YooAssetSettingsData.GetYooDefaultCacheRoot(); return PathUtility.Combine(rootDirectory, packageName); } + + /// + /// 获取缓存清单文件的根目录 + /// public string GetCacheManifestFilesRoot() { return _cacheManifestFilesRoot; } + + /// + /// 获取缓存包裹哈希文件路径 + /// public string GetCachePackageHashFilePath(string packageVersion) { string fileName = YooAssetSettingsData.GetPackageHashFileName(PackageName, packageVersion); return PathUtility.Combine(_cacheManifestFilesRoot, fileName); } + + /// + /// 获取缓存包裹清单文件路径 + /// public string GetCachePackageManifestFilePath(string packageVersion) { string fileName = YooAssetSettingsData.GetManifestBinaryFileName(PackageName, packageVersion); return PathUtility.Combine(_cacheManifestFilesRoot, fileName); } - public string GetSandboxAppFootPrintFilePath() + + /// + /// 获取沙盒应用程序水印文件路径 + /// + public string GetSandboxAppFootprintFilePath() { - return PathUtility.Combine(_cacheManifestFilesRoot, SandboxFileSystemDefine.AppFootPrintFileName); + return PathUtility.Combine(_cacheManifestFilesRoot, SandboxFileSystemConsts.AppFootprintFileName); } + + /// + /// 获取临时文件路径 + /// public string GetTempFilePath(PackageBundle bundle) { if (_tempFilePathMapping.TryGetValue(bundle.BundleGUID, out string filePath) == false) @@ -388,6 +428,17 @@ namespace YooAsset Directory.Delete(_cacheManifestFilesRoot, true); } } + + /// + /// 删除所有缓存的临时文件 + /// + public void DeleteAllTempFiles() + { + if (Directory.Exists(_tempFilesRoot)) + { + Directory.Delete(_tempFilesRoot, true); + } + } #endregion } } diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/SandboxFileSystemDefine.cs b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/SandboxFileSystemConsts.cs similarity index 74% rename from Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/SandboxFileSystemDefine.cs rename to Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/SandboxFileSystemConsts.cs index 5cd1a62d..5d17bd5a 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/SandboxFileSystemDefine.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/SandboxFileSystemConsts.cs @@ -1,12 +1,15 @@ - + namespace YooAsset { - internal class SandboxFileSystemDefine + /// + /// 沙盒文件系统常量定义 + /// + internal class SandboxFileSystemConsts { /// /// 记录应用程序版本的文件名称 /// - public const string AppFootPrintFileName = "ApplicationFootPrint.bytes"; + public const string AppFootprintFileName = "ApplicationFootprint.bytes"; /// /// 清单文件的文件夹名称 diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/SandboxFileSystemDefine.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/SandboxFileSystemConsts.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/SandboxFileSystemDefine.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/Services/SandboxFileSystem/SandboxFileSystemConsts.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSInitializeOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSInitializeOperation.cs index e2560494..2cf0ede2 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSInitializeOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSInitializeOperation.cs @@ -1,11 +1,16 @@ - + namespace YooAsset { + /// + /// Web远端文件系统的初始化操作 + /// internal class WRFSInitializeOperation : FSInitializeOperation { private enum ESteps { None, + CheckPlatform, + CheckParameter, InitializeFileCache, Done, } @@ -20,13 +25,37 @@ namespace YooAsset } internal override void InternalStart() { - _steps = ESteps.InitializeFileCache; + _steps = ESteps.CheckPlatform; } internal override void InternalUpdate() { if (_steps == ESteps.None || _steps == ESteps.Done) return; + if (_steps == ESteps.CheckPlatform) + { +#if !UNITY_WEBGL + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"{nameof(WebRemoteFileSystem)} only support the WebGL platform."; +#else + _steps = ESteps.CheckParameter; +#endif + } + + if (_steps == ESteps.CheckParameter) + { + if (_fileSystem.RemoteServices == null) + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"{nameof(IRemoteServices)} is null."; + return; + } + + _steps = ESteps.InitializeFileCache; + } + if (_steps == ESteps.InitializeFileCache) { if (_initializeFileCacheOp == null) diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSLoadBundleOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSLoadPackageBundleOperation.cs similarity index 71% rename from Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSLoadBundleOperation.cs rename to Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSLoadPackageBundleOperation.cs index 78e27fd4..dc17c99b 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSLoadBundleOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSLoadPackageBundleOperation.cs @@ -1,63 +1,64 @@ - + namespace YooAsset { - internal class WRFSLoadBundleOperation : FSLoadBundleOperation + /// + /// Web远端文件系统的加载资源包操作 + /// + internal class WRFSLoadPackageBundleOperation : FSLoadPackageBundleOperation { private enum ESteps { None, - LoadWebBundle, + LoadBundle, Done, } private readonly WebRemoteFileSystem _fileSystem; - private readonly FCLoadBundleOptions _options; + private readonly FSLoadPackageBundleOptions _options; private FCLoadBundleOperation _loadBundleOp; private ESteps _steps = ESteps.None; - internal WRFSLoadBundleOperation(WebRemoteFileSystem fileSystem, FCLoadBundleOptions options) + internal WRFSLoadPackageBundleOperation(WebRemoteFileSystem fileSystem, FSLoadPackageBundleOptions options) { _fileSystem = fileSystem; _options = options; } internal override void InternalStart() { - _steps = ESteps.LoadWebBundle; + _steps = ESteps.LoadBundle; } internal override void InternalUpdate() { if (_steps == ESteps.None || _steps == ESteps.Done) return; - if (_steps == ESteps.LoadWebBundle) + if (_steps == ESteps.LoadBundle) { if (_loadBundleOp == null) { - _loadBundleOp = _fileSystem.FileCache.LoadBundleAsync(_options); + _loadBundleOp = _fileSystem.FileCache.LoadBundleAsync(_options.ConvertTo()); _loadBundleOp.StartOperation(); AddChildOperation(_loadBundleOp); } _loadBundleOp.UpdateOperation(); Progress = _loadBundleOp.Progress; - DownloadProgress = Progress; - DownloadedBytes = 0; if (_loadBundleOp.IsDone == false) return; if (_loadBundleOp.Status == EOperationStatus.Succeeded) { - if (_loadBundleOp.BundleResult == null) + if (_loadBundleOp.BundleHandle == null) { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"Loaded bundle result is null."; + Error = $"Loaded bundle handle is null."; } else { _steps = ESteps.Done; Status = EOperationStatus.Succeeded; - Result = _loadBundleOp.BundleResult; + BundleHandle = _loadBundleOp.BundleHandle; } } else @@ -74,7 +75,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = "WebGL platform not support sync load method."; + Error = "WebGL platform does not support synchronous loading."; YooLogger.Error(Error); } } diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSLoadBundleOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSLoadPackageBundleOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSLoadBundleOperation.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSLoadPackageBundleOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSLoadManifestOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSLoadPackageManifestOperation.cs similarity index 90% rename from Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSLoadManifestOperation.cs rename to Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSLoadPackageManifestOperation.cs index a3e89942..53e29648 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSLoadManifestOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSLoadPackageManifestOperation.cs @@ -1,7 +1,10 @@ - + namespace YooAsset { - internal class WRFSLoadManifestOperation : FSLoadManifestOperation + /// + /// Web远端文件系统的加载包裹清单操作 + /// + internal class WRFSLoadPackageManifestOperation : FSLoadPackageManifestOperation { private enum ESteps { @@ -19,7 +22,7 @@ namespace YooAsset private ESteps _steps = ESteps.None; - public WRFSLoadManifestOperation(WebRemoteFileSystem fileSystem, string packageVersion, int timeout) + public WRFSLoadPackageManifestOperation(WebRemoteFileSystem fileSystem, string packageVersion, int timeout) { _fileSystem = fileSystem; _packageVersion = packageVersion; @@ -44,6 +47,7 @@ namespace YooAsset options.Timeout = _timeout; options.RemoteServices = _fileSystem.RemoteServices; options.DownloadBackend = _fileSystem.DownloadBackend; + options.URLPolicy = _fileSystem.DownloadURLPolicy; _requestWebPackageHashOp = new RequestWebPackageHashOperation(options); _requestWebPackageHashOp.StartOperation(); AddChildOperation(_requestWebPackageHashOp); @@ -77,6 +81,7 @@ namespace YooAsset options.RemoteServices = _fileSystem.RemoteServices; options.ManifestDecryptor = _fileSystem.ManifestDecryptor; options.DownloadBackend = _fileSystem.DownloadBackend; + options.URLPolicy = _fileSystem.DownloadURLPolicy; _loadWebPackageManifestOp = new LoadWebPackageManifestOperation(options); _loadWebPackageManifestOp.StartOperation(); AddChildOperation(_loadWebPackageManifestOp); diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSLoadManifestOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSLoadPackageManifestOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSLoadManifestOperation.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSLoadPackageManifestOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSRequestVersionOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSRequestPackageVersionOperation.cs similarity index 86% rename from Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSRequestVersionOperation.cs rename to Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSRequestPackageVersionOperation.cs index ffdaf3cd..1641174a 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSRequestVersionOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSRequestPackageVersionOperation.cs @@ -1,7 +1,10 @@ - + namespace YooAsset { - internal class WRFSRequestVersionOperation : FSRequestVersionOperation + /// + /// Web远端文件系统的查询包裹版本操作 + /// + internal class WRFSRequestPackageVersionOperation : FSRequestPackageVersionOperation { private enum ESteps { @@ -17,7 +20,7 @@ namespace YooAsset private ESteps _steps = ESteps.None; - internal WRFSRequestVersionOperation(WebRemoteFileSystem fileSystem, bool appendTimeTicks, int timeout) + internal WRFSRequestPackageVersionOperation(WebRemoteFileSystem fileSystem, bool appendTimeTicks, int timeout) { _fileSystem = fileSystem; _appendTimeTicks = appendTimeTicks; @@ -42,6 +45,7 @@ namespace YooAsset options.Timeout = _timeout; options.RemoteServices = _fileSystem.RemoteServices; options.DownloadBackend = _fileSystem.DownloadBackend; + options.URLPolicy = _fileSystem.DownloadURLPolicy; _requestWebPackageVersionOp = new RequestWebPackageVersionOperation(options); _requestWebPackageVersionOp.StartOperation(); AddChildOperation(_requestWebPackageVersionOp); diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSRequestVersionOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSRequestPackageVersionOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSRequestVersionOperation.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/Operations/WRFSRequestPackageVersionOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/WebRemoteFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/WebRemoteFileSystem.cs index c8bd7f88..146d4584 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/WebRemoteFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/WebRemoteFileSystem/WebRemoteFileSystem.cs @@ -1,5 +1,4 @@ using System; -using System.IO; using System.Collections.Generic; using UnityEngine; @@ -29,27 +28,27 @@ namespace YooAsset /// /// 自定义参数:UnityWebRequest 创建委托 /// - public UnityWebRequestCreator WebRequestCreator { private set; get; } + public UnityWebRequestCreator WebRequestCreator { get; private set; } /// - /// 禁用Unity的网络缓存 + /// 自定义参数:禁用Unity的网络缓存 /// - public bool DisableUnityWebCache { private set; get; } = false; + public bool DisableUnityWebCache { get; private set; } = false; /// /// 自定义参数:下载任务的看门狗机制超时时间 /// - public int DownloadWatchDogTimeout { private set; get; } = 0; + public int DownloadWatchdogTimeout { get; private set; } = 0; /// /// 自定义参数:下载的资源包数据的校验级别 /// - public EFileVerifyLevel DownloadVerifyLevel { private set; get; } = EFileVerifyLevel.Middle; + public EFileVerifyLevel DownloadVerifyLevel { get; private set; } = EFileVerifyLevel.Middle; /// /// 自定义参数:远程服务接口的实例类(支持跨域下载) /// - public IRemoteServices RemoteServices { private set; get; } + public IRemoteServices RemoteServices { get; private set; } /// /// 自定义参数:AssetBundle 解密器 @@ -59,7 +58,17 @@ namespace YooAsset /// /// 自定义参数:资源清单解密器 /// - public IManifestDecryptor ManifestDecryptor { private set; get; } + public IManifestDecryptor ManifestDecryptor { get; private set; } + + /// + /// 自定义参数:下载重试判定策略 + /// + public IDownloadRetryPolicy DownloadRetryPolicy { get; private set; } + + /// + /// 自定义参数:URL 选择策略 + /// + public IDownloadURLPolicy DownloadURLPolicy { get; private set; } #endregion @@ -71,69 +80,77 @@ namespace YooAsset var operation = new WRFSInitializeOperation(this); return operation; } - public virtual FSRequestVersionOperation RequestVersionAsync(RequestVersionOptions options) + public virtual FSRequestPackageVersionOperation RequestPackageVersionAsync(FSRequestPackageVersionOptions options) { - var operation = new WRFSRequestVersionOperation(this, options.AppendTimeTicks, options.Timeout); + var operation = new WRFSRequestPackageVersionOperation(this, options.AppendTimeTicks, options.Timeout); return operation; } - public virtual FSLoadManifestOperation LoadManifestAsync(LoadManifestOptions options) + public virtual FSLoadPackageManifestOperation LoadPackageManifestAsync(FSLoadPackageManifestOptions options) { - var operation = new WRFSLoadManifestOperation(this, options.PackageVersion, options.Timeout); + var operation = new WRFSLoadPackageManifestOperation(this, options.PackageVersion, options.Timeout); return operation; } - public virtual FSClearCacheOperation ClearCacheAsync(ClearCacheOptions options) + public virtual FSLoadPackageBundleOperation LoadPackageBundleAsync(FSLoadPackageBundleOptions options) { - var operation = new FSClearCacheCompleteOperation(); + var operation = new WRFSLoadPackageBundleOperation(this, options); return operation; } public virtual FSDownloadFileOperation DownloadFileAsync(FSDownloadFileOptions options) { throw new System.NotImplementedException(); } - public virtual FSLoadBundleOperation LoadBundleAsync(FCLoadBundleOptions options) + public virtual FSClearCacheOperation ClearCacheAsync(FSClearCacheOptions options) { - var operation = new WRFSLoadBundleOperation(this, options); + var operation = new FSClearCacheCompleteOperation(); return operation; } public virtual void SetParameter(string name, object value) { - if (name == FileSystemParametersDefine.DOWNLOAD_BACKEND) + if (name == FileSystemConsts.DOWNLOAD_BACKEND) { DownloadBackend = (IDownloadBackend)value; } - else if (name == FileSystemParametersDefine.UNITY_WEB_REQUEST_CREATOR) + else if (name == FileSystemConsts.UNITY_WEB_REQUEST_CREATOR) { WebRequestCreator = (UnityWebRequestCreator)value; } - else if (name == FileSystemParametersDefine.DISABLE_UNITY_WEB_CACHE) + else if (name == FileSystemConsts.DISABLE_UNITY_WEB_CACHE) { DisableUnityWebCache = Convert.ToBoolean(value); } - else if (name == FileSystemParametersDefine.DOWNLOAD_WATCH_DOG_TIME) + else if (name == FileSystemConsts.DOWNLOAD_WATCHDOG_TIMEOUT) { int convertValue = Convert.ToInt32(value); - DownloadWatchDogTimeout = Mathf.Clamp(convertValue, 0, int.MaxValue); + DownloadWatchdogTimeout = Mathf.Clamp(convertValue, 0, int.MaxValue); } - else if (name == FileSystemParametersDefine.FILE_VERIFY_LEVEL) + else if (name == FileSystemConsts.FILE_VERIFY_LEVEL) { DownloadVerifyLevel = (EFileVerifyLevel)value; } - else if (name == FileSystemParametersDefine.REMOTE_SERVICES) + else if (name == FileSystemConsts.REMOTE_SERVICES) { RemoteServices = (IRemoteServices)value; } - else if (name == FileSystemParametersDefine.ASSETBUNDLE_DECRYPTOR) + else if (name == FileSystemConsts.ASSETBUNDLE_DECRYPTOR) { AssetBundleDecryptor = (IBundleDecryptor)value; } - else if (name == FileSystemParametersDefine.MANIFEST_DECRYPTOR) + else if (name == FileSystemConsts.MANIFEST_DECRYPTOR) { ManifestDecryptor = (IManifestDecryptor)value; } + else if (name == FileSystemConsts.DOWNLOAD_RETRY_POLICY) + { + DownloadRetryPolicy = (IDownloadRetryPolicy)value; + } + else if (name == FileSystemConsts.DOWNLOAD_URL_POLICY) + { + DownloadURLPolicy = (IDownloadURLPolicy)value; + } else { - YooLogger.Warning($"Invalid parameter : {name}"); + YooLogger.Warning($"Invalid parameter: {name}"); } } public virtual void OnCreate(string packageName, string packageRoot) @@ -144,14 +161,24 @@ namespace YooAsset if (DownloadBackend == null) DownloadBackend = new UnityWebRequestBackend(WebRequestCreator); + // 创建默认的下载重试策略 + if (DownloadRetryPolicy == null) + DownloadRetryPolicy = new DefaultDownloadRetryPolicy(); + + // 创建默认的 URL 选择策略 + if (DownloadURLPolicy == null) + DownloadURLPolicy = new DefaultDownloadURLPolicy(); + // 创建Web文件缓存系统 var cacheConfig = new WebRemoteFileCache.CacheConfig(); - cacheConfig.WatchdogTimeout = DownloadWatchDogTimeout; + cacheConfig.WatchdogTimeout = DownloadWatchdogTimeout; cacheConfig.DisableUnityWebCache = DisableUnityWebCache; cacheConfig.DownloadVerifyLevel = DownloadVerifyLevel; cacheConfig.AssetBundleDecryptor = AssetBundleDecryptor; cacheConfig.RemoteServices = RemoteServices; cacheConfig.DownloadBackend = DownloadBackend; + cacheConfig.RetryPolicy = DownloadRetryPolicy; + cacheConfig.URLPolicy = DownloadURLPolicy; FileCache = new WebRemoteFileCache(packageName, packageRoot, cacheConfig); } public virtual void OnDestroy() @@ -171,7 +198,8 @@ namespace YooAsset public virtual bool Belong(PackageBundle bundle) { - return FileCache.IsCached(bundle.BundleGUID); + // 注意:保底加载! + return true; } public virtual bool NeedDownload(PackageBundle bundle) { diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSInitializeOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSInitializeOperation.cs index 5d1c5478..f0edebff 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSInitializeOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSInitializeOperation.cs @@ -1,11 +1,15 @@ - + namespace YooAsset { + /// + /// Web服务端文件系统的初始化操作 + /// internal class WSFSInitializeOperation : FSInitializeOperation { private enum ESteps { None, + CheckPlatform, InitializeFileCache, Done, } @@ -14,20 +18,30 @@ namespace YooAsset private FCInitializeOperation _initializeFileCacheOp; private ESteps _steps = ESteps.None; - public WSFSInitializeOperation(WebServerFileSystem fileSystem) { _fileSystem = fileSystem; } internal override void InternalStart() { - _steps = ESteps.InitializeFileCache; + _steps = ESteps.CheckPlatform; } internal override void InternalUpdate() { if (_steps == ESteps.None || _steps == ESteps.Done) return; + if (_steps == ESteps.CheckPlatform) + { +#if !UNITY_WEBGL + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"{nameof(WebServerFileSystem)} only support the WebGL platform."; +#else + _steps = ESteps.InitializeFileCache; +#endif + } + if (_steps == ESteps.InitializeFileCache) { if (_initializeFileCacheOp == null) diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSLoadBundleOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSLoadPackageBundleOperation.cs similarity index 71% rename from Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSLoadBundleOperation.cs rename to Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSLoadPackageBundleOperation.cs index 20fa9f82..b784590d 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSLoadBundleOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSLoadPackageBundleOperation.cs @@ -1,63 +1,64 @@ namespace YooAsset { - internal class WSFSLoadAssetBundleOperation : FSLoadBundleOperation + /// + /// Web服务端文件系统的加载资源包操作 + /// + internal class WSFSLoadPackageBundleOperation : FSLoadPackageBundleOperation { private enum ESteps { None, - LoadWebBundle, + LoadBundle, Done, } private readonly WebServerFileSystem _fileSystem; - private readonly FCLoadBundleOptions _options; + private readonly FSLoadPackageBundleOptions _options; private FCLoadBundleOperation _loadBundleOp; private ESteps _steps = ESteps.None; - internal WSFSLoadAssetBundleOperation(WebServerFileSystem fileSystem, FCLoadBundleOptions options) + internal WSFSLoadPackageBundleOperation(WebServerFileSystem fileSystem, FSLoadPackageBundleOptions options) { _fileSystem = fileSystem; _options = options; } internal override void InternalStart() { - _steps = ESteps.LoadWebBundle; + _steps = ESteps.LoadBundle; } internal override void InternalUpdate() { if (_steps == ESteps.None || _steps == ESteps.Done) return; - if (_steps == ESteps.LoadWebBundle) + if (_steps == ESteps.LoadBundle) { if (_loadBundleOp == null) { - _loadBundleOp = _fileSystem.FileCache.LoadBundleAsync(_options); + _loadBundleOp = _fileSystem.FileCache.LoadBundleAsync(_options.ConvertTo()); _loadBundleOp.StartOperation(); AddChildOperation(_loadBundleOp); } _loadBundleOp.UpdateOperation(); Progress = _loadBundleOp.Progress; - DownloadProgress = Progress; - DownloadedBytes = 0; if (_loadBundleOp.IsDone == false) return; if (_loadBundleOp.Status == EOperationStatus.Succeeded) { - if (_loadBundleOp.BundleResult == null) + if (_loadBundleOp.BundleHandle == null) { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"Loaded bundle result is null."; + Error = $"Loaded bundle handle is null."; } else { _steps = ESteps.Done; Status = EOperationStatus.Succeeded; - Result = _loadBundleOp.BundleResult; + BundleHandle = _loadBundleOp.BundleHandle; } } else @@ -74,7 +75,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = "WebGL platform not support sync load method."; + Error = "WebGL platform does not support synchronous loading."; YooLogger.Error(Error); } } diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSLoadBundleOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSLoadPackageBundleOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSLoadBundleOperation.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSLoadPackageBundleOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSLoadManifestOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSLoadPackageManifestOperation.cs similarity index 91% rename from Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSLoadManifestOperation.cs rename to Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSLoadPackageManifestOperation.cs index 2644179c..8d7061e2 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSLoadManifestOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSLoadPackageManifestOperation.cs @@ -1,7 +1,10 @@ - + namespace YooAsset { - internal class WSFSLoadManifestOperation : FSLoadManifestOperation + /// + /// Web服务端文件系统的加载包裹清单操作 + /// + internal class WSFSLoadPackageManifestOperation : FSLoadPackageManifestOperation { private enum ESteps { @@ -19,7 +22,7 @@ namespace YooAsset private ESteps _steps = ESteps.None; - public WSFSLoadManifestOperation(WebServerFileSystem fileSystem, string packageVersion, int timeout) + public WSFSLoadPackageManifestOperation(WebServerFileSystem fileSystem, string packageVersion, int timeout) { _fileSystem = fileSystem; _packageVersion = packageVersion; diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSLoadManifestOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSLoadPackageManifestOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSLoadManifestOperation.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSLoadPackageManifestOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSRequestVersionOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSRequestPackageVersionOperation.cs similarity index 87% rename from Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSRequestVersionOperation.cs rename to Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSRequestPackageVersionOperation.cs index a54d3b1c..a7c55f27 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSRequestVersionOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSRequestPackageVersionOperation.cs @@ -1,7 +1,10 @@ - + namespace YooAsset { - internal class WSFSRequestVersionOperation : FSRequestVersionOperation + /// + /// Web服务端文件系统的查询包裹版本操作 + /// + internal class WSFSRequestPackageVersionOperation : FSRequestPackageVersionOperation { private enum ESteps { @@ -16,7 +19,7 @@ namespace YooAsset private ESteps _steps = ESteps.None; - internal WSFSRequestVersionOperation(WebServerFileSystem fileSystem, int timeout) + internal WSFSRequestPackageVersionOperation(WebServerFileSystem fileSystem, int timeout) { _fileSystem = fileSystem; _timeout = timeout; diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSRequestVersionOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSRequestPackageVersionOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSRequestVersionOperation.cs.meta rename to Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/WSFSRequestPackageVersionOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/internal/LoadWebServerPackageManifestOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/internal/LoadWebServerPackageManifestOperation.cs index f4d22975..951d9661 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/internal/LoadWebServerPackageManifestOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/internal/LoadWebServerPackageManifestOperation.cs @@ -1,6 +1,9 @@ namespace YooAsset { + /// + /// 加载Web服务端包裹清单文件操作 + /// internal class LoadWebServerPackageManifestOperation : AsyncOperationBase { private enum ESteps @@ -16,14 +19,14 @@ namespace YooAsset private readonly string _packageVersion; private readonly string _packageHash; private readonly int _timeout; - private IDownloadBytesRequest _webDataRequestOp; - private DeserializeManifestOperation _deserializer; + private IDownloadBytesRequest _downloadBytesRequest; + private DeserializeManifestOperation _deserializeManifestOp; private ESteps _steps = ESteps.None; /// /// 包裹清单 /// - public PackageManifest Manifest { private set; get; } + public PackageManifest Manifest { get; private set; } internal LoadWebServerPackageManifestOperation(WebServerFileSystem fileSystem, string packageVersion, string packageHash, int timeout) @@ -44,19 +47,19 @@ namespace YooAsset if (_steps == ESteps.RequestFileData) { - if (_webDataRequestOp == null) + if (_downloadBytesRequest == null) { string filePath = _fileSystem.GetWebPackageManifestFilePath(_packageVersion); string url = DownloadSystemTools.ToLocalUrl(filePath); var args = new DownloadDataRequestArgs(url, _timeout, 0); - _webDataRequestOp = _fileSystem.DownloadBackend.CreateBytesRequest(args); - _webDataRequestOp.SendRequest(); + _downloadBytesRequest = _fileSystem.DownloadBackend.CreateBytesRequest(args); + _downloadBytesRequest.SendRequest(); } - if (_webDataRequestOp.IsDone == false) + if (_downloadBytesRequest.IsDone == false) return; - if (_webDataRequestOp.Status == EDownloadRequestStatus.Succeeded) + if (_downloadBytesRequest.Status == EDownloadRequestStatus.Succeeded) { _steps = ESteps.VerifyFileData; } @@ -64,13 +67,13 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _webDataRequestOp.Error; + Error = _downloadBytesRequest.Error; } } if (_steps == ESteps.VerifyFileData) { - if (PackageManifestTools.VerifyManifestData(_webDataRequestOp.Result, _packageHash)) + if (PackageManifestTools.VerifyManifestData(_downloadBytesRequest.Result, _packageHash)) { _steps = ESteps.LoadManifest; } @@ -84,43 +87,43 @@ namespace YooAsset if (_steps == ESteps.LoadManifest) { - if (_deserializer == null) + if (_deserializeManifestOp == null) { - _deserializer = new DeserializeManifestOperation(_fileSystem.ManifestDecryptor, _webDataRequestOp.Result); - _deserializer.StartOperation(); - AddChildOperation(_deserializer); + _deserializeManifestOp = new DeserializeManifestOperation(_fileSystem.ManifestDecryptor, _downloadBytesRequest.Result); + _deserializeManifestOp.StartOperation(); + AddChildOperation(_deserializeManifestOp); } - _deserializer.UpdateOperation(); - Progress = _deserializer.Progress; - if (_deserializer.IsDone == false) + _deserializeManifestOp.UpdateOperation(); + Progress = _deserializeManifestOp.Progress; + if (_deserializeManifestOp.IsDone == false) return; - if (_deserializer.Status == EOperationStatus.Succeeded) + if (_deserializeManifestOp.Status == EOperationStatus.Succeeded) { _steps = ESteps.Done; - Manifest = _deserializer.Manifest; + Manifest = _deserializeManifestOp.Manifest; Status = EOperationStatus.Succeeded; } else { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _deserializer.Error; + Error = _deserializeManifestOp.Error; } } } internal override void InternalDispose() { - if (_webDataRequestOp != null) + if (_downloadBytesRequest != null) { - _webDataRequestOp.Dispose(); - _webDataRequestOp = null; + _downloadBytesRequest.Dispose(); + _downloadBytesRequest = null; } } internal override string InternalGetDescription() { - return $"PackageVersion : {_packageVersion} PackageHash : {_packageHash}"; + return $"PackageVersion: {_packageVersion} PackageHash: {_packageHash}"; } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/internal/RequestWebServerPackageHashOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/internal/RequestWebServerPackageHashOperation.cs index eb243ffc..837df98a 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/internal/RequestWebServerPackageHashOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/internal/RequestWebServerPackageHashOperation.cs @@ -1,6 +1,9 @@ namespace YooAsset { + /// + /// 请求Web服务端包裹哈希操作 + /// internal class RequestWebServerPackageHashOperation : AsyncOperationBase { private enum ESteps @@ -13,13 +16,13 @@ namespace YooAsset private readonly WebServerFileSystem _fileSystem; private readonly string _packageVersion; private readonly int _timeout; - private IDownloadTextRequest _webTextRequestOp; + private IDownloadTextRequest _downloadTextRequest; private ESteps _steps = ESteps.None; /// /// 包裹哈希值 /// - public string PackageHash { private set; get; } + public string PackageHash { get; private set; } public RequestWebServerPackageHashOperation(WebServerFileSystem fileSystem, string packageVersion, int timeout) @@ -39,27 +42,27 @@ namespace YooAsset if (_steps == ESteps.RequestPackageHash) { - if (_webTextRequestOp == null) + if (_downloadTextRequest == null) { string filePath = _fileSystem.GetWebPackageHashFilePath(_packageVersion); string url = DownloadSystemTools.ToLocalUrl(filePath); var args = new DownloadDataRequestArgs(url, _timeout, 0); - _webTextRequestOp = _fileSystem.DownloadBackend.CreateTextRequest(args); - _webTextRequestOp.SendRequest(); + _downloadTextRequest = _fileSystem.DownloadBackend.CreateTextRequest(args); + _downloadTextRequest.SendRequest(); } - Progress = _webTextRequestOp.DownloadProgress; - if (_webTextRequestOp.IsDone == false) + Progress = _downloadTextRequest.DownloadProgress; + if (_downloadTextRequest.IsDone == false) return; - if (_webTextRequestOp.Status == EDownloadRequestStatus.Succeeded) + if (_downloadTextRequest.Status == EDownloadRequestStatus.Succeeded) { - PackageHash = _webTextRequestOp.Result; - if (string.IsNullOrEmpty(PackageHash)) + PackageHash = _downloadTextRequest.Result; + if (TextUtility.ValidateContent(PackageHash, out string validateError) == false) { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"Web server package hash file content is empty."; + Error = $"Web server package hash file validate failed: {validateError}"; } else { @@ -71,16 +74,16 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _webTextRequestOp.Error; + Error = _downloadTextRequest.Error; } } } internal override void InternalDispose() { - if (_webTextRequestOp != null) + if (_downloadTextRequest != null) { - _webTextRequestOp.Dispose(); - _webTextRequestOp = null; + _downloadTextRequest.Dispose(); + _downloadTextRequest = null; } } } diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/internal/RequestWebServerPackageVersionOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/internal/RequestWebServerPackageVersionOperation.cs index fa455535..a5212ae0 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/internal/RequestWebServerPackageVersionOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/Operations/internal/RequestWebServerPackageVersionOperation.cs @@ -1,6 +1,9 @@ namespace YooAsset { + /// + /// 请求Web服务端包裹版本操作 + /// internal class RequestWebServerPackageVersionOperation : AsyncOperationBase { private enum ESteps @@ -12,13 +15,13 @@ namespace YooAsset private readonly WebServerFileSystem _fileSystem; private readonly int _timeout; - private IDownloadTextRequest _webTextRequestOp; + private IDownloadTextRequest _downloadTextRequest; private ESteps _steps = ESteps.None; /// /// 包裹版本 /// - public string PackageVersion { private set; get; } + public string PackageVersion { get; private set; } internal RequestWebServerPackageVersionOperation(WebServerFileSystem fileSystem, int timeout) @@ -37,26 +40,26 @@ namespace YooAsset if (_steps == ESteps.RequestPackageVersion) { - if (_webTextRequestOp == null) + if (_downloadTextRequest == null) { string filePath = _fileSystem.GetWebPackageVersionFilePath(); string url = DownloadSystemTools.ToLocalUrl(filePath); var args = new DownloadDataRequestArgs(url, _timeout, 0); - _webTextRequestOp = _fileSystem.DownloadBackend.CreateTextRequest(args); - _webTextRequestOp.SendRequest(); + _downloadTextRequest = _fileSystem.DownloadBackend.CreateTextRequest(args); + _downloadTextRequest.SendRequest(); } - if (_webTextRequestOp.IsDone == false) + if (_downloadTextRequest.IsDone == false) return; - if (_webTextRequestOp.Status == EDownloadRequestStatus.Succeeded) + if (_downloadTextRequest.Status == EDownloadRequestStatus.Succeeded) { - PackageVersion = _webTextRequestOp.Result; - if (string.IsNullOrEmpty(PackageVersion)) + PackageVersion = _downloadTextRequest.Result; + if (TextUtility.ValidateContent(PackageVersion, out string validateError) == false) { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"Web server package version file content is empty."; + Error = $"Web server package version file validate failed: {validateError}"; } else { @@ -68,16 +71,16 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _webTextRequestOp.Error; + Error = _downloadTextRequest.Error; } } } internal override void InternalDispose() { - if (_webTextRequestOp != null) + if (_downloadTextRequest != null) { - _webTextRequestOp.Dispose(); - _webTextRequestOp = null; + _downloadTextRequest.Dispose(); + _downloadTextRequest = null; } } } diff --git a/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/WebServerFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/WebServerFileSystem.cs index 39eaf4ca..4925d5aa 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/WebServerFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Services/WebServerFileSystem/WebServerFileSystem.cs @@ -32,22 +32,22 @@ namespace YooAsset /// /// 自定义参数:UnityWebRequest 创建委托 /// - public UnityWebRequestCreator WebRequestCreator { private set; get; } + public UnityWebRequestCreator WebRequestCreator { get; private set; } /// - /// 禁用Unity的网络缓存 + /// 自定义参数:禁用Unity的网络缓存 /// - public bool DisableUnityWebCache { private set; get; } = false; + public bool DisableUnityWebCache { get; private set; } = false; /// /// 自定义参数:下载任务的看门狗机制超时时间 /// - public int DownloadWatchDogTimeout { private set; get; } = 0; + public int DownloadWatchdogTimeout { get; private set; } = 0; /// /// 自定义参数:下载的资源包数据的校验级别 /// - public EFileVerifyLevel DownloadVerifyLevel { private set; get; } = EFileVerifyLevel.Middle; + public EFileVerifyLevel DownloadVerifyLevel { get; private set; } = EFileVerifyLevel.Middle; /// /// 自定义参数:AssetBundle 解密器 @@ -57,7 +57,17 @@ namespace YooAsset /// /// 自定义参数:资源清单解密器 /// - public IManifestDecryptor ManifestDecryptor { private set; get; } + public IManifestDecryptor ManifestDecryptor { get; private set; } + + /// + /// 自定义参数:下载重试判定策略 + /// + public IDownloadRetryPolicy DownloadRetryPolicy { get; private set; } + + /// + /// 自定义参数:URL 选择策略 + /// + public IDownloadURLPolicy DownloadURLPolicy { get; private set; } #endregion @@ -69,65 +79,73 @@ namespace YooAsset var operation = new WSFSInitializeOperation(this); return operation; } - public virtual FSRequestVersionOperation RequestVersionAsync(RequestVersionOptions options) + public virtual FSRequestPackageVersionOperation RequestPackageVersionAsync(FSRequestPackageVersionOptions options) { - var operation = new WSFSRequestVersionOperation(this, options.Timeout); + var operation = new WSFSRequestPackageVersionOperation(this, options.Timeout); return operation; } - public virtual FSLoadManifestOperation LoadManifestAsync(LoadManifestOptions options) + public virtual FSLoadPackageManifestOperation LoadPackageManifestAsync(FSLoadPackageManifestOptions options) { - var operation = new WSFSLoadManifestOperation(this, options.PackageVersion, options.Timeout); + var operation = new WSFSLoadPackageManifestOperation(this, options.PackageVersion, options.Timeout); return operation; } - public virtual FSClearCacheOperation ClearCacheAsync(ClearCacheOptions options) + public virtual FSLoadPackageBundleOperation LoadPackageBundleAsync(FSLoadPackageBundleOptions options) { - var operation = new FSClearCacheCompleteOperation(); + var operation = new WSFSLoadPackageBundleOperation(this, options); return operation; } public virtual FSDownloadFileOperation DownloadFileAsync(FSDownloadFileOptions options) { throw new System.NotImplementedException(); } - public virtual FSLoadBundleOperation LoadBundleAsync(FCLoadBundleOptions options) + public virtual FSClearCacheOperation ClearCacheAsync(FSClearCacheOptions options) { - var operation = new WSFSLoadAssetBundleOperation(this, options); + var operation = new FSClearCacheCompleteOperation(); return operation; } public virtual void SetParameter(string name, object value) { - if (name == FileSystemParametersDefine.DOWNLOAD_BACKEND) + if (name == FileSystemConsts.DOWNLOAD_BACKEND) { DownloadBackend = (IDownloadBackend)value; } - else if (name == FileSystemParametersDefine.UNITY_WEB_REQUEST_CREATOR) + else if (name == FileSystemConsts.UNITY_WEB_REQUEST_CREATOR) { WebRequestCreator = (UnityWebRequestCreator)value; } - else if (name == FileSystemParametersDefine.DISABLE_UNITY_WEB_CACHE) + else if (name == FileSystemConsts.DISABLE_UNITY_WEB_CACHE) { DisableUnityWebCache = Convert.ToBoolean(value); } - else if (name == FileSystemParametersDefine.DOWNLOAD_WATCH_DOG_TIME) + else if (name == FileSystemConsts.DOWNLOAD_WATCHDOG_TIMEOUT) { int convertValue = Convert.ToInt32(value); - DownloadWatchDogTimeout = Mathf.Clamp(convertValue, 0, int.MaxValue); + DownloadWatchdogTimeout = Mathf.Clamp(convertValue, 0, int.MaxValue); } - else if (name == FileSystemParametersDefine.FILE_VERIFY_LEVEL) + else if (name == FileSystemConsts.FILE_VERIFY_LEVEL) { DownloadVerifyLevel = (EFileVerifyLevel)value; } - else if (name == FileSystemParametersDefine.ASSETBUNDLE_DECRYPTOR) + else if (name == FileSystemConsts.ASSETBUNDLE_DECRYPTOR) { AssetBundleDecryptor = (IBundleDecryptor)value; } - else if (name == FileSystemParametersDefine.MANIFEST_DECRYPTOR) + else if (name == FileSystemConsts.MANIFEST_DECRYPTOR) { ManifestDecryptor = (IManifestDecryptor)value; } + else if (name == FileSystemConsts.DOWNLOAD_RETRY_POLICY) + { + DownloadRetryPolicy = (IDownloadRetryPolicy)value; + } + else if (name == FileSystemConsts.DOWNLOAD_URL_POLICY) + { + DownloadURLPolicy = (IDownloadURLPolicy)value; + } else { - YooLogger.Warning($"Invalid parameter : {name}"); + YooLogger.Warning($"Invalid parameter: {name}"); } } public virtual void OnCreate(string packageName, string packageRoot) @@ -143,13 +161,23 @@ namespace YooAsset if (DownloadBackend == null) DownloadBackend = new UnityWebRequestBackend(WebRequestCreator); + // 创建默认的下载重试策略 + if (DownloadRetryPolicy == null) + DownloadRetryPolicy = new DefaultDownloadRetryPolicy(); + + // 创建默认的 URL 选择策略 + if (DownloadURLPolicy == null) + DownloadURLPolicy = new DefaultDownloadURLPolicy(); + // 创建Web文件缓存系统 var cacheConfig = new WebServerFileCache.CacheConfig(); - cacheConfig.WatchdogTimeout = DownloadWatchDogTimeout; + cacheConfig.WatchdogTimeout = DownloadWatchdogTimeout; cacheConfig.DisableUnityWebCache = DisableUnityWebCache; cacheConfig.DownloadVerifyLevel = DownloadVerifyLevel; cacheConfig.AssetBundleDecryptor = AssetBundleDecryptor; cacheConfig.DownloadBackend = DownloadBackend; + cacheConfig.RetryPolicy = DownloadRetryPolicy; + cacheConfig.URLPolicy = DownloadURLPolicy; FileCache = new WebServerFileCache(packageName, _packageRoot, cacheConfig); } public virtual void OnDestroy() @@ -187,19 +215,30 @@ namespace YooAsset #region 内部方法 protected string GetDefaultWebPackageRoot(string packageName) { - string rootDirectory = YooAssetSettingsData.GetYooDefaultBuildinRoot(); + string rootDirectory = YooAssetSettingsData.GetYooDefaultBuiltinRoot(); return PathUtility.Combine(rootDirectory, packageName); } + /// + /// 获取Web包裹版本文件路径 + /// public string GetWebPackageVersionFilePath() { string fileName = YooAssetSettingsData.GetPackageVersionFileName(PackageName); return PathUtility.Combine(_packageRoot, fileName); } + + /// + /// 获取Web包裹哈希文件路径 + /// public string GetWebPackageHashFilePath(string packageVersion) { string fileName = YooAssetSettingsData.GetPackageHashFileName(PackageName, packageVersion); return PathUtility.Combine(_packageRoot, fileName); } + + /// + /// 获取Web包裹清单文件路径 + /// public string GetWebPackageManifestFilePath(string packageVersion) { string fileName = YooAssetSettingsData.GetManifestBinaryFileName(PackageName, packageVersion); diff --git a/Assets/YooAsset/Runtime/Interfaces/IDownloadRetryPolicy.cs b/Assets/YooAsset/Runtime/Interfaces/IDownloadRetryPolicy.cs new file mode 100644 index 00000000..f9f29f7b --- /dev/null +++ b/Assets/YooAsset/Runtime/Interfaces/IDownloadRetryPolicy.cs @@ -0,0 +1,26 @@ + +namespace YooAsset +{ + /// + /// 下载重试策略接口 + /// + public interface IDownloadRetryPolicy + { + /// + /// 判断本次下载失败是否属于可重试的错误 + /// + /// 请求地址 + /// HTTP 状态码(0 表示网络中断或非 HTTP 错误) + /// HTTP 错误信息 + /// true 允许重试;false 应立即失败 + bool IsRetryableError(string url, long httpCode, string httpError); + + /// + /// 计算本次重试应等待的时长(秒) + /// + /// 即将进入的重试次数(从 1 开始) + /// 上一次等待时长(首次时为 0) + /// 本次应等待的秒数 + float ComputeDelay(int retryCount, float previousDelay); + } +} diff --git a/Assets/YooAsset/Runtime/Interfaces/IDownloadRetryPolicy.cs.meta b/Assets/YooAsset/Runtime/Interfaces/IDownloadRetryPolicy.cs.meta new file mode 100644 index 00000000..16b2f726 --- /dev/null +++ b/Assets/YooAsset/Runtime/Interfaces/IDownloadRetryPolicy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f1438212bbb75f643b5cc861e8afa261 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/Interfaces/IDownloadURLPolicy.cs b/Assets/YooAsset/Runtime/Interfaces/IDownloadURLPolicy.cs new file mode 100644 index 00000000..16562fcc --- /dev/null +++ b/Assets/YooAsset/Runtime/Interfaces/IDownloadURLPolicy.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; + +namespace YooAsset +{ + /// + /// URL 选择策略接口 + /// + public interface IDownloadURLPolicy + { + /// + /// 基于内部状态从候选列表中选择本次请求应使用的 URL。 + /// + /// 候选 URL 列表(至少包含一个) + /// 选中的 URL + string SelectURL(IReadOnlyList candidateURLs); + + /// + /// 反馈请求成功,策略可据此更新内部状态。 + /// + /// 实际使用的 URL + void OnSuccess(string url); + + /// + /// 反馈请求失败,策略可据此更新内部状态。 + /// + /// 实际使用的 URL + /// HTTP 状态码(0 表示网络中断或非 HTTP 错误) + /// HTTP 错误信息 + void OnFailure(string url, long httpCode, string httpError); + } +} diff --git a/Assets/YooAsset/Runtime/Interfaces/IDownloadURLPolicy.cs.meta b/Assets/YooAsset/Runtime/Interfaces/IDownloadURLPolicy.cs.meta new file mode 100644 index 00000000..b1d520f0 --- /dev/null +++ b/Assets/YooAsset/Runtime/Interfaces/IDownloadURLPolicy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b06df95490feec942b6aadbfdc5bc36c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/Interfaces/IRemoteServices.cs b/Assets/YooAsset/Runtime/Interfaces/IRemoteServices.cs index 041b206f..695781f7 100644 --- a/Assets/YooAsset/Runtime/Interfaces/IRemoteServices.cs +++ b/Assets/YooAsset/Runtime/Interfaces/IRemoteServices.cs @@ -1,18 +1,14 @@ - +using System.Collections.Generic; + namespace YooAsset { public interface IRemoteServices { /// - /// 获取主资源站的资源地址 + /// 获取指定文件的所有远端候选地址,按优先级排序。 + /// 列表至少包含一个 URL。 /// /// 请求的文件名称 - string GetRemoteMainURL(string fileName); - - /// - /// 获取备用资源站的资源地址 - /// - /// 请求的文件名称 - string GetRemoteFallbackURL(string fileName); + IReadOnlyList GetRemoteURLs(string fileName); } -} \ No newline at end of file +} diff --git a/Assets/YooAsset/Runtime/ResourceManager/DownloadStatus.cs b/Assets/YooAsset/Runtime/ResourceManager/DownloadStatus.cs deleted file mode 100644 index 9aa2f3bd..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/DownloadStatus.cs +++ /dev/null @@ -1,38 +0,0 @@ - -namespace YooAsset -{ - /// - /// 下载状态信息结构体 - /// - public struct DownloadStatus - { - /// - /// 下载是否已经完成 - /// - public bool IsDone { get; set; } - - /// - /// 下载进度(0-1f) - /// - public float Progress { get; set; } - - /// - /// 下载文件的总大小 - /// - public long TotalBytes { get; set; } - - /// - /// 已经下载的文件大小 - /// - public long DownloadedBytes { get; set; } - - /// - /// 创建默认的下载状态实例 - /// - public static DownloadStatus CreateDefault() - { - DownloadStatus status = new DownloadStatus(); - return status; - } - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Handles/HandleBase.cs b/Assets/YooAsset/Runtime/ResourceManager/Handles/HandleBase.cs index 2a7aa8c8..87ac7f2f 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Handles/HandleBase.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Handles/HandleBase.cs @@ -54,16 +54,6 @@ namespace YooAsset return _assetInfo; } - /// - /// 获取下载报告 - /// - public DownloadStatus GetDownloadStatus() - { - if (IsValidWithWarning == false) - return DownloadStatus.CreateDefault(); - return Provider.GetDownloadStatus(); - } - /// /// 当前状态 /// diff --git a/Assets/YooAsset/Runtime/ResourceManager/Handles/RawFileHandle.cs b/Assets/YooAsset/Runtime/ResourceManager/Handles/RawFileHandle.cs index e3efd5a5..19f67f4e 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Handles/RawFileHandle.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Handles/RawFileHandle.cs @@ -55,7 +55,7 @@ namespace YooAsset { if (IsValidWithWarning == false) return string.Empty; - return Provider.LoadedBundleResult.GetBundleFilePath(); + return Provider.LoadedBundleHandle.GetBundleFilePath(); } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Operations/InstantiateOperation.cs b/Assets/YooAsset/Runtime/ResourceManager/Operations/InstantiateOperation.cs index 16a3dbb1..3139bca6 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Operations/InstantiateOperation.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Operations/InstantiateOperation.cs @@ -138,7 +138,7 @@ namespace YooAsset internal override string InternalGetDescription() { var assetInfo = _handle.GetAssetInfo(); - return $"AssetPath : {assetInfo.AssetPath}"; + return $"AssetPath: {assetInfo.AssetPath}"; } /// diff --git a/Assets/YooAsset/Runtime/ResourceManager/Operations/Internal/LoadBundleOperation.cs b/Assets/YooAsset/Runtime/ResourceManager/Operations/Internal/LoadBundleOperation.cs index b790ec60..199d938b 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Operations/Internal/LoadBundleOperation.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Operations/Internal/LoadBundleOperation.cs @@ -20,7 +20,7 @@ namespace YooAsset private readonly ResourceManager _resourceManager; private readonly List _providers = new List(100); private readonly List _removeList = new List(100); - private FSLoadBundleOperation _loadBundleOp; + private FSLoadPackageBundleOperation _loadPackageBundleOp; private ESteps _steps = ESteps.None; /// @@ -39,20 +39,9 @@ namespace YooAsset public int RefCount { private set; get; } = 0; /// - /// 下载进度 + /// 资源包句柄 /// - public float DownloadProgress { set; get; } = 0; - - /// - /// 下载大小 - /// - public long DownloadedBytes { set; get; } = 0; - - /// - /// 加载结果 - /// - public IBundleResult Result { set; get; } - + public IBundleHandle BundleHandle { set; get; } internal LoadBundleOperation(ResourceManager resourceManager, BundleInfo bundleInfo) { @@ -84,36 +73,34 @@ namespace YooAsset if (_steps == ESteps.LoadBundleFile) { - if (_loadBundleOp == null) + if (_loadPackageBundleOp == null) { // 统计计数增加 _resourceManager.IncrementBundleLoadingCounter(); - _loadBundleOp = LoadBundleInfo.CreateBundleLoader(); - _loadBundleOp.StartOperation(); - AddChildOperation(_loadBundleOp); + _loadPackageBundleOp = LoadBundleInfo.CreateBundleLoader(); + _loadPackageBundleOp.StartOperation(); + AddChildOperation(_loadPackageBundleOp); } if (IsWaitForCompletion) - _loadBundleOp.WaitForCompletion(); + _loadPackageBundleOp.WaitForCompletion(); - _loadBundleOp.UpdateOperation(); - DownloadProgress = _loadBundleOp.DownloadProgress; - DownloadedBytes = _loadBundleOp.DownloadedBytes; - if (_loadBundleOp.IsDone == false) + _loadPackageBundleOp.UpdateOperation(); + if (_loadPackageBundleOp.IsDone == false) return; - if (_loadBundleOp.Status == EOperationStatus.Succeeded) + if (_loadPackageBundleOp.Status == EOperationStatus.Succeeded) { - if (_loadBundleOp.Result == null) + if (_loadPackageBundleOp.BundleHandle == null) { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"The bundle loader result is null. Bundle: {LoadBundleInfo.Bundle.BundleName}"; + Error = $"The bundle handle is null. Bundle: {LoadBundleInfo.Bundle.BundleName}"; } else { _steps = ESteps.Done; - Result = _loadBundleOp.Result; + BundleHandle = _loadPackageBundleOp.BundleHandle; Status = EOperationStatus.Succeeded; } } @@ -121,7 +108,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _loadBundleOp.Error; + Error = _loadPackageBundleOp.Error; } // 统计计数减少 @@ -134,7 +121,7 @@ namespace YooAsset } internal override string InternalGetDescription() { - return $"BundleName : {LoadBundleInfo.Bundle.BundleName}"; + return $"BundleName: {LoadBundleInfo.Bundle.BundleName}"; } /// @@ -167,8 +154,8 @@ namespace YooAsset if (RefCount > 0) throw new YooInternalException($"Cannot destroy loader with non-zero ref count {RefCount}: {LoadBundleInfo.Bundle.BundleName}"); - if (Result != null) - Result.UnloadBundleFile(); + if (BundleHandle != null) + BundleHandle.UnloadBundleFile(); if (IsDone == false) { @@ -277,8 +264,8 @@ namespace YooAsset if (_steps == ESteps.LoadBundleFile) { // 注意:终止下载器 - if (_loadBundleOp != null) - _loadBundleOp.AbortDownloadFile = true; + if (_loadPackageBundleOp != null) + _loadPackageBundleOp.AbortDownloadFile = true; } } } diff --git a/Assets/YooAsset/Runtime/ResourceManager/Operations/UnloadSceneOperation.cs b/Assets/YooAsset/Runtime/ResourceManager/Operations/UnloadSceneOperation.cs index 0ff43639..1006ccec 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Operations/UnloadSceneOperation.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Operations/UnloadSceneOperation.cs @@ -1,4 +1,4 @@ -using UnityEngine; +using UnityEngine; using UnityEngine.SceneManagement; namespace YooAsset @@ -112,7 +112,7 @@ namespace YooAsset } internal override string InternalGetDescription() { - return $"SceneName : {_provider.LoadedSceneName}"; + return $"SceneName: {_provider.LoadedSceneName}"; } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Operations/UnloadUnusedAssetsOperation.cs b/Assets/YooAsset/Runtime/ResourceManager/Operations/UnloadUnusedAssetsOperation.cs index 8dbbd66c..cdb42dc5 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Operations/UnloadUnusedAssetsOperation.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Operations/UnloadUnusedAssetsOperation.cs @@ -59,7 +59,7 @@ namespace YooAsset } internal override string InternalGetDescription() { - return $"LoopCount : {_options.LoopCount}"; + return $"LoopCount: {_options.LoopCount}"; } /// diff --git a/Assets/YooAsset/Runtime/ResourceManager/Providers/AllAssetsProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Providers/AllAssetsProvider.cs index 081c77e1..195b60ff 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Providers/AllAssetsProvider.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Providers/AllAssetsProvider.cs @@ -6,16 +6,16 @@ namespace YooAsset /// internal sealed class AllAssetsProvider : ProviderBase { - private FSLoadAllAssetsOperation _loadAllAssetsOp; + private BHLoadAllAssetsOperation _loadAllAssetsOp; public AllAssetsProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo) : base(manager, providerGUID, assetInfo) { } - protected override void ProcessBundleResult() + protected override void ProcessBundleHandle() { if (_loadAllAssetsOp == null) { - _loadAllAssetsOp = LoadedBundleResult.LoadAllAssetsAsync(MainAssetInfo); + _loadAllAssetsOp = LoadedBundleHandle.LoadAllAssetsAsync(MainAssetInfo); _loadAllAssetsOp.StartOperation(); AddChildOperation(_loadAllAssetsOp); diff --git a/Assets/YooAsset/Runtime/ResourceManager/Providers/AssetProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Providers/AssetProvider.cs index 2f129be3..15e72fbd 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Providers/AssetProvider.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Providers/AssetProvider.cs @@ -6,16 +6,16 @@ namespace YooAsset /// internal sealed class AssetProvider : ProviderBase { - private FSLoadAssetOperation _loadAssetOp; + private BHLoadAssetOperation _loadAssetOp; public AssetProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo) : base(manager, providerGUID, assetInfo) { } - protected override void ProcessBundleResult() + protected override void ProcessBundleHandle() { if (_loadAssetOp == null) { - _loadAssetOp = LoadedBundleResult.LoadAssetAsync(MainAssetInfo); + _loadAssetOp = LoadedBundleHandle.LoadAssetAsync(MainAssetInfo); _loadAssetOp.StartOperation(); AddChildOperation(_loadAssetOp); diff --git a/Assets/YooAsset/Runtime/ResourceManager/Providers/ErrorProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Providers/ErrorProvider.cs index 5a350d18..cbcde52a 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Providers/ErrorProvider.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Providers/ErrorProvider.cs @@ -16,9 +16,9 @@ namespace YooAsset } /// - /// 处理资源包加载结果(空实现) + /// 处理资源包句柄(空实现) /// - protected override void ProcessBundleResult() + protected override void ProcessBundleHandle() { } diff --git a/Assets/YooAsset/Runtime/ResourceManager/Providers/ProviderBase.cs b/Assets/YooAsset/Runtime/ResourceManager/Providers/ProviderBase.cs index 1dede9e1..eb333e77 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Providers/ProviderBase.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Providers/ProviderBase.cs @@ -16,7 +16,7 @@ namespace YooAsset None = 0, StartBundleLoader, WaitBundleLoader, - ProcessBundleResult, + ProcessBundleHandle, Done, } @@ -51,9 +51,9 @@ namespace YooAsset public UnityEngine.SceneManagement.Scene SceneObject { protected set; get; } /// - /// 加载的资源包结果 + /// 加载的资源包句柄 /// - public IBundleResult LoadedBundleResult { protected set; get; } + public IBundleHandle LoadedBundleHandle { protected set; get; } /// /// 加载的场景名称 @@ -77,7 +77,7 @@ namespace YooAsset { get { - return _steps == ESteps.WaitBundleLoader || _steps == ESteps.ProcessBundleResult; + return _steps == ESteps.WaitBundleLoader || _steps == ESteps.ProcessBundleHandle; } } @@ -174,20 +174,20 @@ namespace YooAsset } // 检测加载结果 - LoadedBundleResult = _mainBundleLoader.Result; - if (LoadedBundleResult == null) + LoadedBundleHandle = _mainBundleLoader.BundleHandle; + if (LoadedBundleHandle == null) { - string error = $"Loaded bundle result is null."; + string error = $"Loaded bundle handle is null."; InvokeCompletion(error, EOperationStatus.Failed); return; } - _steps = ESteps.ProcessBundleResult; + _steps = ESteps.ProcessBundleHandle; } - if (_steps == ESteps.ProcessBundleResult) + if (_steps == ESteps.ProcessBundleHandle) { - ProcessBundleResult(); + ProcessBundleHandle(); } } internal override void InternalWaitForCompletion() @@ -196,13 +196,13 @@ namespace YooAsset } internal override string InternalGetDescription() { - return $"AssetPath : {MainAssetInfo.AssetPath}"; + return $"AssetPath: {MainAssetInfo.AssetPath}"; } /// - /// 处理资源包加载结果,由子类实现具体逻辑 + /// 处理资源包句柄,由子类实现具体逻辑 /// - protected abstract void ProcessBundleResult(); + protected abstract void ProcessBundleHandle(); /// /// 销毁资源提供者 @@ -316,26 +316,6 @@ namespace YooAsset } } - /// - /// 获取下载报告 - /// - public DownloadStatus GetDownloadStatus() - { - DownloadStatus status = new DownloadStatus(); - foreach (var bundleLoader in _bundleLoaders) - { - status.TotalBytes += bundleLoader.LoadBundleInfo.Bundle.FileSize; - status.DownloadedBytes += bundleLoader.DownloadedBytes; - } - - if (status.TotalBytes == 0) - throw new YooInternalException("Download total size cannot be zero."); - - status.IsDone = status.DownloadedBytes == status.TotalBytes; - status.Progress = (float)status.DownloadedBytes / status.TotalBytes; - return status; - } - #region 调试信息 /// /// 资源加载时的活跃场景(资源出生的场景) diff --git a/Assets/YooAsset/Runtime/ResourceManager/Providers/RawFileProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Providers/RawFileProvider.cs index cd3032cd..6f38fdd9 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Providers/RawFileProvider.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Providers/RawFileProvider.cs @@ -9,7 +9,7 @@ namespace YooAsset public RawFileProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo) : base(manager, providerGUID, assetInfo) { } - protected override void ProcessBundleResult() + protected override void ProcessBundleHandle() { InvokeCompletion(string.Empty, EOperationStatus.Succeeded); } diff --git a/Assets/YooAsset/Runtime/ResourceManager/Providers/SceneProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Providers/SceneProvider.cs index 3287ade1..d0cff18a 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Providers/SceneProvider.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Providers/SceneProvider.cs @@ -11,21 +11,21 @@ namespace YooAsset /// internal sealed class SceneProvider : ProviderBase { - private readonly LoadSceneParameters _loadParams; + private readonly LoadSceneParameters _loadSceneParams; private bool _suspendLoad; - private FSLoadSceneOperation _loadSceneOp; + private BHLoadSceneOperation _loadSceneOp; - public SceneProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo, LoadSceneParameters loadParams, bool suspendLoad) : base(manager, providerGUID, assetInfo) + public SceneProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo, LoadSceneParameters loadSceneParams, bool suspendLoad) : base(manager, providerGUID, assetInfo) { - _loadParams = loadParams; + _loadSceneParams = loadSceneParams; _suspendLoad = suspendLoad; LoadedSceneName = Path.GetFileNameWithoutExtension(assetInfo.AssetPath); } - protected override void ProcessBundleResult() + protected override void ProcessBundleHandle() { if (_loadSceneOp == null) { - _loadSceneOp = LoadedBundleResult.LoadSceneOperation(MainAssetInfo, _loadParams, _suspendLoad); + _loadSceneOp = LoadedBundleHandle.LoadSceneAsync(MainAssetInfo, _loadSceneParams, _suspendLoad); _loadSceneOp.StartOperation(); AddChildOperation(_loadSceneOp); } @@ -35,7 +35,7 @@ namespace YooAsset // 注意:场景加载中途可以取消挂起 if (_suspendLoad == false) - _loadSceneOp.UnSuspendLoad(); + _loadSceneOp.ResumeLoad(); _loadSceneOp.UpdateOperation(); Progress = _loadSceneOp.Progress; diff --git a/Assets/YooAsset/Runtime/ResourceManager/Providers/SubAssetsProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Providers/SubAssetsProvider.cs index 9109ab73..cb37268d 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Providers/SubAssetsProvider.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Providers/SubAssetsProvider.cs @@ -6,16 +6,16 @@ namespace YooAsset /// internal sealed class SubAssetsProvider : ProviderBase { - private FSLoadSubAssetsOperation _loadSubAssetsOp; + private BHLoadSubAssetsOperation _loadSubAssetsOp; public SubAssetsProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo) : base(manager, providerGUID, assetInfo) { } - protected override void ProcessBundleResult() + protected override void ProcessBundleHandle() { if (_loadSubAssetsOp == null) { - _loadSubAssetsOp = LoadedBundleResult.LoadSubAssetsAsync(MainAssetInfo); + _loadSubAssetsOp = LoadedBundleHandle.LoadSubAssetsAsync(MainAssetInfo); _loadSubAssetsOp.StartOperation(); AddChildOperation(_loadSubAssetsOp); diff --git a/Assets/YooAsset/Runtime/ResourcePackage/BundleInfo.cs b/Assets/YooAsset/Runtime/ResourcePackage/BundleInfo.cs index a25d87dd..32224d02 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/BundleInfo.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/BundleInfo.cs @@ -44,10 +44,10 @@ namespace YooAsset /// 创建资源包加载器 /// /// 返回资源包加载操作对象 - public FSLoadBundleOperation CreateBundleLoader() + public FSLoadPackageBundleOperation CreateBundleLoader() { - var options = new FCLoadBundleOptions(Bundle); - return _fileSystem.LoadBundleAsync(options); + var options = new FSLoadPackageBundleOptions(Bundle); + return _fileSystem.LoadPackageBundleAsync(options); } /// diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operations/ClearCacheOperation.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operations/ClearCacheOperation.cs index 36e8b6d5..04832c3c 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/Operations/ClearCacheOperation.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/Operations/ClearCacheOperation.cs @@ -75,7 +75,7 @@ namespace YooAsset var fileSystem = _cloneList[0]; _cloneList.RemoveAt(0); - _clearCacheFilesOp = fileSystem.ClearCacheAsync(_options); + _clearCacheFilesOp = fileSystem.ClearCacheAsync(_options.ConvertTo()); _clearCacheFilesOp.StartOperation(); AddChildOperation(_clearCacheFilesOp); _steps = ESteps.CheckClearResult; @@ -103,7 +103,7 @@ namespace YooAsset } internal override string InternalGetDescription() { - return $"ClearMode : {_options.ClearMode}"; + return $"ClearMode: {_options.ClearMode}"; } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operations/ClearCacheOptions.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operations/ClearCacheOptions.cs index 8c2e6156..07ee4f24 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/Operations/ClearCacheOptions.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/Operations/ClearCacheOptions.cs @@ -78,5 +78,17 @@ namespace YooAsset ClearParam = clearParam; Manifest = null; } + + /// + /// 转换为 FileSystem 的清理缓存选项 + /// + internal FSClearCacheOptions ConvertTo() + { + var options = new FSClearCacheOptions(); + options.ClearMode = ClearMode; + options.ClearParam = ClearParam; + options.Manifest = Manifest; + return options; + } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operations/DestroyPackageOperation.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operations/DestroyPackageOperation.cs index 65ce479a..df743fd6 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/Operations/DestroyPackageOperation.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/Operations/DestroyPackageOperation.cs @@ -104,7 +104,7 @@ namespace YooAsset } internal override string InternalGetDescription() { - return $"PackageVersion : {_resourcePackage.GetPackageVersion()}"; + return $"PackageVersion: {_resourcePackage.GetPackageVersion()}"; } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operations/DownloaderOperation.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operations/DownloaderOperation.cs index d1f1916a..354b43c2 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/Operations/DownloaderOperation.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/Operations/DownloaderOperation.cs @@ -149,7 +149,7 @@ namespace YooAsset foreach (var downloader in _downloaders) { downloader.UpdateOperation(); - downloadBytes += downloader.DownloadedBytes; + downloadBytes += downloader.Report.DownloadedBytes; if (downloader.IsDone == false) continue; @@ -164,7 +164,7 @@ namespace YooAsset // 下载成功 _removeList.Add(downloader); _completedDownloadCount++; - _completedDownloadBytes += downloader.DownloadedBytes; + _completedDownloadBytes += downloader.Report.DownloadedBytes; } // 移除已经完成的下载器(无论成功或失败) @@ -238,7 +238,7 @@ namespace YooAsset string bundleName = failedDownloader.Bundle.BundleName; _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"Failed to download file : {bundleName}"; + Error = $"Failed to download file: {bundleName}"; if (DownloadErrorHandler != null) { @@ -381,7 +381,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = "User cancel."; + Error = "Cancelled by user."; foreach (var downloader in _downloaders) { diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operations/InitializePackageOperation.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operations/InitializePackageOperation.cs index bee62014..fb8a3768 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/Operations/InitializePackageOperation.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/Operations/InitializePackageOperation.cs @@ -12,7 +12,6 @@ namespace YooAsset None, SetPlayMode, CheckOptions, - CheckPlatform, CreateCore, InitFileSystem, Done, @@ -69,50 +68,6 @@ namespace YooAsset return; } - _steps = ESteps.CheckPlatform; - } - - if (_steps == ESteps.CheckPlatform) - { -#if !UNITY_EDITOR - if (_playMode == EPlayMode.EditorSimulateMode) - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = $"Editor simulate mode only support unity editor."; - YooLogger.Error(Error); - return; - } -#endif - -#if UNITY_WEBGL - if (_playMode != EPlayMode.EditorSimulateMode) - { - if (_playMode != EPlayMode.WebPlayMode) - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = $"{_playMode} does not support WebGL platform."; - YooLogger.Error(Error); - return; - } - } -#endif - -#if !UNITY_WEBGL - if (_playMode != EPlayMode.EditorSimulateMode) - { - if (_playMode == EPlayMode.WebPlayMode) - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = $"{nameof(EPlayMode.WebPlayMode)} only supports WebGL platform."; - YooLogger.Error(Error); - return; - } - } -#endif - _steps = ESteps.CreateCore; } @@ -186,7 +141,7 @@ namespace YooAsset } internal override string InternalGetDescription() { - return $"PlayMode : {_playMode}"; + return $"PlayMode: {_playMode}"; } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operations/Internal/DeserializeManifestOperation.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operations/Internal/DeserializeManifestOperation.cs index afa3f03d..52e4a383 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/Operations/Internal/DeserializeManifestOperation.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/Operations/Internal/DeserializeManifestOperation.cs @@ -75,7 +75,7 @@ namespace YooAsset // 读取文件标记 uint fileSign = _buffer.ReadUInt32(); - if (fileSign != PackageManifestDefine.FileSignature) + if (fileSign != PackageManifestConsts.FileSignature) { _steps = ESteps.Done; Status = EOperationStatus.Failed; @@ -86,13 +86,13 @@ namespace YooAsset // 读取文件版本 string fileVersion = _buffer.ReadUTF8(); Version fileVer = new Version(fileVersion); - Version ver2025_8_28 = new Version(PackageManifestDefine.VERSION_2025_8_28); - Version ver2025_9_30 = new Version(PackageManifestDefine.VERSION_2025_9_30); + Version ver2025_8_28 = new Version(PackageManifestConsts.VERSION_2025_8_28); + Version ver2025_9_30 = new Version(PackageManifestConsts.VERSION_2025_9_30); if (fileVer < ver2025_8_28) { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"The manifest version is lower than the minimum compatible version : {fileVer} < {ver2025_8_28}"; + Error = $"The manifest version is lower than the minimum compatible version: {fileVer} < {ver2025_8_28}"; return; } @@ -116,9 +116,9 @@ namespace YooAsset // 检测配置 if (Manifest.EnableAddressable && Manifest.LocationToLower) - throw new YooManifestException("Addressable not support location to lower."); + throw new YooManifestException("Addressable mode does not support converting locations to lowercase."); if (Manifest.EnableAddressable == false && Manifest.ReplaceAssetPathWithAddress) - throw new YooManifestException("Replace asset path with address need enable Addressable."); + throw new YooManifestException("Replacing asset path with address requires Addressable to be enabled."); _steps = ESteps.PrepareAssetList; } diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operations/Internal/InitializeFileSystemOperation.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operations/Internal/InitializeFileSystemOperation.cs index 695ae56a..f5fe9f30 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/Operations/Internal/InitializeFileSystemOperation.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/Operations/Internal/InitializeFileSystemOperation.cs @@ -43,7 +43,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = "The file system parameters is empty."; + Error = "The file system parameters are empty."; return; } diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operations/LoadManifestOperation.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operations/LoadPackageManifestOperation.cs similarity index 70% rename from Assets/YooAsset/Runtime/ResourcePackage/Operations/LoadManifestOperation.cs rename to Assets/YooAsset/Runtime/ResourcePackage/Operations/LoadPackageManifestOperation.cs index c6a10587..1ecf8bee 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/Operations/LoadManifestOperation.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/Operations/LoadPackageManifestOperation.cs @@ -4,7 +4,7 @@ namespace YooAsset /// /// 加载资源清单操作 /// - public sealed class LoadManifestOperation : AsyncOperationBase + public sealed class LoadPackageManifestOperation : AsyncOperationBase { private enum ESteps { @@ -16,11 +16,11 @@ namespace YooAsset } private readonly FileSystemHost _host; - private readonly LoadManifestOptions _options; - private FSLoadManifestOperation _loadPackageManifestOp; + private readonly LoadPackageManifestOptions _options; + private FSLoadPackageManifestOperation _loadManifestOp; private ESteps _steps = ESteps.None; - internal LoadManifestOperation(FileSystemHost host, LoadManifestOptions options) + internal LoadPackageManifestOperation(FileSystemHost host, LoadPackageManifestOptions options) { _host = host; _options = options; @@ -64,35 +64,35 @@ namespace YooAsset if (_steps == ESteps.LoadPackageManifest) { - if (_loadPackageManifestOp == null) + if (_loadManifestOp == null) { var mainFileSystem = _host.GetMainFileSystem(); - _loadPackageManifestOp = mainFileSystem.LoadManifestAsync(_options); - _loadPackageManifestOp.StartOperation(); - AddChildOperation(_loadPackageManifestOp); + _loadManifestOp = mainFileSystem.LoadPackageManifestAsync(_options.ConvertTo()); + _loadManifestOp.StartOperation(); + AddChildOperation(_loadManifestOp); } - _loadPackageManifestOp.UpdateOperation(); - if (_loadPackageManifestOp.IsDone == false) + _loadManifestOp.UpdateOperation(); + if (_loadManifestOp.IsDone == false) return; - if (_loadPackageManifestOp.Status == EOperationStatus.Succeeded) + if (_loadManifestOp.Status == EOperationStatus.Succeeded) { _steps = ESteps.Done; - _host.SetActiveManifest(_loadPackageManifestOp.Manifest); + _host.SetActiveManifest(_loadManifestOp.Manifest); Status = EOperationStatus.Succeeded; } else { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _loadPackageManifestOp.Error; + Error = _loadManifestOp.Error; } } } internal override string InternalGetDescription() { - return $"PackageVersion : {_options.PackageVersion}"; + return $"PackageVersion: {_options.PackageVersion}"; } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operations/LoadManifestOperation.cs.meta b/Assets/YooAsset/Runtime/ResourcePackage/Operations/LoadPackageManifestOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/ResourcePackage/Operations/LoadManifestOperation.cs.meta rename to Assets/YooAsset/Runtime/ResourcePackage/Operations/LoadPackageManifestOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operations/LoadManifestOptions.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operations/LoadPackageManifestOptions.cs similarity index 62% rename from Assets/YooAsset/Runtime/ResourcePackage/Operations/LoadManifestOptions.cs rename to Assets/YooAsset/Runtime/ResourcePackage/Operations/LoadPackageManifestOptions.cs index b250fa41..4e4e714c 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/Operations/LoadManifestOptions.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/Operations/LoadPackageManifestOptions.cs @@ -4,7 +4,7 @@ namespace YooAsset /// /// 加载清单选项 /// - public struct LoadManifestOptions + public struct LoadPackageManifestOptions { /// /// 包裹版本 @@ -21,10 +21,18 @@ namespace YooAsset /// /// 包裹版本 /// 超时时间(秒) - public LoadManifestOptions(string packageVersion, int timeout) + public LoadPackageManifestOptions(string packageVersion, int timeout) { PackageVersion = packageVersion; Timeout = timeout; } + + /// + /// 转换为 FileSystem 的加载清单选项 + /// + internal FSLoadPackageManifestOptions ConvertTo() + { + return new FSLoadPackageManifestOptions(PackageVersion, Timeout); + } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operations/LoadManifestOptions.cs.meta b/Assets/YooAsset/Runtime/ResourcePackage/Operations/LoadPackageManifestOptions.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/ResourcePackage/Operations/LoadManifestOptions.cs.meta rename to Assets/YooAsset/Runtime/ResourcePackage/Operations/LoadPackageManifestOptions.cs.meta diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operations/PreDownloaderOperation.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operations/PrefetchManifestOperation.cs similarity index 84% rename from Assets/YooAsset/Runtime/ResourcePackage/Operations/PreDownloaderOperation.cs rename to Assets/YooAsset/Runtime/ResourcePackage/Operations/PrefetchManifestOperation.cs index de6627d2..937842f8 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/Operations/PreDownloaderOperation.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/Operations/PrefetchManifestOperation.cs @@ -5,9 +5,9 @@ using System.Collections.Generic; namespace YooAsset { /// - /// 预下载操作,用于提前下载指定版本的资源 + /// 预取清单操作,用于提前加载指定版本的资源清单 /// - public sealed class PreDownloaderOperation : AsyncOperationBase + public sealed class PrefetchManifestOperation : AsyncOperationBase { private enum ESteps { @@ -19,13 +19,13 @@ namespace YooAsset } private readonly FileSystemHost _host; - private readonly PreDownloaderOptions _options; - private FSLoadManifestOperation _loadPackageManifestOp; + private readonly PrefetchManifestOptions _options; + private FSLoadPackageManifestOperation _loadPackageManifestOp; private PackageManifest _manifest; private ESteps _steps = ESteps.None; - internal PreDownloaderOperation(FileSystemHost host, PreDownloaderOptions options) + internal PrefetchManifestOperation(FileSystemHost host, PrefetchManifestOptions options) { _host = host; _options = options; @@ -73,8 +73,8 @@ namespace YooAsset if (_loadPackageManifestOp == null) { var mainFileSystem = _host.GetMainFileSystem(); - var options = new LoadManifestOptions(_options.PackageVersion, _options.Timeout); - _loadPackageManifestOp = mainFileSystem.LoadManifestAsync(options); + var options = new LoadPackageManifestOptions(_options.PackageVersion, _options.Timeout); + _loadPackageManifestOp = mainFileSystem.LoadPackageManifestAsync(options.ConvertTo()); _loadPackageManifestOp.StartOperation(); AddChildOperation(_loadPackageManifestOp); } @@ -105,7 +105,7 @@ namespace YooAsset { if (Status != EOperationStatus.Succeeded) { - YooLogger.Error($"{nameof(PreDownloaderOperation)} did not succeed."); + YooLogger.Error($"{nameof(PrefetchManifestOperation)} did not succeed."); return ResourceDownloaderOperation.CreateEmptyDownloader(_host.PackageName); } @@ -119,7 +119,7 @@ namespace YooAsset { if (Status != EOperationStatus.Succeeded) { - YooLogger.Error($"{nameof(PreDownloaderOperation)} did not succeed."); + YooLogger.Error($"{nameof(PrefetchManifestOperation)} did not succeed."); return ResourceDownloaderOperation.CreateEmptyDownloader(_host.PackageName); } diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operations/PreDownloaderOperation.cs.meta b/Assets/YooAsset/Runtime/ResourcePackage/Operations/PrefetchManifestOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/ResourcePackage/Operations/PreDownloaderOperation.cs.meta rename to Assets/YooAsset/Runtime/ResourcePackage/Operations/PrefetchManifestOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operations/PreDownloaderOptions.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operations/PrefetchManifestOptions.cs similarity index 64% rename from Assets/YooAsset/Runtime/ResourcePackage/Operations/PreDownloaderOptions.cs rename to Assets/YooAsset/Runtime/ResourcePackage/Operations/PrefetchManifestOptions.cs index 284b54e3..bb52231a 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/Operations/PreDownloaderOptions.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/Operations/PrefetchManifestOptions.cs @@ -2,12 +2,12 @@ namespace YooAsset { /// - /// 预下载选项 + /// 预取清单选项 /// - public struct PreDownloaderOptions + public struct PrefetchManifestOptions { /// - /// 预下载的包裹版本 + /// 预取的包裹版本 /// public string PackageVersion { get; set; } @@ -17,11 +17,11 @@ namespace YooAsset public int Timeout { get; set; } /// - /// 创建预下载选项 + /// 创建预取清单选项 /// - /// 预下载的包裹版本 + /// 预取的包裹版本 /// 资源清单请求超时时间(秒) - public PreDownloaderOptions(string packageVersion, int timeout) + public PrefetchManifestOptions(string packageVersion, int timeout) { PackageVersion = packageVersion; Timeout = timeout; diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operations/PreDownloaderOptions.cs.meta b/Assets/YooAsset/Runtime/ResourcePackage/Operations/PrefetchManifestOptions.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/ResourcePackage/Operations/PreDownloaderOptions.cs.meta rename to Assets/YooAsset/Runtime/ResourcePackage/Operations/PrefetchManifestOptions.cs.meta diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operations/RequestVersionOperation.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operations/RequestPackageVersionOperation.cs similarity index 59% rename from Assets/YooAsset/Runtime/ResourcePackage/Operations/RequestVersionOperation.cs rename to Assets/YooAsset/Runtime/ResourcePackage/Operations/RequestPackageVersionOperation.cs index ec07b390..9da110f5 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/Operations/RequestVersionOperation.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/Operations/RequestPackageVersionOperation.cs @@ -4,7 +4,7 @@ namespace YooAsset /// /// 请求包裹版本操作 /// - public sealed class RequestVersionOperation : AsyncOperationBase + public sealed class RequestPackageVersionOperation : AsyncOperationBase { private enum ESteps { @@ -14,8 +14,8 @@ namespace YooAsset } private readonly FileSystemHost _host; - private readonly RequestVersionOptions _options; - private FSRequestVersionOperation _requestPackageVersionOp; + private readonly RequestPackageVersionOptions _options; + private FSRequestPackageVersionOperation _requestVersionOp; private ESteps _steps = ESteps.None; /// @@ -24,7 +24,7 @@ namespace YooAsset public string PackageVersion { get; private set; } - internal RequestVersionOperation(FileSystemHost host, RequestVersionOptions options) + internal RequestPackageVersionOperation(FileSystemHost host, RequestPackageVersionOptions options) { _host = host; _options = options; @@ -40,29 +40,29 @@ namespace YooAsset if (_steps == ESteps.RequestPackageVersion) { - if (_requestPackageVersionOp == null) + if (_requestVersionOp == null) { var mainFileSystem = _host.GetMainFileSystem(); - _requestPackageVersionOp = mainFileSystem.RequestVersionAsync(_options); - _requestPackageVersionOp.StartOperation(); - AddChildOperation(_requestPackageVersionOp); + _requestVersionOp = mainFileSystem.RequestPackageVersionAsync(_options.ConvertTo()); + _requestVersionOp.StartOperation(); + AddChildOperation(_requestVersionOp); } - _requestPackageVersionOp.UpdateOperation(); - if (_requestPackageVersionOp.IsDone == false) + _requestVersionOp.UpdateOperation(); + if (_requestVersionOp.IsDone == false) return; - if (_requestPackageVersionOp.Status == EOperationStatus.Succeeded) + if (_requestVersionOp.Status == EOperationStatus.Succeeded) { _steps = ESteps.Done; - PackageVersion = _requestPackageVersionOp.PackageVersion; + PackageVersion = _requestVersionOp.PackageVersion; Status = EOperationStatus.Succeeded; } else { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _requestPackageVersionOp.Error; + Error = _requestVersionOp.Error; } } } diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operations/RequestVersionOperation.cs.meta b/Assets/YooAsset/Runtime/ResourcePackage/Operations/RequestPackageVersionOperation.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/ResourcePackage/Operations/RequestVersionOperation.cs.meta rename to Assets/YooAsset/Runtime/ResourcePackage/Operations/RequestPackageVersionOperation.cs.meta diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operations/RequestVersionOptions.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operations/RequestPackageVersionOptions.cs similarity index 63% rename from Assets/YooAsset/Runtime/ResourcePackage/Operations/RequestVersionOptions.cs rename to Assets/YooAsset/Runtime/ResourcePackage/Operations/RequestPackageVersionOptions.cs index 72660759..233d00f4 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/Operations/RequestVersionOptions.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/Operations/RequestPackageVersionOptions.cs @@ -4,7 +4,7 @@ namespace YooAsset /// /// 请求版本选项 /// - public struct RequestVersionOptions + public struct RequestPackageVersionOptions { /// /// 在URL末尾添加时间戳 @@ -21,10 +21,18 @@ namespace YooAsset /// /// 是否在URL末尾添加时间戳 /// 超时时间(秒) - public RequestVersionOptions(bool appendTimeTicks, int timeout) + public RequestPackageVersionOptions(bool appendTimeTicks, int timeout) { AppendTimeTicks = appendTimeTicks; Timeout = timeout; } + + /// + /// 转换为 FileSystem 的请求版本选项 + /// + internal FSRequestPackageVersionOptions ConvertTo() + { + return new FSRequestPackageVersionOptions(AppendTimeTicks, Timeout); + } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operations/RequestVersionOptions.cs.meta b/Assets/YooAsset/Runtime/ResourcePackage/Operations/RequestPackageVersionOptions.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/ResourcePackage/Operations/RequestVersionOptions.cs.meta rename to Assets/YooAsset/Runtime/ResourcePackage/Operations/RequestPackageVersionOptions.cs.meta diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PackageManifest.cs b/Assets/YooAsset/Runtime/ResourcePackage/PackageManifest.cs index 8f389048..2ae95d1b 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/PackageManifest.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/PackageManifest.cs @@ -134,7 +134,7 @@ namespace YooAsset } else { - throw new YooManifestException($"Invalid bundle ID : {bundleID}. Valid range is 0 to {BundleList.Count - 1}"); + throw new YooManifestException($"Invalid bundle ID: {bundleID}. Valid range is 0 to {BundleList.Count - 1}"); } } @@ -207,7 +207,7 @@ namespace YooAsset } else { - throw new YooManifestException($"Invalid bundle ID : {bundleID}. Valid range is 0 to {BundleList.Count - 1}"); + throw new YooManifestException($"Invalid bundle ID: {bundleID}. Valid range is 0 to {BundleList.Count - 1}"); } } @@ -367,7 +367,7 @@ namespace YooAsset if (string.IsNullOrEmpty(location)) error = $"The location is null or empty."; else - error = $"The location is invalid : {location}"; + error = $"The location is invalid: {location}"; AssetInfo assetInfo = new AssetInfo(PackageName, error); return assetInfo; } @@ -418,7 +418,7 @@ namespace YooAsset if (string.IsNullOrEmpty(assetGUID)) error = $"The assetGUID is null or empty."; else - error = $"The assetGUID is invalid : {assetGUID}"; + error = $"The asset GUID is invalid: {assetGUID}"; AssetInfo assetInfo = new AssetInfo(PackageName, error); return assetInfo; } @@ -453,11 +453,11 @@ namespace YooAsset if (index != -1) { if (location.Length == index + 1) - YooLogger.Warning($"Found blank character in location : \"{location}\""); + YooLogger.Warning($"Found blank character in location: \"{location}\""); } if (location.IndexOfAny(System.IO.Path.GetInvalidPathChars()) >= 0) - YooLogger.Warning($"Found illegal character in location : \"{location}\""); + YooLogger.Warning($"Found illegal character in location: \"{location}\""); } } #endregion diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PackageManifestDefine.cs b/Assets/YooAsset/Runtime/ResourcePackage/PackageManifestConsts.cs similarity index 95% rename from Assets/YooAsset/Runtime/ResourcePackage/PackageManifestDefine.cs rename to Assets/YooAsset/Runtime/ResourcePackage/PackageManifestConsts.cs index 16d79c83..ceb7ef81 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/PackageManifestDefine.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/PackageManifestConsts.cs @@ -4,7 +4,7 @@ namespace YooAsset /// /// 清单文件常量定义 /// - internal class PackageManifestDefine + internal class PackageManifestConsts { /// /// 文件极限大小(100MB) diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PackageManifestDefine.cs.meta b/Assets/YooAsset/Runtime/ResourcePackage/PackageManifestConsts.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/ResourcePackage/PackageManifestDefine.cs.meta rename to Assets/YooAsset/Runtime/ResourcePackage/PackageManifestConsts.cs.meta diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PackageManifestTools.cs b/Assets/YooAsset/Runtime/ResourcePackage/PackageManifestTools.cs index 1c0848dd..80a2b2c7 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/PackageManifestTools.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/PackageManifestTools.cs @@ -61,10 +61,10 @@ namespace YooAsset using (FileStream fs = new FileStream(savePath, FileMode.Create)) { // 创建缓存器 - BufferWriter buffer = new BufferWriter(PackageManifestDefine.MaxFileSize); + BufferWriter buffer = new BufferWriter(PackageManifestConsts.MaxFileSize); // 写入文件标记 - buffer.WriteUInt32(PackageManifestDefine.FileSignature); + buffer.WriteUInt32(PackageManifestConsts.FileSignature); // 写入文件版本 buffer.WriteUTF8(manifest.FileVersion); @@ -204,7 +204,7 @@ namespace YooAsset } default: - throw new NotImplementedException($"Invalid name style : {nameStyle}"); + throw new NotImplementedException($"Invalid name style: {nameStyle}"); } } } diff --git a/Assets/YooAsset/Runtime/ResourcePackage/ResourcePackage.cs b/Assets/YooAsset/Runtime/ResourcePackage/ResourcePackage.cs index 35cff453..0152fa73 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/ResourcePackage.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/ResourcePackage.cs @@ -126,11 +126,11 @@ namespace YooAsset /// 请求最新的资源版本 /// 说明:超时时间默认60秒 /// - public RequestVersionOperation RequestVersionAsync() + public RequestPackageVersionOperation RequestPackageVersionAsync() { int defaultTimeout = 60; - var options = new RequestVersionOptions(true, defaultTimeout); - return RequestVersionAsync(options); + var options = new RequestPackageVersionOptions(true, defaultTimeout); + return RequestPackageVersionAsync(options); } /// @@ -138,10 +138,10 @@ namespace YooAsset /// /// 请求版本选项 /// 返回请求版本操作对象 - public RequestVersionOperation RequestVersionAsync(RequestVersionOptions options) + public RequestPackageVersionOperation RequestPackageVersionAsync(RequestPackageVersionOptions options) { CheckInitialized(false); - var operation = new RequestVersionOperation(_fileSystemHost, options); + var operation = new RequestPackageVersionOperation(_fileSystemHost, options); AsyncOperationSystem.StartOperation(PackageName, operation); return operation; } @@ -151,7 +151,7 @@ namespace YooAsset /// /// 加载清单选项 /// 返回加载清单操作对象 - public LoadManifestOperation LoadManifestAsync(LoadManifestOptions options) + public LoadPackageManifestOperation LoadPackageManifestAsync(LoadPackageManifestOptions options) { CheckInitialized(false); @@ -161,20 +161,20 @@ namespace YooAsset YooLogger.Warning($"Found loaded bundles before updating the manifest. It is recommended to call the {nameof(UnloadAllAssetsAsync)} method to release loaded bundles."); } - var operation = new LoadManifestOperation(_fileSystemHost, options); + var operation = new LoadPackageManifestOperation(_fileSystemHost, options); AsyncOperationSystem.StartOperation(PackageName, operation); return operation; } /// - /// 预下载指定版本的包裹资源 + /// 预取指定版本的包裹资源清单 /// - /// 预下载选项 - /// 返回预下载操作对象 - public PreDownloaderOperation PreDownloaderAsync(PreDownloaderOptions options) + /// 预取清单选项 + /// 返回预取清单操作对象 + public PrefetchManifestOperation PrefetchManifestAsync(PrefetchManifestOptions options) { CheckInitialized(false); - var operation = new PreDownloaderOperation(_fileSystemHost, options); + var operation = new PrefetchManifestOperation(_fileSystemHost, options); AsyncOperationSystem.StartOperation(PackageName, operation); return operation; } @@ -933,10 +933,10 @@ namespace YooAsset return; if (typeof(UnityEngine.Behaviour).IsAssignableFrom(type)) - throw new YooLoadException($"Load asset type is invalid : {type.FullName}"); + throw new YooLoadException($"Load asset type is invalid: {type.FullName}"); if (typeof(UnityEngine.Object).IsAssignableFrom(type) == false) - throw new YooLoadException($"Load asset type is invalid : {type.FullName}"); + throw new YooLoadException($"Load asset type is invalid: {type.FullName}"); } #endregion diff --git a/Assets/YooAsset/Runtime/Settings/YooAssetSettingsData.cs b/Assets/YooAsset/Runtime/Settings/YooAssetSettingsData.cs index ed3d40c7..cf92f511 100644 --- a/Assets/YooAsset/Runtime/Settings/YooAssetSettingsData.cs +++ b/Assets/YooAsset/Runtime/Settings/YooAssetSettingsData.cs @@ -191,7 +191,7 @@ namespace YooAsset /// /// 获取YOO默认的内置文件根目录 /// - internal static string GetYooDefaultBuildinRoot() + internal static string GetYooDefaultBuiltinRoot() { if (string.IsNullOrEmpty(Setting.DefaultYooFolderName)) return Application.streamingAssetsPath; diff --git a/Assets/YooAsset/Runtime/Utility/Utilities/FileUtility.cs b/Assets/YooAsset/Runtime/Utility/Utilities/FileUtility.cs index dc08fa8b..55c50f12 100644 --- a/Assets/YooAsset/Runtime/Utility/Utilities/FileUtility.cs +++ b/Assets/YooAsset/Runtime/Utility/Utilities/FileUtility.cs @@ -10,6 +10,18 @@ namespace YooAsset /// internal static class FileUtility { + /// + /// 检查文件路径是否支持 FileIO 读取 + /// + public static bool SupportsFileIO(string filePath) + { + if (string.IsNullOrEmpty(filePath)) + return false; + if (filePath.StartsWith("jar:") || filePath.StartsWith("content:")) + return false; + return true; + } + /// /// 读取文件的文本数据 /// diff --git a/Assets/YooAsset/Runtime/Utility/Utilities/PathUtility.cs b/Assets/YooAsset/Runtime/Utility/Utilities/PathUtility.cs index f14bf6b2..911901fc 100644 --- a/Assets/YooAsset/Runtime/Utility/Utilities/PathUtility.cs +++ b/Assets/YooAsset/Runtime/Utility/Utilities/PathUtility.cs @@ -50,7 +50,8 @@ namespace YooAsset /// public static string Combine(string path1, string path2) { - return StringUtility.Format("{0}/{1}", path1, path2); + // 注意:某些静态服务器的规则可能不接受双斜杠路径 + return StringUtility.Format("{0}/{1}", path1.TrimEnd('/'), path2.Trim('/')); } /// @@ -58,7 +59,8 @@ namespace YooAsset /// public static string Combine(string path1, string path2, string path3) { - return StringUtility.Format("{0}/{1}/{2}", path1, path2, path3); + // 注意:某些静态服务器的规则可能不接受双斜杠路径 + return StringUtility.Format("{0}/{1}/{2}", path1.TrimEnd('/'), path2.Trim('/'), path3.Trim('/')); } /// @@ -66,7 +68,8 @@ namespace YooAsset /// public static string Combine(string path1, string path2, string path3, string path4) { - return StringUtility.Format("{0}/{1}/{2}/{3}", path1, path2, path3, path4); + // 注意:某些静态服务器的规则可能不接受双斜杠路径 + return StringUtility.Format("{0}/{1}/{2}/{3}", path1.TrimEnd('/'), path2.Trim('/'), path3.Trim('/'), path4.Trim('/')); } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/Utility/Utilities/TextUtility.cs b/Assets/YooAsset/Runtime/Utility/Utilities/TextUtility.cs new file mode 100644 index 00000000..40ef4fdd --- /dev/null +++ b/Assets/YooAsset/Runtime/Utility/Utilities/TextUtility.cs @@ -0,0 +1,48 @@ + +namespace YooAsset +{ + /// + /// 文本工具类 + /// + internal static class TextUtility + { + /// + /// 严格校验文本文件内容是否合法 + /// + /// 待校验的文本内容 + /// 校验失败时的错误描述 + /// 校验通过返回true,否则返回false + public static bool ValidateContent(string content, out string error) + { + if (string.IsNullOrEmpty(content)) + { + error = "Text content is null or empty."; + return false; + } + + // 检验BOM + if (content[0] == '\uFEFF') + { + error = "Text content contains UTF-8 BOM character."; + return false; + } + + // 检验换行符 + if (content.IndexOf('\r') >= 0 || content.IndexOf('\n') >= 0) + { + error = "Text content contains line break characters."; + return false; + } + + // 检验首尾空白 + if (content != content.Trim()) + { + error = "Text content contains leading or trailing whitespace."; + return false; + } + + error = null; + return true; + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/Utility/Utilities/TextUtility.cs.meta b/Assets/YooAsset/Runtime/Utility/Utilities/TextUtility.cs.meta new file mode 100644 index 00000000..4e9fc7e0 --- /dev/null +++ b/Assets/YooAsset/Runtime/Utility/Utilities/TextUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cb9c3387de33cfc44a1bec18b00e4a62 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/YooAssets.cs b/Assets/YooAsset/Runtime/YooAssets.cs index ccf4c830..9e824380 100644 --- a/Assets/YooAsset/Runtime/YooAssets.cs +++ b/Assets/YooAsset/Runtime/YooAssets.cs @@ -122,7 +122,7 @@ namespace YooAsset CheckInitialized(packageName); var package = GetPackageInternal(packageName); if (package == null) - YooLogger.Error($"Can not found resource package : {packageName}"); + YooLogger.Error($"Cannot find resource package: {packageName}"); return package; } @@ -154,7 +154,7 @@ namespace YooAsset ResourcePackage package = GetPackageInternal(packageName); if (package == null) { - YooLogger.Error($"Can not found resource package : {packageName}"); + YooLogger.Error($"Cannot find resource package: {packageName}"); return false; } diff --git a/Assets/YooAsset/Samples~/Extension Sample/Editor/PreprocessBuild/PreprocessBuildCatalog.cs b/Assets/YooAsset/Samples~/Extension Sample/Editor/PreprocessBuild/PreprocessBuildCatalog.cs index 52b010c4..5d30cea0 100644 --- a/Assets/YooAsset/Samples~/Extension Sample/Editor/PreprocessBuild/PreprocessBuildCatalog.cs +++ b/Assets/YooAsset/Samples~/Extension Sample/Editor/PreprocessBuild/PreprocessBuildCatalog.cs @@ -16,7 +16,7 @@ namespace YooAsset { YooLogger.Log("Begin to create catalog file !"); - string rootPath = YooAssetSettingsData.GetYooDefaultBuildinRoot(); + string rootPath = YooAssetSettingsData.GetYooDefaultBuiltinRoot(); DirectoryInfo rootDirectory = new DirectoryInfo(rootPath); if (rootDirectory.Exists == false) { diff --git a/Assets/YooAsset/Samples~/Extension Sample/Runtime/CompatibleOldVersion.cs b/Assets/YooAsset/Samples~/Extension Sample/Runtime/CompatibleOldVersion.cs index 1f26f99c..0abc1e56 100644 --- a/Assets/YooAsset/Samples~/Extension Sample/Runtime/CompatibleOldVersion.cs +++ b/Assets/YooAsset/Samples~/Extension Sample/Runtime/CompatibleOldVersion.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using UnityEngine; using YooAsset; @@ -121,9 +121,9 @@ public class DestroyOperation : AsyncOperationBase public class UpdatePackageManifestOperation : AsyncOperationBase { private bool _isDone = false; - private readonly LoadManifestOperation _operation; + private readonly LoadPackageManifestOperation _operation; - internal UpdatePackageManifestOperation(LoadManifestOperation op) + internal UpdatePackageManifestOperation(LoadPackageManifestOperation op) { _operation = op; } @@ -247,10 +247,10 @@ public static class CompatibleResourcePackage /// /// 兼容Yoo2版本 /// - public static RequestVersionOperation RequestPackageVersionAsync(this ResourcePackage package, bool appendTimeTicks = true, int timeout = 60) + public static RequestPackageVersionOperation RequestPackageVersionAsync(this ResourcePackage package, bool appendTimeTicks = true, int timeout = 60) { - var options = new RequestVersionOptions(appendTimeTicks, timeout); - return package.RequestVersionAsync(options); + var options = new RequestPackageVersionOptions(appendTimeTicks, timeout); + return package.RequestPackageVersionAsync(options); } /// @@ -258,8 +258,8 @@ public static class CompatibleResourcePackage /// public static UpdatePackageManifestOperation UpdatePackageManifestAsync(this ResourcePackage package, string packageVersion, int timeout = 60) { - var options = new LoadManifestOptions(packageVersion, timeout); - var operation = package.LoadManifestAsync(options); + var options = new LoadPackageManifestOptions(packageVersion, timeout); + var operation = package.LoadPackageManifestAsync(options); var wrapper = new UpdatePackageManifestOperation(operation); AsyncOperationSystem.StartOperation(package.PackageName, wrapper); return wrapper; @@ -268,10 +268,10 @@ public static class CompatibleResourcePackage /// /// 兼容Yoo2版本 /// - public static PreDownloaderOperation PreDownloadContentAsync(this ResourcePackage package, string packageVersion, int timeout = 60) + public static PrefetchManifestOperation PreDownloadContentAsync(this ResourcePackage package, string packageVersion, int timeout = 60) { - var options = new PreDownloaderOptions(packageVersion, timeout); - return package.PreDownloaderAsync(options); + var options = new PrefetchManifestOptions(packageVersion, timeout); + return package.PrefetchManifestAsync(options); } /// diff --git a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionOperation/CopyBuildinManifestOperation.cs b/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionOperation/CopyBuildinManifestOperation.cs index 813a87ba..fd604ce6 100644 --- a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionOperation/CopyBuildinManifestOperation.cs +++ b/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionOperation/CopyBuildinManifestOperation.cs @@ -22,8 +22,8 @@ public class CopyBuildinManifestOperation : AsyncOperationBase private readonly string _packageName; private readonly string _packageVersion; private readonly IDownloadBackend _backend; - private IDownloadFileRequest _hashFileRequestOp; - private IDownloadFileRequest _manifestFileRequestOp; + private IDownloadFileRequest _hashFileRequest; + private IDownloadFileRequest _manifestFileRequest; private ESteps _steps = ESteps.None; public CopyBuildinManifestOperation(string packageName, string packageVersion) @@ -55,20 +55,20 @@ public class CopyBuildinManifestOperation : AsyncOperationBase if (_steps == ESteps.UnpackHashFile) { - if(_hashFileRequestOp == null) + if(_hashFileRequest == null) { string sourcePath = GetBuildinHashFilePath(); string destPath = GetCacheHashFilePath(); string url = DownloadSystemTools.ToLocalUrl(sourcePath); var args = new DownloadFileRequestArgs(url, destPath, 60, 0); - _hashFileRequestOp = _backend.CreateFileRequest(args); - _hashFileRequestOp.SendRequest(); + _hashFileRequest = _backend.CreateFileRequest(args); + _hashFileRequest.SendRequest(); } - if (_hashFileRequestOp.IsDone == false) + if (_hashFileRequest.IsDone == false) return; - if (_hashFileRequestOp.Status == EDownloadRequestStatus.Succeeded) + if (_hashFileRequest.Status == EDownloadRequestStatus.Succeeded) { _steps = ESteps.CheckManifestFile; } @@ -76,7 +76,7 @@ public class CopyBuildinManifestOperation : AsyncOperationBase { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _hashFileRequestOp.Error; + Error = _hashFileRequest.Error; } } @@ -95,20 +95,20 @@ public class CopyBuildinManifestOperation : AsyncOperationBase if (_steps == ESteps.UnpackManifestFile) { - if (_manifestFileRequestOp == null) + if (_manifestFileRequest == null) { string sourcePath = GetBuildinManifestFilePath(); string destPath = GetCacheManifestFilePath(); string url = DownloadSystemTools.ToLocalUrl(sourcePath); var args = new DownloadFileRequestArgs(url, destPath, 60, 0); - _manifestFileRequestOp = _backend.CreateFileRequest(args); - _manifestFileRequestOp.SendRequest(); + _manifestFileRequest = _backend.CreateFileRequest(args); + _manifestFileRequest.SendRequest(); } - if (_manifestFileRequestOp.IsDone == false) + if (_manifestFileRequest.IsDone == false) return; - if (_manifestFileRequestOp.Status == EDownloadRequestStatus.Succeeded) + if (_manifestFileRequest.Status == EDownloadRequestStatus.Succeeded) { _steps = ESteps.Done; Status = EOperationStatus.Succeeded; @@ -117,14 +117,14 @@ public class CopyBuildinManifestOperation : AsyncOperationBase { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _manifestFileRequestOp.Error; + Error = _manifestFileRequest.Error; } } } private string GetBuildinYooRoot() { - return YooAssetSettingsData.GetYooDefaultBuildinRoot(); + return YooAssetSettingsData.GetYooDefaultBuiltinRoot(); } private string GetBuildinHashFilePath() { diff --git a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionOperation/GetBuildinPackageVersionOperation.cs b/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionOperation/GetBuildinPackageVersionOperation.cs index 56b62fb2..fd253394 100644 --- a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionOperation/GetBuildinPackageVersionOperation.cs +++ b/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionOperation/GetBuildinPackageVersionOperation.cs @@ -18,7 +18,7 @@ public class GetBuildinPackageVersionOperation : AsyncOperationBase private readonly string _packageName; private readonly IDownloadBackend _backend; - private IDownloadTextRequest _versionFileRequestOp; + private IDownloadTextRequest _downloadTextRequest; private ESteps _steps = ESteps.None; /// @@ -42,36 +42,36 @@ public class GetBuildinPackageVersionOperation : AsyncOperationBase if (_steps == ESteps.GetPackageVersion) { - if (_versionFileRequestOp == null) + if (_downloadTextRequest == null) { string filePath = GetBuildinPackageVersionFilePath(); string url = DownloadSystemTools.ToLocalUrl(filePath); var args = new DownloadDataRequestArgs(url, 60, 0); - _versionFileRequestOp = _backend.CreateTextRequest(args); - _versionFileRequestOp.SendRequest(); + _downloadTextRequest = _backend.CreateTextRequest(args); + _downloadTextRequest.SendRequest(); } - if (_versionFileRequestOp.IsDone == false) + if (_downloadTextRequest.IsDone == false) return; - if (_versionFileRequestOp.Status == EDownloadRequestStatus.Succeeded) + if (_downloadTextRequest.Status == EDownloadRequestStatus.Succeeded) { _steps = ESteps.Done; Status = EOperationStatus.Succeeded; - PackageVersion = _versionFileRequestOp.Result; + PackageVersion = _downloadTextRequest.Result; } else { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = _versionFileRequestOp.Error; + Error = _downloadTextRequest.Error; } } } private string GetBuildinYooRoot() { - return YooAssetSettingsData.GetYooDefaultBuildinRoot(); + return YooAssetSettingsData.GetYooDefaultBuiltinRoot(); } private string GetBuildinPackageVersionFilePath() { diff --git a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionOperation/GetCacheBundleSizeOperation.cs b/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionOperation/GetCacheBundleSizeOperation.cs index a835604c..3324167b 100644 --- a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionOperation/GetCacheBundleSizeOperation.cs +++ b/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionOperation/GetCacheBundleSizeOperation.cs @@ -62,6 +62,6 @@ public class GetCacheBundleSizeOperation : AsyncOperationBase { string rootDirectory = YooAssetSettingsData.GetYooDefaultCacheRoot(); string packageRoot = PathUtility.Combine(rootDirectory, _packageName); - return PathUtility.Combine(packageRoot, SandboxFileSystemDefine.BundleFilesFolderName); + return PathUtility.Combine(packageRoot, SandboxFileSystemConsts.BundleFilesFolderName); } } \ No newline at end of file diff --git a/Assets/YooAsset/Samples~/Mini Game/Runtime/GooglePlayFileSystem/Operation/GPFSLoadAssetBundleOperation.cs b/Assets/YooAsset/Samples~/Mini Game/Runtime/GooglePlayFileSystem/Operation/GPFSLoadAssetBundleOperation.cs index 78c9495f..7e7fe6e7 100644 --- a/Assets/YooAsset/Samples~/Mini Game/Runtime/GooglePlayFileSystem/Operation/GPFSLoadAssetBundleOperation.cs +++ b/Assets/YooAsset/Samples~/Mini Game/Runtime/GooglePlayFileSystem/Operation/GPFSLoadAssetBundleOperation.cs @@ -67,7 +67,7 @@ internal class GPFSLoadAssetBundleOperation : FSLoadBundleOperation { _steps = ESteps.Done; Status = EOperationStatus.Succeed; - Result = new AssetBundleResult(_fileSystem, _bundle, _bundleRequest.AssetBundle, null); + Result = new AssetBundleHandle(_fileSystem, _bundle, _bundleRequest.AssetBundle, null); } } } diff --git a/Assets/YooAsset/Samples~/Mini Game/Runtime/MiniGameTest/FileSystemTester.cs b/Assets/YooAsset/Samples~/Mini Game/Runtime/MiniGameTest/FileSystemTester.cs index a80db1d9..451e3689 100644 --- a/Assets/YooAsset/Samples~/Mini Game/Runtime/MiniGameTest/FileSystemTester.cs +++ b/Assets/YooAsset/Samples~/Mini Game/Runtime/MiniGameTest/FileSystemTester.cs @@ -1,4 +1,4 @@ -using System.Collections; +using System.Collections; using UnityEngine; namespace YooAsset @@ -22,8 +22,8 @@ namespace YooAsset // 请求资源版本 Debug.Log("请求资源版本信息!"); - var requestPackageVersionOptions = new RequestVersionOptions(true, 60); - var requestPackageVersionOp = fileSystem.RequestVersionAsync(requestPackageVersionOptions); + var requestPackageVersionOptions = new FSRequestPackageVersionOptions(true, 60); + var requestPackageVersionOp = fileSystem.RequestPackageVersionAsync(requestPackageVersionOptions); AsyncOperationSystem.StartOperation(packageName, requestPackageVersionOp); yield return requestPackageVersionOp; if (requestPackageVersionOp.Status != EOperationStatus.Succeeded) @@ -35,8 +35,8 @@ namespace YooAsset // 请求资源清单 string packageVersion = requestPackageVersionOp.PackageVersion; Debug.Log($"加载资源清单文件!{packageVersion}"); - var loadPackageManifestOptions = new LoadManifestOptions(packageVersion, 60); - var loadPackageManifestOp = fileSystem.LoadManifestAsync(loadPackageManifestOptions); + var loadPackageManifestOptions = new FSLoadPackageManifestOptions(packageVersion, 60); + var loadPackageManifestOp = fileSystem.LoadPackageManifestAsync(loadPackageManifestOptions); AsyncOperationSystem.StartOperation(packageName, loadPackageManifestOp); yield return loadPackageManifestOp; if (loadPackageManifestOp.Status != EOperationStatus.Succeeded) @@ -70,8 +70,8 @@ namespace YooAsset { var manifest = loadPackageManifestOp.Manifest; var packageBundle = GetPackageBundle(manifest, testLocation); - var loadBundleFileOptions = new FCLoadBundleOptions(packageBundle); - var loadBundleFileOp = fileSystem.LoadBundleAsync(loadBundleFileOptions); + var loadBundleFileOptions = new FSLoadPackageBundleOptions(packageBundle); + var loadBundleFileOp = fileSystem.LoadPackageBundleAsync(loadBundleFileOptions); AsyncOperationSystem.StartOperation(packageName, loadBundleFileOp); yield return loadBundleFileOp; if (loadBundleFileOp.Status != EOperationStatus.Succeeded) @@ -85,7 +85,7 @@ namespace YooAsset } // 卸载资源包 - loadBundleFileOp.Result.UnloadBundleFile(); + loadBundleFileOp.BundleHandle.UnloadBundleFile(); } Debug.Log("完整测试成功!"); diff --git a/Assets/YooAsset/Samples~/Space Shooter/GameScript/Runtime/PatchLogic/FsmNode/FsmInitializePackage.cs b/Assets/YooAsset/Samples~/Space Shooter/GameScript/Runtime/PatchLogic/FsmNode/FsmInitializePackage.cs index 57350d33..ce6affe8 100644 --- a/Assets/YooAsset/Samples~/Space Shooter/GameScript/Runtime/PatchLogic/FsmNode/FsmInitializePackage.cs +++ b/Assets/YooAsset/Samples~/Space Shooter/GameScript/Runtime/PatchLogic/FsmNode/FsmInitializePackage.cs @@ -44,9 +44,9 @@ internal class FsmInitializePackage : IStateNode var packageRoot = buildResult.PackageRootDirectory; var createParameters = new EditorSimulateModeParameters(); createParameters.EditorFileSystemParameters = FileSystemParameters.CreateDefaultEditorFileSystemParameters(packageRoot); - createParameters.EditorFileSystemParameters.AddParameter(FileSystemParametersDefine.VIRTUAL_WEBGL_MODE, true); - createParameters.EditorFileSystemParameters.AddParameter(FileSystemParametersDefine.VIRTUAL_DOWNLOAD_MODE, true); - createParameters.EditorFileSystemParameters.AddParameter(FileSystemParametersDefine.VIRTUAL_DOWNLOAD_SPEED, 1024 * 1000); + createParameters.EditorFileSystemParameters.AddParameter(FileSystemConsts.VIRTUAL_WEBGL_MODE, true); + createParameters.EditorFileSystemParameters.AddParameter(FileSystemConsts.VIRTUAL_DOWNLOAD_MODE, true); + createParameters.EditorFileSystemParameters.AddParameter(FileSystemConsts.VIRTUAL_DOWNLOAD_SPEED, 1024 * 1000); initializationOperation = package.InitializeAsync(createParameters); } @@ -54,7 +54,7 @@ internal class FsmInitializePackage : IStateNode if (playMode == EPlayMode.OfflinePlayMode) { var createParameters = new OfflinePlayModeParameters(); - createParameters.BuildinFileSystemParameters = FileSystemParameters.CreateDefaultBuildinFileSystemParameters(); + createParameters.BuildinFileSystemParameters = FileSystemParameters.CreateDefaultBuiltinFileSystemParameters(); initializationOperation = package.InitializeAsync(createParameters); } @@ -65,12 +65,12 @@ internal class FsmInitializePackage : IStateNode string fallbackHostServer = GetHostServerURL(); IRemoteServices remoteServices = new RemoteServices(defaultHostServer, fallbackHostServer); var createParameters = new HostPlayModeParameters(); - createParameters.BuildinFileSystemParameters = FileSystemParameters.CreateDefaultBuildinFileSystemParameters(); - createParameters.BuildinFileSystemParameters.AddParameter(FileSystemParametersDefine.COPY_BUILDIN_PACKAGE_MANIFEST, true); - createParameters.CacheFileSystemParameters = FileSystemParameters.CreateDefaultCacheFileSystemParameters(remoteServices); - createParameters.CacheFileSystemParameters.AddParameter(FileSystemParametersDefine.DOWNLOAD_MAX_CONCURRENCY, 5); - createParameters.CacheFileSystemParameters.AddParameter(FileSystemParametersDefine.DOWNLOAD_MAX_REQUEST_PER_FRAME, 1); - createParameters.CacheFileSystemParameters.AddParameter(FileSystemParametersDefine.DOWNLOAD_WATCH_DOG_TIME, 10); + createParameters.BuildinFileSystemParameters = FileSystemParameters.CreateDefaultBuiltinFileSystemParameters(); + createParameters.BuildinFileSystemParameters.AddParameter(FileSystemConsts.COPY_BUILTIN_PACKAGE_MANIFEST, true); + createParameters.CacheFileSystemParameters = FileSystemParameters.CreateDefaultSandboxFileSystemParameters(remoteServices); + createParameters.CacheFileSystemParameters.AddParameter(FileSystemConsts.DOWNLOAD_MAX_CONCURRENCY, 5); + createParameters.CacheFileSystemParameters.AddParameter(FileSystemConsts.DOWNLOAD_MAX_REQUEST_PER_FRAME, 1); + createParameters.CacheFileSystemParameters.AddParameter(FileSystemConsts.DOWNLOAD_WATCHDOG_TIMEOUT, 10); initializationOperation = package.InitializeAsync(createParameters); } @@ -149,13 +149,12 @@ internal class FsmInitializePackage : IStateNode _defaultHostServer = defaultHostServer; _fallbackHostServer = fallbackHostServer; } - string IRemoteServices.GetRemoteMainURL(string fileName) + public IReadOnlyList GetRemoteURLs(string fileName) { - return $"{_defaultHostServer}/{fileName}"; - } - string IRemoteServices.GetRemoteFallbackURL(string fileName) - { - return $"{_fallbackHostServer}/{fileName}"; + List result = new List(); + result.Add($"{_defaultHostServer}/{fileName}"); + result.Add($"{_fallbackHostServer}/{fileName}"); + return result; } } } \ No newline at end of file diff --git a/Assets/YooAsset/Samples~/Space Shooter/GameScript/Runtime/PatchLogic/FsmNode/FsmRequestPackageVersion.cs b/Assets/YooAsset/Samples~/Space Shooter/GameScript/Runtime/PatchLogic/FsmNode/FsmRequestPackageVersion.cs index af5e42d7..633aa4f8 100644 --- a/Assets/YooAsset/Samples~/Space Shooter/GameScript/Runtime/PatchLogic/FsmNode/FsmRequestPackageVersion.cs +++ b/Assets/YooAsset/Samples~/Space Shooter/GameScript/Runtime/PatchLogic/FsmNode/FsmRequestPackageVersion.cs @@ -28,7 +28,7 @@ internal class FsmRequestPackageVersion : IStateNode { var packageName = (string)_machine.GetBlackboardValue("PackageName"); var package = YooAssets.GetPackage(packageName); - var operation = package.RequestVersionAsync(); + var operation = package.RequestPackageVersionAsync(); yield return operation; if (operation.Status != EOperationStatus.Succeeded) diff --git a/Assets/YooAsset/Samples~/Test Sample/Runtime/T1_TestEditorFileSystem/T1_TestEditorFileSystem.cs b/Assets/YooAsset/Samples~/Test Sample/Runtime/T1_TestEditorFileSystem/T1_TestEditorFileSystem.cs index 18847372..27f7dd2e 100644 --- a/Assets/YooAsset/Samples~/Test Sample/Runtime/T1_TestEditorFileSystem/T1_TestEditorFileSystem.cs +++ b/Assets/YooAsset/Samples~/Test Sample/Runtime/T1_TestEditorFileSystem/T1_TestEditorFileSystem.cs @@ -68,15 +68,15 @@ public class T1_TestEditorFileSystem : IPrebuildSetup, IPostBuildCleanup Assert.AreEqual(EOperationStatus.Succeeded, initializeOp.Status); // 请求资源版本 - var requetVersionOp = package.RequestVersionAsync(); + var requetVersionOp = package.RequestPackageVersionAsync(); yield return requetVersionOp; if (requetVersionOp.Status != EOperationStatus.Succeeded) Debug.LogError(requetVersionOp.Error); Assert.AreEqual(EOperationStatus.Succeeded, requetVersionOp.Status); // 更新资源清单 - var loadPackageManifestOptions = new LoadManifestOptions(requetVersionOp.PackageVersion, 60); - var loadPackageManifestOp = package.LoadManifestAsync(loadPackageManifestOptions); + var loadPackageManifestOptions = new LoadPackageManifestOptions(requetVersionOp.PackageVersion, 60); + var loadPackageManifestOp = package.LoadPackageManifestAsync(loadPackageManifestOptions); yield return loadPackageManifestOp; if (loadPackageManifestOp.Status != EOperationStatus.Succeeded) Debug.LogError(loadPackageManifestOp.Error); @@ -104,15 +104,15 @@ public class T1_TestEditorFileSystem : IPrebuildSetup, IPostBuildCleanup Assert.AreEqual(EOperationStatus.Succeeded, initializeOp.Status); // 请求资源版本 - var requetVersionOp = package.RequestVersionAsync(); + var requetVersionOp = package.RequestPackageVersionAsync(); yield return requetVersionOp; if (requetVersionOp.Status != EOperationStatus.Succeeded) Debug.LogError(requetVersionOp.Error); Assert.AreEqual(EOperationStatus.Succeeded, requetVersionOp.Status); // 更新资源清单 - var loadPackageManifestOptions = new LoadManifestOptions(requetVersionOp.PackageVersion, 60); - var loadPackageManifestOp = package.LoadManifestAsync(loadPackageManifestOptions); + var loadPackageManifestOptions = new LoadPackageManifestOptions(requetVersionOp.PackageVersion, 60); + var loadPackageManifestOp = package.LoadPackageManifestAsync(loadPackageManifestOptions); yield return loadPackageManifestOp; if (loadPackageManifestOp.Status != EOperationStatus.Succeeded) Debug.LogError(loadPackageManifestOp.Error); diff --git a/Assets/YooAsset/Samples~/Test Sample/Runtime/T2_TestBuldinFileSystem/T2_TestBuldinFileSystem.cs b/Assets/YooAsset/Samples~/Test Sample/Runtime/T2_TestBuldinFileSystem/T2_TestBuldinFileSystem.cs index 89d2c52e..15088f6c 100644 --- a/Assets/YooAsset/Samples~/Test Sample/Runtime/T2_TestBuldinFileSystem/T2_TestBuldinFileSystem.cs +++ b/Assets/YooAsset/Samples~/Test Sample/Runtime/T2_TestBuldinFileSystem/T2_TestBuldinFileSystem.cs @@ -61,8 +61,8 @@ public class T2_TestBuldinFileSystem : IPrebuildSetup, IPostBuildCleanup // 初始化资源包 var initParams = new OfflinePlayModeOptions(); var manifestServices = new TestManifestDecryptor(); - initParams.BuildinFileSystemParameters = FileSystemParameters.CreateDefaultBuildinFileSystemParameters(packageRoot); - initParams.BuildinFileSystemParameters.AddParameter(FileSystemParametersDefine.MANIFEST_DECRYPTOR, manifestServices); + initParams.BuildinFileSystemParameters = FileSystemParameters.CreateDefaultBuiltinFileSystemParameters(packageRoot); + initParams.BuildinFileSystemParameters.AddParameter(FileSystemConsts.MANIFEST_DECRYPTOR, manifestServices); var initializeOp = package.InitializePackageAsync(initParams); yield return initializeOp; if (initializeOp.Status != EOperationStatus.Succeeded) @@ -70,15 +70,15 @@ public class T2_TestBuldinFileSystem : IPrebuildSetup, IPostBuildCleanup Assert.AreEqual(EOperationStatus.Succeeded, initializeOp.Status); // 请求资源版本 - var requetVersionOp = package.RequestVersionAsync(); + var requetVersionOp = package.RequestPackageVersionAsync(); yield return requetVersionOp; if (requetVersionOp.Status != EOperationStatus.Succeeded) Debug.LogError(requetVersionOp.Error); Assert.AreEqual(EOperationStatus.Succeeded, requetVersionOp.Status); // 更新资源清单 - var loadPackageManifestOptions = new LoadManifestOptions(requetVersionOp.PackageVersion, 60); - var loadPackageManifestOp = package.LoadManifestAsync(loadPackageManifestOptions); + var loadPackageManifestOptions = new LoadPackageManifestOptions(requetVersionOp.PackageVersion, 60); + var loadPackageManifestOp = package.LoadPackageManifestAsync(loadPackageManifestOptions); yield return loadPackageManifestOp; if (loadPackageManifestOp.Status != EOperationStatus.Succeeded) Debug.LogError(loadPackageManifestOp.Error); @@ -98,7 +98,7 @@ public class T2_TestBuldinFileSystem : IPrebuildSetup, IPostBuildCleanup // 初始化资源包 var initParams = new OfflinePlayModeOptions(); - initParams.BuildinFileSystemParameters = FileSystemParameters.CreateDefaultBuildinFileSystemParameters(packageRoot); + initParams.BuildinFileSystemParameters = FileSystemParameters.CreateDefaultBuiltinFileSystemParameters(packageRoot); var initializeOp = package.InitializePackageAsync(initParams); yield return initializeOp; if (initializeOp.Status != EOperationStatus.Succeeded) @@ -106,15 +106,15 @@ public class T2_TestBuldinFileSystem : IPrebuildSetup, IPostBuildCleanup Assert.AreEqual(EOperationStatus.Succeeded, initializeOp.Status); // 请求资源版本 - var requetVersionOp = package.RequestVersionAsync(); + var requetVersionOp = package.RequestPackageVersionAsync(); yield return requetVersionOp; if (requetVersionOp.Status != EOperationStatus.Succeeded) Debug.LogError(requetVersionOp.Error); Assert.AreEqual(EOperationStatus.Succeeded, requetVersionOp.Status); // 更新资源清单 - var loadPackageManifestOptions = new LoadManifestOptions(requetVersionOp.PackageVersion, 60); - var loadPackageManifestOp = package.LoadManifestAsync(loadPackageManifestOptions); + var loadPackageManifestOptions = new LoadPackageManifestOptions(requetVersionOp.PackageVersion, 60); + var loadPackageManifestOp = package.LoadPackageManifestAsync(loadPackageManifestOptions); yield return loadPackageManifestOp; if (loadPackageManifestOp.Status != EOperationStatus.Succeeded) Debug.LogError(loadPackageManifestOp.Error); diff --git a/Assets/YooAsset/Samples~/Test Sample/Runtime/T3_TestCacheFileSystem/T3_TestCacheFileSystem.cs b/Assets/YooAsset/Samples~/Test Sample/Runtime/T3_TestCacheFileSystem/T3_TestCacheFileSystem.cs index c5848f4c..50523fdf 100644 --- a/Assets/YooAsset/Samples~/Test Sample/Runtime/T3_TestCacheFileSystem/T3_TestCacheFileSystem.cs +++ b/Assets/YooAsset/Samples~/Test Sample/Runtime/T3_TestCacheFileSystem/T3_TestCacheFileSystem.cs @@ -8,6 +8,7 @@ using UnityEngine.U2D; using UnityEngine.TestTools; using NUnit.Framework; using YooAsset; +using System.Collections.Generic; public class T3_TestCacheFileSystem : IPrebuildSetup, IPostBuildCleanup { @@ -50,8 +51,8 @@ public class T3_TestCacheFileSystem : IPrebuildSetup, IPostBuildCleanup string hostServerIP = "http://127.0.0.1/CDN/Android/Test/"; var remoteServices = new TestRemoteServices(hostServerIP); initParams.BuildinFileSystemParameters = null; - initParams.CacheFileSystemParameters = FileSystemParameters.CreateDefaultCacheFileSystemParameters(remoteServices); - initParams.CacheFileSystemParameters.AddParameter(FileSystemParametersDefine.MANIFEST_DECRYPTOR, manifestServices); + initParams.CacheFileSystemParameters = FileSystemParameters.CreateDefaultSandboxFileSystemParameters(remoteServices); + initParams.CacheFileSystemParameters.AddParameter(FileSystemConsts.MANIFEST_DECRYPTOR, manifestServices); var initializeOp = package.InitializePackageAsync(initParams); yield return initializeOp; if (initializeOp.Status != EOperationStatus.Succeeded) @@ -59,15 +60,15 @@ public class T3_TestCacheFileSystem : IPrebuildSetup, IPostBuildCleanup Assert.AreEqual(EOperationStatus.Succeeded, initializeOp.Status); // 请求资源版本 - var requetVersionOp = package.RequestVersionAsync(); + var requetVersionOp = package.RequestPackageVersionAsync(); yield return requetVersionOp; if (requetVersionOp.Status != EOperationStatus.Succeeded) Debug.LogError(requetVersionOp.Error); Assert.AreEqual(EOperationStatus.Succeeded, requetVersionOp.Status); // 更新资源清单 - var loadPackageManifestOptions = new LoadManifestOptions(requetVersionOp.PackageVersion, 60); - var loadPackageManifestOp = package.LoadManifestAsync(loadPackageManifestOptions); + var loadPackageManifestOptions = new LoadPackageManifestOptions(requetVersionOp.PackageVersion, 60); + var loadPackageManifestOp = package.LoadPackageManifestAsync(loadPackageManifestOptions); yield return loadPackageManifestOp; if (loadPackageManifestOp.Status != EOperationStatus.Succeeded) Debug.LogError(loadPackageManifestOp.Error); @@ -82,13 +83,12 @@ public class T3_TestCacheFileSystem : IPrebuildSetup, IPostBuildCleanup { _localServerRoot = localServerRoot; } - string IRemoteServices.GetRemoteMainURL(string fileName) + + public IReadOnlyList GetRemoteURLs(string fileName) { - return $"{_localServerRoot}/{fileName}"; - } - string IRemoteServices.GetRemoteFallbackURL(string fileName) - { - return $"{_localServerRoot}/{fileName}"; + List urls = new List(); + urls.Add($"{_localServerRoot}/{fileName}"); + return urls; } }