From 4fc0d06908f7c077a525073e106fc97b7c14c48e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E5=86=A0=E5=B3=B0?= Date: Tue, 24 Dec 2024 18:45:37 +0800 Subject: [PATCH] update resource manager MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构运行时核心代码 --- .../YooAsset/Runtime/InitializeParameters.cs | 36 ----- .../Runtime/ResourceManager/Bundle.meta | 8 - .../ResourceManager/Bundle/RawBundle.cs | 36 ----- .../ResourceManager/Bundle/VirtualBundle.cs | 15 -- .../ResourceManager/Handle/RawFileHandle.cs | 6 +- .../ResourceManager/Handle/SceneHandle.cs | 18 +-- .../ResourceManager/Handle/SubAssetsHandle.cs | 10 +- .../Loader/LoadBundleFileOperation.cs | 17 +- .../Loader/LoadDependFileOperation.cs | 129 --------------- .../Operation/InstantiateOperation.cs | 2 +- .../Operation/UnloadSceneOperation.cs | 9 +- .../Operation/UnloadUnusedAssetsOperation.cs | 2 +- .../Provider/AllAssetsProvider.cs | 36 +++++ ...ider.cs.meta => AllAssetsProvider.cs.meta} | 2 +- .../ResourceManager/Provider/AssetProvider.cs | 36 +++++ .../AssetProvider.cs.meta} | 2 +- .../Provider/BundledAllAssetsProvider.cs | 123 --------------- .../Provider/BundledAssetProvider.cs | 123 --------------- .../Provider/BundledAssetProvider.cs.meta | 11 -- .../Provider/BundledRawFileProvider.cs | 53 ------- .../Provider/BundledRawFileProvider.cs.meta | 11 -- .../Provider/BundledSceneProvider.cs | 148 ------------------ .../Provider/BundledSceneProvider.cs.meta | 11 -- .../Provider/BundledSubAssetsProvider.cs | 123 --------------- .../Provider/BundledSubAssetsProvider.cs.meta | 11 -- .../Provider/CompletedProvider.cs | 13 +- .../Provider/DatabaseAllAssetsProvider.cs | 105 ------------- .../DatabaseAllAssetsProvider.cs.meta | 11 -- .../Provider/DatabaseAssetProvider.cs | 87 ---------- .../Provider/DatabaseAssetProvider.cs.meta | 11 -- .../Provider/DatabaseRawFileProvider.cs | 62 -------- .../Provider/DatabaseRawFileProvider.cs.meta | 11 -- .../Provider/DatabaseSceneProvider.cs | 139 ---------------- .../Provider/DatabaseSceneProvider.cs.meta | 11 -- .../Provider/DatabaseSubAssetsProvider.cs | 98 ------------ .../DatabaseSubAssetsProvider.cs.meta | 11 -- .../Provider/ProviderOperation.cs | 143 ++++++++++------- .../Provider/RawFileProvider.cs | 14 ++ .../RawFileProvider.cs.meta} | 2 +- .../ResourceManager/Provider/SceneProvider.cs | 69 ++++++++ .../SceneProvider.cs.meta} | 2 +- .../Provider/SubAssetsProvider.cs | 36 +++++ .../Provider/SubAssetsProvider.cs.meta | 11 ++ .../ResourceManager/ResourceManager.cs | 76 ++++----- .../Runtime/ResourcePackage/BundleInfo.cs | 17 +- .../ResourcePackage/EBuildBundleType.cs | 26 +++ .../ResourcePackage/EBuildBundleType.cs.meta | 11 ++ .../Runtime/ResourcePackage/ManifestTools.cs | 147 ++++++++++++++--- .../Internal/DeserializeManifestOperation.cs | 93 ++--------- .../Runtime/ResourcePackage/PackageAsset.cs | 6 + .../Runtime/ResourcePackage/PackageBundle.cs | 37 +++-- .../Runtime/ResourcePackage/PackageDetail.cs | 5 + .../ResourcePackage/PackageManifest.cs | 60 +++---- .../PlayMode/EditorSimulateBuildParam.cs | 8 + .../PlayMode/EditorSimulateModeImpl.cs | 1 - .../Runtime/Services/IDecryptionServices.cs | 24 ++- 56 files changed, 610 insertions(+), 1715 deletions(-) delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Bundle.meta delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Bundle/RawBundle.cs delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Bundle/VirtualBundle.cs delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Loader/LoadDependFileOperation.cs create mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/AllAssetsProvider.cs rename Assets/YooAsset/Runtime/ResourceManager/Provider/{BundledAllAssetsProvider.cs.meta => AllAssetsProvider.cs.meta} (83%) create mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/AssetProvider.cs rename Assets/YooAsset/Runtime/ResourceManager/{Bundle/VirtualBundle.cs.meta => Provider/AssetProvider.cs.meta} (83%) delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/BundledAllAssetsProvider.cs delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/BundledAssetProvider.cs delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/BundledAssetProvider.cs.meta delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/BundledRawFileProvider.cs delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/BundledRawFileProvider.cs.meta delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/BundledSceneProvider.cs delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/BundledSceneProvider.cs.meta delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/BundledSubAssetsProvider.cs delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/BundledSubAssetsProvider.cs.meta delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseAllAssetsProvider.cs delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseAllAssetsProvider.cs.meta delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseAssetProvider.cs delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseAssetProvider.cs.meta delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseRawFileProvider.cs delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseRawFileProvider.cs.meta delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseSceneProvider.cs delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseSceneProvider.cs.meta delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseSubAssetsProvider.cs delete mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseSubAssetsProvider.cs.meta create mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/RawFileProvider.cs rename Assets/YooAsset/Runtime/ResourceManager/{Bundle/RawBundle.cs.meta => Provider/RawFileProvider.cs.meta} (83%) create mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/SceneProvider.cs rename Assets/YooAsset/Runtime/ResourceManager/{Loader/LoadDependFileOperation.cs.meta => Provider/SceneProvider.cs.meta} (83%) create mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/SubAssetsProvider.cs create mode 100644 Assets/YooAsset/Runtime/ResourceManager/Provider/SubAssetsProvider.cs.meta create mode 100644 Assets/YooAsset/Runtime/ResourcePackage/EBuildBundleType.cs create mode 100644 Assets/YooAsset/Runtime/ResourcePackage/EBuildBundleType.cs.meta diff --git a/Assets/YooAsset/Runtime/InitializeParameters.cs b/Assets/YooAsset/Runtime/InitializeParameters.cs index 00b690e5..c56579f1 100644 --- a/Assets/YooAsset/Runtime/InitializeParameters.cs +++ b/Assets/YooAsset/Runtime/InitializeParameters.cs @@ -90,23 +90,6 @@ namespace YooAsset return fileSystemParams; } - /// - /// 创建默认的内置文件系统参数(原生文件) - /// - /// 加密文件解密服务类 - /// 缓存文件的校验等级 - /// 内置文件的根路径 - public static FileSystemParameters CreateDefaultBuildinRawFileSystemParameters(IDecryptionServices decryptionServices = null, EFileVerifyLevel verifyLevel = EFileVerifyLevel.Middle, string rootDirectory = null) - { - string fileSystemClass = typeof(DefaultBuildinFileSystem).FullName; - var fileSystemParams = new FileSystemParameters(fileSystemClass, rootDirectory); - fileSystemParams.AddParameter(FileSystemParametersDefine.DECRYPTION_SERVICES, decryptionServices); - fileSystemParams.AddParameter(FileSystemParametersDefine.FILE_VERIFY_LEVEL, verifyLevel); - fileSystemParams.AddParameter(FileSystemParametersDefine.APPEND_FILE_EXTENSION, true); - fileSystemParams.AddParameter(FileSystemParametersDefine.RAW_FILE_BUILD_PIPELINE, true); - return fileSystemParams; - } - /// /// 创建默认的缓存文件系统参数 /// @@ -124,25 +107,6 @@ namespace YooAsset return fileSystemParams; } - /// - /// 创建默认的缓存文件系统参数(原生文件) - /// - /// 远端资源地址查询服务类 - /// 加密文件解密服务类 - /// 缓存文件的校验等级 - /// 文件系统的根目录 - public static FileSystemParameters CreateDefaultCacheRawFileSystemParameters(IRemoteServices remoteServices, IDecryptionServices decryptionServices = null, EFileVerifyLevel verifyLevel = EFileVerifyLevel.Middle, string rootDirectory = null) - { - string fileSystemClass = typeof(DefaultCacheFileSystem).FullName; - var fileSystemParams = new FileSystemParameters(fileSystemClass, rootDirectory); - fileSystemParams.AddParameter(FileSystemParametersDefine.REMOTE_SERVICES, remoteServices); - fileSystemParams.AddParameter(FileSystemParametersDefine.DECRYPTION_SERVICES, decryptionServices); - fileSystemParams.AddParameter(FileSystemParametersDefine.FILE_VERIFY_LEVEL, verifyLevel); - fileSystemParams.AddParameter(FileSystemParametersDefine.APPEND_FILE_EXTENSION, true); - fileSystemParams.AddParameter(FileSystemParametersDefine.RAW_FILE_BUILD_PIPELINE, true); - return fileSystemParams; - } - /// /// 创建默认的WebServer文件系统参数 /// diff --git a/Assets/YooAsset/Runtime/ResourceManager/Bundle.meta b/Assets/YooAsset/Runtime/ResourceManager/Bundle.meta deleted file mode 100644 index 37e76299..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Bundle.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: a9ca0d0d29eb5294b9c6926c6a09e76b -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/ResourceManager/Bundle/RawBundle.cs b/Assets/YooAsset/Runtime/ResourceManager/Bundle/RawBundle.cs deleted file mode 100644 index 5fdfc5b7..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Bundle/RawBundle.cs +++ /dev/null @@ -1,36 +0,0 @@ - -namespace YooAsset -{ - internal class RawBundle - { - private readonly IFileSystem _fileSystem; - private readonly PackageBundle _packageBundle; - private readonly string _filePath; - - internal RawBundle(IFileSystem fileSystem, PackageBundle packageBundle, string filePath) - { - _fileSystem = fileSystem; - _packageBundle = packageBundle; - _filePath = filePath; - } - - public string GetFilePath() - { - return _filePath; - } - public byte[] ReadFileData() - { - if (_fileSystem != null) - return _fileSystem.ReadFileData(_packageBundle); - else - return FileUtility.ReadAllBytes(_filePath); - } - public string ReadFileText() - { - if (_fileSystem != null) - return _fileSystem.ReadFileText(_packageBundle); - else - return FileUtility.ReadAllText(_filePath); - } - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Bundle/VirtualBundle.cs b/Assets/YooAsset/Runtime/ResourceManager/Bundle/VirtualBundle.cs deleted file mode 100644 index 1c8ba367..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Bundle/VirtualBundle.cs +++ /dev/null @@ -1,15 +0,0 @@ - -namespace YooAsset -{ - internal class VirtualBundle - { - private readonly IFileSystem _fileSystem; - private readonly PackageBundle _packageBundle; - - internal VirtualBundle(IFileSystem fileSystem, PackageBundle packageBundle) - { - _fileSystem = fileSystem; - _packageBundle = packageBundle; - } - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Handle/RawFileHandle.cs b/Assets/YooAsset/Runtime/ResourceManager/Handle/RawFileHandle.cs index 19a73be8..6f04ba2c 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Handle/RawFileHandle.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Handle/RawFileHandle.cs @@ -72,7 +72,7 @@ namespace YooAsset { if (IsValidWithWarning == false) return null; - return Provider.RawBundleObject.ReadFileData(); + return Provider.BundleResultObject.ReadBundleFileData(); } /// @@ -82,7 +82,7 @@ namespace YooAsset { if (IsValidWithWarning == false) return null; - return Provider.RawBundleObject.ReadFileText(); + return Provider.BundleResultObject.ReadBundleFileText(); } /// @@ -92,7 +92,7 @@ namespace YooAsset { if (IsValidWithWarning == false) return string.Empty; - return Provider.RawBundleObject.GetFilePath(); + return Provider.BundleResultObject.GetBundleFilePath(); } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Handle/SceneHandle.cs b/Assets/YooAsset/Runtime/ResourceManager/Handle/SceneHandle.cs index 7b093aca..fd2727f0 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Handle/SceneHandle.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Handle/SceneHandle.cs @@ -100,14 +100,9 @@ namespace YooAsset if (IsValidWithWarning == false) return false; - if (Provider is DatabaseSceneProvider) + if (Provider is SceneProvider) { - var provider = Provider as DatabaseSceneProvider; - provider.UnSuspendLoad(); - } - else if (Provider is BundledSceneProvider) - { - var provider = Provider as BundledSceneProvider; + var provider = Provider as SceneProvider; provider.UnSuspendLoad(); } else @@ -125,14 +120,9 @@ namespace YooAsset if (IsValidWithWarning == false) return false; - if (Provider is DatabaseSceneProvider) + if (Provider is SceneProvider) { - var temp = Provider as DatabaseSceneProvider; - return temp.SceneMode == LoadSceneMode.Single; - } - else if (Provider is BundledSceneProvider) - { - var temp = Provider as BundledSceneProvider; + var temp = Provider as SceneProvider; return temp.SceneMode == LoadSceneMode.Single; } else diff --git a/Assets/YooAsset/Runtime/ResourceManager/Handle/SubAssetsHandle.cs b/Assets/YooAsset/Runtime/ResourceManager/Handle/SubAssetsHandle.cs index 175a9b58..1e73c8db 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Handle/SubAssetsHandle.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Handle/SubAssetsHandle.cs @@ -67,13 +67,13 @@ namespace YooAsset /// /// 子资源对象集合 /// - public IReadOnlyList AllAssetObjects + public IReadOnlyList SubAssetObjects { get { if (IsValidWithWarning == false) return null; - return Provider.AllAssetObjects; + return Provider.SubAssetObjects; } } @@ -87,7 +87,7 @@ namespace YooAsset if (IsValidWithWarning == false) return null; - foreach (var assetObject in Provider.AllAssetObjects) + foreach (var assetObject in Provider.SubAssetObjects) { if (assetObject.name == assetName && assetObject is TObject) return assetObject as TObject; @@ -106,8 +106,8 @@ namespace YooAsset if (IsValidWithWarning == false) return null; - List ret = new List(Provider.AllAssetObjects.Length); - foreach (var assetObject in Provider.AllAssetObjects) + List ret = new List(Provider.SubAssetObjects.Length); + foreach (var assetObject in Provider.SubAssetObjects) { var retObject = assetObject as TObject; if (retObject != null) diff --git a/Assets/YooAsset/Runtime/ResourceManager/Loader/LoadBundleFileOperation.cs b/Assets/YooAsset/Runtime/ResourceManager/Loader/LoadBundleFileOperation.cs index 520643f4..7d8ac92f 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Loader/LoadBundleFileOperation.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Loader/LoadBundleFileOperation.cs @@ -22,7 +22,7 @@ namespace YooAsset /// /// 资源包文件信息 /// - public BundleInfo BundleFileInfo { private set; get; } + public BundleInfo LoadBundleInfo { private set; get; } /// /// 是否已经销毁 @@ -47,13 +47,13 @@ namespace YooAsset /// /// 加载结果 /// - public object Result { set; get; } + public BundleResult Result { set; get; } internal LoadBundleFileOperation(ResourceManager resourceManager, BundleInfo bundleInfo) { _resourceManager = resourceManager; - BundleFileInfo = bundleInfo; + LoadBundleInfo = bundleInfo; } internal override void InternalOnStart() { @@ -67,7 +67,7 @@ namespace YooAsset if (_steps == ESteps.LoadFile) { if (_loadBundleOp == null) - _loadBundleOp = BundleFileInfo.LoadBundleFile(); + _loadBundleOp = LoadBundleInfo.LoadBundleFile(); if (IsWaitForAsyncComplete) _loadBundleOp.WaitForAsyncComplete(); @@ -83,7 +83,7 @@ namespace YooAsset { _steps = ESteps.Done; Status = EOperationStatus.Failed; - Error = $"The bundle loader result is null ! {BundleFileInfo.Bundle.BundleName}"; + Error = $"The bundle loader result is null ! {LoadBundleInfo.Bundle.BundleName}"; } else { @@ -137,11 +137,12 @@ namespace YooAsset // Check fatal if (RefCount > 0) - throw new Exception($"Bundle file loader ref is not zero : {BundleFileInfo.Bundle.BundleName}"); + throw new Exception($"Bundle file loader ref is not zero : {LoadBundleInfo.Bundle.BundleName}"); if (IsDone == false) - throw new Exception($"Bundle file loader is not done : {BundleFileInfo.Bundle.BundleName}"); + throw new Exception($"Bundle file loader is not done : {LoadBundleInfo.Bundle.BundleName}"); - BundleFileInfo.UnloadBundleFile(Result); + if (Result != null) + Result.UnloadBundleFile(); } /// diff --git a/Assets/YooAsset/Runtime/ResourceManager/Loader/LoadDependFileOperation.cs b/Assets/YooAsset/Runtime/ResourceManager/Loader/LoadDependFileOperation.cs deleted file mode 100644 index df718c63..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Loader/LoadDependFileOperation.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; - -namespace YooAsset -{ - internal class LoadDependBundleFileOperation : AsyncOperationBase - { - private enum ESteps - { - None, - CheckDepend, - CheckResult, - Done, - } - - /// - /// 依赖的资源包加载器列表 - /// - internal readonly List Depends; - private ESteps _steps = ESteps.None; - - - internal LoadDependBundleFileOperation(List dpends) - { - Depends = dpends; - } - internal override void InternalOnStart() - { - _steps = ESteps.CheckDepend; - } - internal override void InternalOnUpdate() - { - if (_steps == ESteps.None || _steps == ESteps.Done) - return; - - if (_steps == ESteps.CheckDepend) - { - if (IsWaitForAsyncComplete) - { - foreach (var loader in Depends) - { - loader.WaitForAsyncComplete(); - } - } - - foreach (var loader in Depends) - { - if (loader.IsDone == false) - return; - } - _steps = ESteps.CheckResult; - } - - if (_steps == ESteps.CheckResult) - { - LoadBundleFileOperation failedLoader = null; - foreach (var loader in Depends) - { - if (loader.Status != EOperationStatus.Succeed) - { - failedLoader = loader; - break; - } - } - - if (failedLoader == null) - { - _steps = ESteps.Done; - Status = EOperationStatus.Succeed; - } - else - { - _steps = ESteps.Done; - Status = EOperationStatus.Failed; - Error = failedLoader.Error; - } - } - } - internal override void InternalWaitForAsyncComplete() - { - while (true) - { - if (ExecuteWhileDone()) - { - _steps = ESteps.Done; - break; - } - } - } - - /// - /// 增加引用计数 - /// - public void Reference() - { - foreach (var loader in Depends) - { - loader.Reference(); - } - } - - /// - /// 减少引用计数 - /// - public void Release() - { - foreach (var loader in Depends) - { - loader.Release(); - } - } - - /// - /// 获取资源包的调试信息列表 - /// - internal void GetBundleDebugInfos(List output) - { - foreach (var loader in Depends) - { - var bundleInfo = new DebugBundleInfo(); - bundleInfo.BundleName = loader.BundleFileInfo.Bundle.BundleName; - bundleInfo.RefCount = loader.RefCount; - bundleInfo.Status = loader.Status; - output.Add(bundleInfo); - } - } - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Operation/InstantiateOperation.cs b/Assets/YooAsset/Runtime/ResourceManager/Operation/InstantiateOperation.cs index 330a82b2..f0e0bad7 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Operation/InstantiateOperation.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Operation/InstantiateOperation.cs @@ -74,7 +74,7 @@ namespace YooAsset } #if UNITY_2023_3_OR_NEWER - //TODO + //TODO : 官方BUG // BUG环境:Windows平台,Unity2022.3.41f1版本,编辑器模式。 // BUG描述:异步实例化Prefab预制体,有概率丢失Mono脚本里序列化的数组里某个成员! //_steps = ESteps.CloneAsync; diff --git a/Assets/YooAsset/Runtime/ResourceManager/Operation/UnloadSceneOperation.cs b/Assets/YooAsset/Runtime/ResourceManager/Operation/UnloadSceneOperation.cs index a815cf2d..8ed2d799 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Operation/UnloadSceneOperation.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Operation/UnloadSceneOperation.cs @@ -32,14 +32,9 @@ namespace YooAsset _provider = provider; // 注意:卸载场景前必须先解除挂起操作 - if (provider is DatabaseSceneProvider) + if (provider is SceneProvider) { - var temp = provider as DatabaseSceneProvider; - temp.UnSuspendLoad(); - } - else if (provider is BundledSceneProvider) - { - var temp = provider as BundledSceneProvider; + var temp = provider as SceneProvider; temp.UnSuspendLoad(); } else diff --git a/Assets/YooAsset/Runtime/ResourceManager/Operation/UnloadUnusedAssetsOperation.cs b/Assets/YooAsset/Runtime/ResourceManager/Operation/UnloadUnusedAssetsOperation.cs index a3248bb6..7ac87835 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Operation/UnloadUnusedAssetsOperation.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Operation/UnloadUnusedAssetsOperation.cs @@ -52,7 +52,7 @@ namespace YooAsset // 销毁文件加载器 foreach (var loader in removeList) { - string bundleName = loader.BundleFileInfo.Bundle.BundleName; + string bundleName = loader.LoadBundleInfo.Bundle.BundleName; loader.DestroyLoader(); _resManager._loaderDic.Remove(bundleName); } diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/AllAssetsProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Provider/AllAssetsProvider.cs new file mode 100644 index 00000000..5c4a7ba0 --- /dev/null +++ b/Assets/YooAsset/Runtime/ResourceManager/Provider/AllAssetsProvider.cs @@ -0,0 +1,36 @@ + +namespace YooAsset +{ + internal sealed class AllAssetsProvider : ProviderOperation + { + private FSLoadAllAssetsOperation _loadAllAssetsOp; + + public AllAssetsProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo) : base(manager, providerGUID, assetInfo) + { + } + protected override void ProcessBundleResult() + { + if (_loadAllAssetsOp == null) + { + _loadAllAssetsOp = BundleResultObject.LoadAllAssetsAsync(MainAssetInfo); + } + + if (IsWaitForAsyncComplete) + _loadAllAssetsOp.WaitForAsyncComplete(); + + Progress = _loadAllAssetsOp.Progress; + if (_loadAllAssetsOp.IsDone == false) + return; + + if (_loadAllAssetsOp.Status != EOperationStatus.Succeed) + { + InvokeCompletion(_loadAllAssetsOp.Error, EOperationStatus.Failed); + } + else + { + AllAssetObjects = _loadAllAssetsOp.Result; + InvokeCompletion(string.Empty, EOperationStatus.Succeed); + } + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledAllAssetsProvider.cs.meta b/Assets/YooAsset/Runtime/ResourceManager/Provider/AllAssetsProvider.cs.meta similarity index 83% rename from Assets/YooAsset/Runtime/ResourceManager/Provider/BundledAllAssetsProvider.cs.meta rename to Assets/YooAsset/Runtime/ResourceManager/Provider/AllAssetsProvider.cs.meta index ae86b337..8697f932 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledAllAssetsProvider.cs.meta +++ b/Assets/YooAsset/Runtime/ResourceManager/Provider/AllAssetsProvider.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 9b0e966838827284a9266a9f2237a460 +guid: 33f2d909fd8d9ab4eaedcded2519d1d8 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/AssetProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Provider/AssetProvider.cs new file mode 100644 index 00000000..847c7470 --- /dev/null +++ b/Assets/YooAsset/Runtime/ResourceManager/Provider/AssetProvider.cs @@ -0,0 +1,36 @@ + +namespace YooAsset +{ + internal sealed class AssetProvider : ProviderOperation + { + private FSLoadAssetOperation _loadAssetOp; + + public AssetProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo) : base(manager, providerGUID, assetInfo) + { + } + protected override void ProcessBundleResult() + { + if (_loadAssetOp == null) + { + _loadAssetOp = BundleResultObject.LoadAssetAsync(MainAssetInfo); + } + + if (IsWaitForAsyncComplete) + _loadAssetOp.WaitForAsyncComplete(); + + Progress = _loadAssetOp.Progress; + if (_loadAssetOp.IsDone == false) + return; + + if (_loadAssetOp.Status != EOperationStatus.Succeed) + { + InvokeCompletion(_loadAssetOp.Error, EOperationStatus.Failed); + } + else + { + AssetObject = _loadAssetOp.Result; + InvokeCompletion(string.Empty, EOperationStatus.Succeed); + } + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Bundle/VirtualBundle.cs.meta b/Assets/YooAsset/Runtime/ResourceManager/Provider/AssetProvider.cs.meta similarity index 83% rename from Assets/YooAsset/Runtime/ResourceManager/Bundle/VirtualBundle.cs.meta rename to Assets/YooAsset/Runtime/ResourceManager/Provider/AssetProvider.cs.meta index 775e6565..975e91c0 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Bundle/VirtualBundle.cs.meta +++ b/Assets/YooAsset/Runtime/ResourceManager/Provider/AssetProvider.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 822bb85f05144d842977dda341174db2 +guid: e6adffc18dc473141ad72e0f5da5dada MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledAllAssetsProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledAllAssetsProvider.cs deleted file mode 100644 index 65299ea6..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledAllAssetsProvider.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -namespace YooAsset -{ - internal sealed class BundledAllAssetsProvider : ProviderOperation - { - private AssetBundle _assetBundle; - private AssetBundleRequest _cacheRequest; - - public BundledAllAssetsProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo) : base(manager, providerGUID, assetInfo) - { - } - internal override void InternalOnStart() - { - DebugBeginRecording(); - } - internal override void InternalOnUpdate() - { - if (IsDone) - return; - - if (_steps == ESteps.None) - { - _steps = ESteps.CheckBundle; - } - - // 1. 检测资源包 - if (_steps == ESteps.CheckBundle) - { - if (LoadDependBundleFileOp.IsDone == false) - return; - if (LoadBundleFileOp.IsDone == false) - return; - - if (LoadDependBundleFileOp.Status != EOperationStatus.Succeed) - { - InvokeCompletion(LoadDependBundleFileOp.Error, EOperationStatus.Failed); - return; - } - - if (LoadBundleFileOp.Status != EOperationStatus.Succeed) - { - InvokeCompletion(LoadBundleFileOp.Error, EOperationStatus.Failed); - return; - } - - if (LoadBundleFileOp.Result == null) - { - ProcessFatalEvent(); - return; - } - - if (LoadBundleFileOp.Result is AssetBundle == false) - { - string error = "Try load raw file using load assetbundle method !"; - InvokeCompletion(error, EOperationStatus.Failed); - return; - } - - _assetBundle = LoadBundleFileOp.Result as AssetBundle; - _steps = ESteps.Loading; - } - - // 2. 加载资源对象 - if (_steps == ESteps.Loading) - { - if (IsWaitForAsyncComplete) - { - if (MainAssetInfo.AssetType == null) - AllAssetObjects = _assetBundle.LoadAllAssets(); - else - AllAssetObjects = _assetBundle.LoadAllAssets(MainAssetInfo.AssetType); - } - else - { - if (MainAssetInfo.AssetType == null) - _cacheRequest = _assetBundle.LoadAllAssetsAsync(); - else - _cacheRequest = _assetBundle.LoadAllAssetsAsync(MainAssetInfo.AssetType); - } - _steps = ESteps.Checking; - } - - // 3. 检测加载结果 - if (_steps == ESteps.Checking) - { - if (_cacheRequest != null) - { - if (IsWaitForAsyncComplete) - { - // 强制挂起主线程(注意:该操作会很耗时) - YooLogger.Warning("Suspend the main thread to load unity asset."); - AllAssetObjects = _cacheRequest.allAssets; - } - else - { - Progress = _cacheRequest.progress; - if (_cacheRequest.isDone == false) - return; - AllAssetObjects = _cacheRequest.allAssets; - } - } - - if (AllAssetObjects == null) - { - string error; - if (MainAssetInfo.AssetType == null) - error = $"Failed to load all assets : {MainAssetInfo.AssetPath} AssetType : null AssetBundle : {LoadBundleFileOp.BundleFileInfo.Bundle.BundleName}"; - else - error = $"Failed to load all assets : {MainAssetInfo.AssetPath} AssetType : {MainAssetInfo.AssetType} AssetBundle : {LoadBundleFileOp.BundleFileInfo.Bundle.BundleName}"; - YooLogger.Error(error); - InvokeCompletion(error, EOperationStatus.Failed); - } - else - { - InvokeCompletion(string.Empty, EOperationStatus.Succeed); - } - } - } - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledAssetProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledAssetProvider.cs deleted file mode 100644 index 4937f6af..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledAssetProvider.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -namespace YooAsset -{ - internal sealed class BundledAssetProvider : ProviderOperation - { - private AssetBundle _assetBundle; - private AssetBundleRequest _cacheRequest; - - public BundledAssetProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo) : base(manager, providerGUID, assetInfo) - { - } - internal override void InternalOnStart() - { - DebugBeginRecording(); - } - internal override void InternalOnUpdate() - { - if (IsDone) - return; - - if (_steps == ESteps.None) - { - _steps = ESteps.CheckBundle; - } - - // 1. 检测资源包 - if (_steps == ESteps.CheckBundle) - { - if (LoadDependBundleFileOp.IsDone == false) - return; - if (LoadBundleFileOp.IsDone == false) - return; - - if (LoadDependBundleFileOp.Status != EOperationStatus.Succeed) - { - InvokeCompletion(LoadDependBundleFileOp.Error, EOperationStatus.Failed); - return; - } - - if (LoadBundleFileOp.Status != EOperationStatus.Succeed) - { - InvokeCompletion(LoadBundleFileOp.Error, EOperationStatus.Failed); - return; - } - - if (LoadBundleFileOp.Result == null) - { - ProcessFatalEvent(); - return; - } - - if (LoadBundleFileOp.Result is AssetBundle == false) - { - string error = "Try load raw file using load assetbundle method !"; - InvokeCompletion(error, EOperationStatus.Failed); - return; - } - - _assetBundle = LoadBundleFileOp.Result as AssetBundle; - _steps = ESteps.Loading; - } - - // 2. 加载资源对象 - if (_steps == ESteps.Loading) - { - if (IsWaitForAsyncComplete) - { - if (MainAssetInfo.AssetType == null) - AssetObject = _assetBundle.LoadAsset(MainAssetInfo.AssetPath); - else - AssetObject = _assetBundle.LoadAsset(MainAssetInfo.AssetPath, MainAssetInfo.AssetType); - } - else - { - if (MainAssetInfo.AssetType == null) - _cacheRequest = _assetBundle.LoadAssetAsync(MainAssetInfo.AssetPath); - else - _cacheRequest = _assetBundle.LoadAssetAsync(MainAssetInfo.AssetPath, MainAssetInfo.AssetType); - } - _steps = ESteps.Checking; - } - - // 3. 检测加载结果 - if (_steps == ESteps.Checking) - { - if (_cacheRequest != null) - { - if (IsWaitForAsyncComplete) - { - // 强制挂起主线程(注意:该操作会很耗时) - YooLogger.Warning("Suspend the main thread to load unity asset."); - AssetObject = _cacheRequest.asset; - } - else - { - Progress = _cacheRequest.progress; - if (_cacheRequest.isDone == false) - return; - AssetObject = _cacheRequest.asset; - } - } - - if (AssetObject == null) - { - string error; - if (MainAssetInfo.AssetType == null) - error = $"Failed to load asset : {MainAssetInfo.AssetPath} AssetType : null AssetBundle : {LoadBundleFileOp.BundleFileInfo.Bundle.BundleName}"; - else - error = $"Failed to load asset : {MainAssetInfo.AssetPath} AssetType : {MainAssetInfo.AssetType} AssetBundle : {LoadBundleFileOp.BundleFileInfo.Bundle.BundleName}"; - YooLogger.Error(error); - InvokeCompletion(error, EOperationStatus.Failed); - } - else - { - InvokeCompletion(string.Empty, EOperationStatus.Succeed); - } - } - } - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledAssetProvider.cs.meta b/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledAssetProvider.cs.meta deleted file mode 100644 index 3e28b3f1..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledAssetProvider.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ca5e4bf0c3efe6742bb57b494487be52 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledRawFileProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledRawFileProvider.cs deleted file mode 100644 index a64acbf9..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledRawFileProvider.cs +++ /dev/null @@ -1,53 +0,0 @@ - -namespace YooAsset -{ - internal class BundledRawFileProvider : ProviderOperation - { - public BundledRawFileProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo) : base(manager, providerGUID, assetInfo) - { - } - internal override void InternalOnStart() - { - DebugBeginRecording(); - } - internal override void InternalOnUpdate() - { - if (IsDone) - return; - - if (_steps == ESteps.None) - { - _steps = ESteps.CheckBundle; - } - - // 1. 检测资源包 - if (_steps == ESteps.CheckBundle) - { - if (LoadBundleFileOp.IsDone == false) - return; - - if (LoadBundleFileOp.Status != EOperationStatus.Succeed) - { - InvokeCompletion(LoadBundleFileOp.Error, EOperationStatus.Failed); - return; - } - - if (LoadBundleFileOp.Result is RawBundle == false) - { - string error = "Try load AssetBundle file using load raw file method !"; - InvokeCompletion(error, EOperationStatus.Failed); - return; - } - - _steps = ESteps.Checking; - } - - // 2. 检测加载结果 - if (_steps == ESteps.Checking) - { - RawBundleObject = LoadBundleFileOp.Result as RawBundle; - InvokeCompletion(string.Empty, EOperationStatus.Succeed); - } - } - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledRawFileProvider.cs.meta b/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledRawFileProvider.cs.meta deleted file mode 100644 index 58ba438d..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledRawFileProvider.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8a00889582fd95446b103af1074fa6ba -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledSceneProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledSceneProvider.cs deleted file mode 100644 index ff156aef..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledSceneProvider.cs +++ /dev/null @@ -1,148 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using System.IO; -using UnityEngine; -using UnityEngine.SceneManagement; - -namespace YooAsset -{ - internal sealed class BundledSceneProvider : ProviderOperation - { - public readonly LoadSceneParameters LoadSceneParams; - private AsyncOperation _asyncOperation; - private bool _suspendLoadMode; - - /// - /// 场景加载模式 - /// - public LoadSceneMode SceneMode - { - get - { - return LoadSceneParams.loadSceneMode; - } - } - - public BundledSceneProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo, LoadSceneParameters loadSceneParams, bool suspendLoad) : base(manager, providerGUID, assetInfo) - { - LoadSceneParams = loadSceneParams; - SceneName = Path.GetFileNameWithoutExtension(assetInfo.AssetPath); - _suspendLoadMode = suspendLoad; - } - internal override void InternalOnStart() - { - DebugBeginRecording(); - } - internal override void InternalOnUpdate() - { - if (IsDone) - return; - - if (_steps == ESteps.None) - { - _steps = ESteps.CheckBundle; - } - - // 1. 检测资源包 - if (_steps == ESteps.CheckBundle) - { - if (LoadDependBundleFileOp.IsDone == false) - return; - if (LoadBundleFileOp.IsDone == false) - return; - - if (LoadDependBundleFileOp.Status != EOperationStatus.Succeed) - { - InvokeCompletion(LoadDependBundleFileOp.Error, EOperationStatus.Failed); - return; - } - - if (LoadBundleFileOp.Status != EOperationStatus.Succeed) - { - InvokeCompletion(LoadBundleFileOp.Error, EOperationStatus.Failed); - return; - } - - _steps = ESteps.Loading; - } - - // 2. 加载场景 - if (_steps == ESteps.Loading) - { - if (IsWaitForAsyncComplete) - { - // 注意:场景同步加载方法不会立即加载场景,而是在下一帧加载。 - SceneObject = SceneManager.LoadScene(MainAssetInfo.AssetPath, LoadSceneParams); - _steps = ESteps.Checking; - } - else - { - // 注意:如果场景不存在异步加载方法返回NULL - // 注意:即使是异步加载也要在当帧获取到场景对象 - _asyncOperation = SceneManager.LoadSceneAsync(MainAssetInfo.AssetPath, LoadSceneParams); - if (_asyncOperation != null) - { - _asyncOperation.allowSceneActivation = !_suspendLoadMode; - _asyncOperation.priority = 100; - SceneObject = SceneManager.GetSceneAt(SceneManager.sceneCount - 1); - _steps = ESteps.Checking; - } - else - { - string error = $"Failed to load scene : {MainAssetInfo.AssetPath}"; - YooLogger.Error(error); - InvokeCompletion(error, EOperationStatus.Failed); - } - } - } - - // 3. 检测加载结果 - if (_steps == ESteps.Checking) - { - if (_asyncOperation != null) - { - if (IsWaitForAsyncComplete) - { - // 场景加载无法强制异步转同步 - YooLogger.Error("The scene is loading asyn !"); - } - else - { - // 注意:在业务层中途可以取消挂起 - if (_asyncOperation.allowSceneActivation == false) - { - if (_suspendLoadMode == false) - _asyncOperation.allowSceneActivation = true; - } - - Progress = _asyncOperation.progress; - if (_asyncOperation.isDone == false) - return; - } - } - - if (SceneObject.IsValid()) - { - InvokeCompletion(string.Empty, EOperationStatus.Succeed); - } - else - { - string error = $"The loaded scene is invalid : {MainAssetInfo.AssetPath}"; - YooLogger.Error(error); - InvokeCompletion(error, EOperationStatus.Failed); - } - } - } - - /// - /// 解除场景加载挂起操作 - /// - public void UnSuspendLoad() - { - if (IsDone == false) - { - _suspendLoadMode = false; - } - } - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledSceneProvider.cs.meta b/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledSceneProvider.cs.meta deleted file mode 100644 index b857bef5..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledSceneProvider.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 38b1b77cff590ca4e808c5068c9bf88b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledSubAssetsProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledSubAssetsProvider.cs deleted file mode 100644 index ad74dcda..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledSubAssetsProvider.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -namespace YooAsset -{ - internal sealed class BundledSubAssetsProvider : ProviderOperation - { - private AssetBundle _assetBundle; - private AssetBundleRequest _cacheRequest; - - public BundledSubAssetsProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo) : base(manager, providerGUID, assetInfo) - { - } - internal override void InternalOnStart() - { - DebugBeginRecording(); - } - internal override void InternalOnUpdate() - { - if (IsDone) - return; - - if (_steps == ESteps.None) - { - _steps = ESteps.CheckBundle; - } - - // 1. 检测资源包 - if (_steps == ESteps.CheckBundle) - { - if (LoadDependBundleFileOp.IsDone == false) - return; - if (LoadBundleFileOp.IsDone == false) - return; - - if (LoadDependBundleFileOp.Status != EOperationStatus.Succeed) - { - InvokeCompletion(LoadDependBundleFileOp.Error, EOperationStatus.Failed); - return; - } - - if (LoadBundleFileOp.Status != EOperationStatus.Succeed) - { - InvokeCompletion(LoadBundleFileOp.Error, EOperationStatus.Failed); - return; - } - - if (LoadBundleFileOp.Result == null) - { - ProcessFatalEvent(); - return; - } - - if (LoadBundleFileOp.Result is AssetBundle == false) - { - string error = "Try load raw file using load assetbundle method !"; - InvokeCompletion(error, EOperationStatus.Failed); - return; - } - - _assetBundle = LoadBundleFileOp.Result as AssetBundle; - _steps = ESteps.Loading; - } - - // 2. 加载资源对象 - if (_steps == ESteps.Loading) - { - if (IsWaitForAsyncComplete) - { - if (MainAssetInfo.AssetType == null) - AllAssetObjects = _assetBundle.LoadAssetWithSubAssets(MainAssetInfo.AssetPath); - else - AllAssetObjects = _assetBundle.LoadAssetWithSubAssets(MainAssetInfo.AssetPath, MainAssetInfo.AssetType); - } - else - { - if (MainAssetInfo.AssetType == null) - _cacheRequest = _assetBundle.LoadAssetWithSubAssetsAsync(MainAssetInfo.AssetPath); - else - _cacheRequest = _assetBundle.LoadAssetWithSubAssetsAsync(MainAssetInfo.AssetPath, MainAssetInfo.AssetType); - } - _steps = ESteps.Checking; - } - - // 3. 检测加载结果 - if (_steps == ESteps.Checking) - { - if (_cacheRequest != null) - { - if (IsWaitForAsyncComplete) - { - // 强制挂起主线程(注意:该操作会很耗时) - YooLogger.Warning("Suspend the main thread to load unity asset."); - AllAssetObjects = _cacheRequest.allAssets; - } - else - { - Progress = _cacheRequest.progress; - if (_cacheRequest.isDone == false) - return; - AllAssetObjects = _cacheRequest.allAssets; - } - } - - if (AllAssetObjects == null) - { - string error; - if (MainAssetInfo.AssetType == null) - error = $"Failed to load sub assets : {MainAssetInfo.AssetPath} AssetType : null AssetBundle : {LoadBundleFileOp.BundleFileInfo.Bundle.BundleName}"; - else - error = $"Failed to load sub assets : {MainAssetInfo.AssetPath} AssetType : {MainAssetInfo.AssetType} AssetBundle : {LoadBundleFileOp.BundleFileInfo.Bundle.BundleName}"; - YooLogger.Error(error); - InvokeCompletion(error, EOperationStatus.Failed); - } - else - { - InvokeCompletion(string.Empty, EOperationStatus.Succeed); - } - } - } - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledSubAssetsProvider.cs.meta b/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledSubAssetsProvider.cs.meta deleted file mode 100644 index 36e1c3d4..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledSubAssetsProvider.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b3763bf52bde23b41a756f0d015cb30d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/CompletedProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Provider/CompletedProvider.cs index 665426c5..5a81585e 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/CompletedProvider.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Provider/CompletedProvider.cs @@ -6,20 +6,13 @@ namespace YooAsset public CompletedProvider(ResourceManager manager, AssetInfo assetInfo) : base(manager, string.Empty, assetInfo) { } - - internal override void InternalOnStart() - { - } - internal override void InternalOnUpdate() + protected override void ProcessBundleResult() { } - public void SetCompleted(string error) + public void SetCompletedWithError(string error) { - if (_steps == ESteps.None) - { - InvokeCompletion(error, EOperationStatus.Failed); - } + InvokeCompletion(error, EOperationStatus.Failed); } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseAllAssetsProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseAllAssetsProvider.cs deleted file mode 100644 index 1c656083..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseAllAssetsProvider.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -namespace YooAsset -{ - internal sealed class DatabaseAllAssetsProvider : ProviderOperation - { - public DatabaseAllAssetsProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo) : base(manager, providerGUID, assetInfo) - { - } - internal override void InternalOnStart() - { - DebugBeginRecording(); - } - internal override void InternalOnUpdate() - { -#if UNITY_EDITOR - if (IsDone) - return; - - if (_steps == ESteps.None) - { - // 检测资源文件是否存在 - string guid = UnityEditor.AssetDatabase.AssetPathToGUID(MainAssetInfo.AssetPath); - if (string.IsNullOrEmpty(guid)) - { - string error = $"Not found asset : {MainAssetInfo.AssetPath}"; - YooLogger.Error(error); - InvokeCompletion(error, EOperationStatus.Failed); - return; - } - - _steps = ESteps.CheckBundle; - - // 注意:模拟异步加载效果提前返回 - if (IsWaitForAsyncComplete == false) - return; - } - - // 1. 检测资源包 - if (_steps == ESteps.CheckBundle) - { - if (LoadBundleFileOp.IsDone == false) - return; - - if (LoadBundleFileOp.Status != EOperationStatus.Succeed) - { - InvokeCompletion(LoadBundleFileOp.Error, EOperationStatus.Failed); - return; - } - - _steps = ESteps.Loading; - } - - // 2. 加载资源对象 - if (_steps == ESteps.Loading) - { - if (MainAssetInfo.AssetType == null) - { - List result = new List(); - foreach (var assetPath in LoadBundleFileOp.BundleFileInfo.IncludeAssetsInEditor) - { - UnityEngine.Object mainAsset = UnityEditor.AssetDatabase.LoadMainAssetAtPath(assetPath); - if (mainAsset != null) - result.Add(mainAsset); - } - AllAssetObjects = result.ToArray(); - } - else - { - List result = new List(); - foreach (var assetPath in LoadBundleFileOp.BundleFileInfo.IncludeAssetsInEditor) - { - UnityEngine.Object mainAsset = UnityEditor.AssetDatabase.LoadAssetAtPath(assetPath, MainAssetInfo.AssetType); - if (mainAsset != null) - result.Add(mainAsset); - } - AllAssetObjects = result.ToArray(); - } - _steps = ESteps.Checking; - } - - // 3. 检测加载结果 - if (_steps == ESteps.Checking) - { - if (AllAssetObjects == null) - { - string error; - if (MainAssetInfo.AssetType == null) - error = $"Failed to load all assets : {MainAssetInfo.AssetPath} AssetType : null"; - else - error = $"Failed to load all assets : {MainAssetInfo.AssetPath} AssetType : {MainAssetInfo.AssetType}"; - YooLogger.Error(error); - InvokeCompletion(error, EOperationStatus.Failed); - } - else - { - InvokeCompletion(string.Empty, EOperationStatus.Succeed); - } - } -#endif - } - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseAllAssetsProvider.cs.meta b/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseAllAssetsProvider.cs.meta deleted file mode 100644 index 93e2b0eb..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseAllAssetsProvider.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c72eb6001f903de46bc72dea0d8b39c5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseAssetProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseAssetProvider.cs deleted file mode 100644 index 9d5304f8..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseAssetProvider.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -namespace YooAsset -{ - internal sealed class DatabaseAssetProvider : ProviderOperation - { - public DatabaseAssetProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo) : base(manager, providerGUID, assetInfo) - { - } - internal override void InternalOnStart() - { - DebugBeginRecording(); - } - internal override void InternalOnUpdate() - { -#if UNITY_EDITOR - if (IsDone) - return; - - if (_steps == ESteps.None) - { - // 检测资源文件是否存在 - string guid = UnityEditor.AssetDatabase.AssetPathToGUID(MainAssetInfo.AssetPath); - if (string.IsNullOrEmpty(guid)) - { - string error = $"Not found asset : {MainAssetInfo.AssetPath}"; - YooLogger.Error(error); - InvokeCompletion(error, EOperationStatus.Failed); - return; - } - - _steps = ESteps.CheckBundle; - - // 注意:模拟异步加载效果提前返回 - if (IsWaitForAsyncComplete == false) - return; - } - - // 1. 检测资源包 - if (_steps == ESteps.CheckBundle) - { - if (LoadBundleFileOp.IsDone == false) - return; - - if (LoadBundleFileOp.Status != EOperationStatus.Succeed) - { - InvokeCompletion(LoadBundleFileOp.Error, EOperationStatus.Failed); - return; - } - - _steps = ESteps.Loading; - } - - // 2. 加载资源对象 - if (_steps == ESteps.Loading) - { - if (MainAssetInfo.AssetType == null) - AssetObject = UnityEditor.AssetDatabase.LoadMainAssetAtPath(MainAssetInfo.AssetPath); - else - AssetObject = UnityEditor.AssetDatabase.LoadAssetAtPath(MainAssetInfo.AssetPath, MainAssetInfo.AssetType); - _steps = ESteps.Checking; - } - - // 3. 检测加载结果 - if (_steps == ESteps.Checking) - { - if (AssetObject == null) - { - string error; - if (MainAssetInfo.AssetType == null) - error = $"Failed to load asset object : {MainAssetInfo.AssetPath} AssetType : null"; - else - error = $"Failed to load asset object : {MainAssetInfo.AssetPath} AssetType : {MainAssetInfo.AssetType}"; - YooLogger.Error(error); - InvokeCompletion(error, EOperationStatus.Failed); - } - else - { - InvokeCompletion(string.Empty, EOperationStatus.Succeed); - } - } -#endif - } - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseAssetProvider.cs.meta b/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseAssetProvider.cs.meta deleted file mode 100644 index 39d07f13..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseAssetProvider.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d4022dd2ea39af5458fb1d61ec997347 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseRawFileProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseRawFileProvider.cs deleted file mode 100644 index 830d0088..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseRawFileProvider.cs +++ /dev/null @@ -1,62 +0,0 @@ - -namespace YooAsset -{ - internal class DatabaseRawFileProvider : ProviderOperation - { - public DatabaseRawFileProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo) : base(manager, providerGUID, assetInfo) - { - } - internal override void InternalOnStart() - { - DebugBeginRecording(); - } - internal override void InternalOnUpdate() - { -#if UNITY_EDITOR - if (IsDone) - return; - - if (_steps == ESteps.None) - { - // 检测资源文件是否存在 - string guid = UnityEditor.AssetDatabase.AssetPathToGUID(MainAssetInfo.AssetPath); - if (string.IsNullOrEmpty(guid)) - { - string error = $"Not found asset : {MainAssetInfo.AssetPath}"; - YooLogger.Error(error); - InvokeCompletion(error, EOperationStatus.Failed); - return; - } - - _steps = ESteps.CheckBundle; - - // 注意:模拟异步加载效果提前返回 - if (IsWaitForAsyncComplete == false) - return; - } - - // 1. 检测资源包 - if (_steps == ESteps.CheckBundle) - { - if (LoadBundleFileOp.IsDone == false) - return; - - if (LoadBundleFileOp.Status != EOperationStatus.Succeed) - { - InvokeCompletion(LoadBundleFileOp.Error, EOperationStatus.Failed); - return; - } - - _steps = ESteps.Checking; - } - - // 2. 检测加载结果 - if (_steps == ESteps.Checking) - { - RawBundleObject = new RawBundle(null, null, MainAssetInfo.AssetPath); - InvokeCompletion(string.Empty, EOperationStatus.Succeed); - } -#endif - } - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseRawFileProvider.cs.meta b/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseRawFileProvider.cs.meta deleted file mode 100644 index 64f66593..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseRawFileProvider.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 41d0e9bbc5a3a5b4e8b05d60d40d495a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseSceneProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseSceneProvider.cs deleted file mode 100644 index 85e81bd1..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseSceneProvider.cs +++ /dev/null @@ -1,139 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using System.IO; -using UnityEngine; -using UnityEngine.SceneManagement; - -namespace YooAsset -{ - internal sealed class DatabaseSceneProvider : ProviderOperation - { - public readonly LoadSceneParameters LoadSceneParams; - private AsyncOperation _asyncOperation; - private bool _suspendLoadMode; - - /// - /// 场景加载模式 - /// - public LoadSceneMode SceneMode - { - get - { - return LoadSceneParams.loadSceneMode; - } - } - - public DatabaseSceneProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo, LoadSceneParameters loadSceneParams, bool suspendLoad) : base(manager, providerGUID, assetInfo) - { - LoadSceneParams = loadSceneParams; - SceneName = Path.GetFileNameWithoutExtension(assetInfo.AssetPath); - _suspendLoadMode = suspendLoad; - } - internal override void InternalOnStart() - { - DebugBeginRecording(); - } - internal override void InternalOnUpdate() - { -#if UNITY_EDITOR - if (IsDone) - return; - - if (_steps == ESteps.None) - { - _steps = ESteps.CheckBundle; - } - - // 1. 检测资源包 - if (_steps == ESteps.CheckBundle) - { - if (LoadBundleFileOp.IsDone == false) - return; - - if (LoadBundleFileOp.Status != EOperationStatus.Succeed) - { - InvokeCompletion(LoadBundleFileOp.Error, EOperationStatus.Failed); - return; - } - - _steps = ESteps.Loading; - } - - // 2. 加载资源对象 - if (_steps == ESteps.Loading) - { - if (IsWaitForAsyncComplete) - { - SceneObject = UnityEditor.SceneManagement.EditorSceneManager.LoadSceneInPlayMode(MainAssetInfo.AssetPath, LoadSceneParams); - _steps = ESteps.Checking; - } - else - { - _asyncOperation = UnityEditor.SceneManagement.EditorSceneManager.LoadSceneAsyncInPlayMode(MainAssetInfo.AssetPath, LoadSceneParams); - if (_asyncOperation != null) - { - _asyncOperation.allowSceneActivation = !_suspendLoadMode; - _asyncOperation.priority = 100; - SceneObject = SceneManager.GetSceneAt(SceneManager.sceneCount - 1); - _steps = ESteps.Checking; - } - else - { - string error = $"Failed to load scene : {MainAssetInfo.AssetPath}"; - YooLogger.Error(error); - InvokeCompletion(error, EOperationStatus.Failed); - } - } - } - - // 3. 检测加载结果 - if (_steps == ESteps.Checking) - { - if (_asyncOperation != null) - { - if (IsWaitForAsyncComplete) - { - // 场景加载无法强制异步转同步 - YooLogger.Error("The scene is loading asyn !"); - } - else - { - // 注意:在业务层中途可以取消挂起 - if (_asyncOperation.allowSceneActivation == false) - { - if (_suspendLoadMode == false) - _asyncOperation.allowSceneActivation = true; - } - - Progress = _asyncOperation.progress; - if (_asyncOperation.isDone == false) - return; - } - } - - if (SceneObject.IsValid()) - { - InvokeCompletion(string.Empty, EOperationStatus.Succeed); - } - else - { - string error = $"The loaded scene is invalid : {MainAssetInfo.AssetPath}"; - YooLogger.Error(error); - InvokeCompletion(error, EOperationStatus.Failed); - } - } -#endif - } - - /// - /// 解除场景加载挂起操作 - /// - public void UnSuspendLoad() - { - if (IsDone == false) - { - _suspendLoadMode = false; - } - } - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseSceneProvider.cs.meta b/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseSceneProvider.cs.meta deleted file mode 100644 index d45070da..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseSceneProvider.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8252a639423064f498ed22f14912adae -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseSubAssetsProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseSubAssetsProvider.cs deleted file mode 100644 index b141431e..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseSubAssetsProvider.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -namespace YooAsset -{ - internal sealed class DatabaseSubAssetsProvider : ProviderOperation - { - public DatabaseSubAssetsProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo) : base(manager, providerGUID, assetInfo) - { - } - internal override void InternalOnStart() - { - DebugBeginRecording(); - } - internal override void InternalOnUpdate() - { -#if UNITY_EDITOR - if (IsDone) - return; - - if (_steps == ESteps.None) - { - // 检测资源文件是否存在 - string guid = UnityEditor.AssetDatabase.AssetPathToGUID(MainAssetInfo.AssetPath); - if (string.IsNullOrEmpty(guid)) - { - string error = $"Not found asset : {MainAssetInfo.AssetPath}"; - YooLogger.Error(error); - InvokeCompletion(error, EOperationStatus.Failed); - return; - } - - _steps = ESteps.CheckBundle; - - // 注意:模拟异步加载效果提前返回 - if (IsWaitForAsyncComplete == false) - return; - } - - // 1. 检测资源包 - if (_steps == ESteps.CheckBundle) - { - if (LoadBundleFileOp.IsDone == false) - return; - - if (LoadBundleFileOp.Status != EOperationStatus.Succeed) - { - InvokeCompletion(LoadBundleFileOp.Error, EOperationStatus.Failed); - return; - } - - _steps = ESteps.Loading; - } - - // 2. 加载资源对象 - if (_steps == ESteps.Loading) - { - if (MainAssetInfo.AssetType == null) - { - AllAssetObjects = UnityEditor.AssetDatabase.LoadAllAssetRepresentationsAtPath(MainAssetInfo.AssetPath); - } - else - { - UnityEngine.Object[] findAssets = UnityEditor.AssetDatabase.LoadAllAssetRepresentationsAtPath(MainAssetInfo.AssetPath); - List result = new List(findAssets.Length); - foreach (var findAsset in findAssets) - { - if (MainAssetInfo.AssetType.IsAssignableFrom(findAsset.GetType())) - result.Add(findAsset); - } - AllAssetObjects = result.ToArray(); - } - _steps = ESteps.Checking; - } - - // 3. 检测加载结果 - if (_steps == ESteps.Checking) - { - if (AllAssetObjects == null) - { - string error; - if (MainAssetInfo.AssetType == null) - error = $"Failed to load sub assets : {MainAssetInfo.AssetPath} AssetType : null"; - else - error = $"Failed to load sub assets : {MainAssetInfo.AssetPath} AssetType : {MainAssetInfo.AssetType}"; - YooLogger.Error(error); - InvokeCompletion(error, EOperationStatus.Failed); - } - else - { - InvokeCompletion(string.Empty, EOperationStatus.Succeed); - } - } -#endif - } - } -} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseSubAssetsProvider.cs.meta b/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseSubAssetsProvider.cs.meta deleted file mode 100644 index f229f8ad..00000000 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseSubAssetsProvider.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3837962b901d7ba4abf02a9991ac4c4a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/ProviderOperation.cs b/Assets/YooAsset/Runtime/ResourceManager/Provider/ProviderOperation.cs index b6b3107a..21d9588b 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/ProviderOperation.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Provider/ProviderOperation.cs @@ -10,9 +10,8 @@ namespace YooAsset protected enum ESteps { None = 0, - CheckBundle, - Loading, - Checking, + LoadBundleFile, + ProcessBundleResult, Done, } @@ -41,15 +40,20 @@ namespace YooAsset /// public UnityEngine.Object[] AllAssetObjects { protected set; get; } + /// + /// 获取的资源对象集合 + /// + public UnityEngine.Object[] SubAssetObjects { protected set; get; } + /// /// 获取的场景对象 /// public UnityEngine.SceneManagement.Scene SceneObject { protected set; get; } /// - /// 获取的原生对象 + /// 获取的资源包对象 /// - public RawBundle RawBundleObject { protected set; get; } + public BundleResult BundleResultObject { protected set; get; } /// /// 加载的场景名称 @@ -67,9 +71,9 @@ namespace YooAsset public bool IsDestroyed { private set; get; } = false; - protected ESteps _steps = ESteps.None; - protected LoadBundleFileOperation LoadBundleFileOp { private set; get; } - protected LoadDependBundleFileOperation LoadDependBundleFileOp { private set; get; } + private ESteps _steps = ESteps.None; + private readonly LoadBundleFileOperation _mainBundleLoader; + private readonly List _bundleLoaders = new List(); private readonly List _handles = new List(); @@ -81,25 +85,75 @@ namespace YooAsset if (string.IsNullOrEmpty(providerGUID) == false) { - LoadBundleFileOp = manager.CreateMainBundleFileLoader(assetInfo); - LoadBundleFileOp.Reference(); - LoadBundleFileOp.AddProvider(this); + // 主资源包加载器 + _mainBundleLoader = manager.CreateMainBundleFileLoader(assetInfo); + _mainBundleLoader.AddProvider(this); + _bundleLoaders.Add(_mainBundleLoader); - LoadDependBundleFileOp = manager.CreateDependFileLoaders(assetInfo); - LoadDependBundleFileOp.Reference(); + // 依赖资源包加载器集合 + var dependLoaders = manager.CreateDependBundleFileLoaders(assetInfo); + if(dependLoaders.Count > 0) + _bundleLoaders.AddRange(dependLoaders); + + // 增加引用计数 + foreach (var bundleLoader in _bundleLoaders) + { + bundleLoader.Reference(); + } } } + internal override void InternalOnStart() + { + DebugBeginRecording(); + _steps = ESteps.LoadBundleFile; + } + internal override void InternalOnUpdate() + { + if (_steps == ESteps.None || _steps == ESteps.Done) + return; + if (_steps == ESteps.LoadBundleFile) + { + if (IsWaitForAsyncComplete) + { + foreach (var bundleLoader in _bundleLoaders) + { + bundleLoader.WaitForAsyncComplete(); + } + } + + foreach (var bundleLoader in _bundleLoaders) + { + if (bundleLoader.IsDone == false) + return; + + if (bundleLoader.Status != EOperationStatus.Succeed) + { + InvokeCompletion(bundleLoader.Error, EOperationStatus.Failed); + return; + } + } + + BundleResultObject = _mainBundleLoader.Result; + if (BundleResultObject == null) + { + string error = $"Loaded bundle result is null !"; + InvokeCompletion(error, EOperationStatus.Failed); + return; + } + + _steps = ESteps.ProcessBundleResult; + } + + if (_steps == ESteps.ProcessBundleResult) + { + ProcessBundleResult(); + } + } internal override void InternalWaitForAsyncComplete() { while (true) { - if (LoadDependBundleFileOp != null) - LoadDependBundleFileOp.WaitForAsyncComplete(); - - if (LoadBundleFileOp != null) - LoadBundleFileOp.WaitForAsyncComplete(); - if (ExecuteWhileDone()) { _steps = ESteps.Done; @@ -107,6 +161,7 @@ namespace YooAsset } } } + protected abstract void ProcessBundleResult(); /// /// 销毁资源提供者 @@ -122,16 +177,10 @@ namespace YooAsset Status = EOperationStatus.Failed; } - // 释放资源包加载器 - if (LoadBundleFileOp != null) + // 减少引用计数 + foreach (var bundleLoader in _bundleLoaders) { - LoadBundleFileOp.Release(); - LoadBundleFileOp = null; - } - if (LoadDependBundleFileOp != null) - { - LoadDependBundleFileOp.Release(); - LoadDependBundleFileOp = null; + bundleLoader.Release(); } } @@ -141,7 +190,7 @@ namespace YooAsset public bool CanDestroyProvider() { // 注意:在进行资源加载过程时不可以销毁 - if (_steps == ESteps.Loading || _steps == ESteps.Checking) + if (_steps == ESteps.ProcessBundleResult) return false; return RefCount <= 0; @@ -200,19 +249,6 @@ namespace YooAsset } } - /// - /// 处理致命问题 - /// - protected void ProcessFatalEvent() - { - if (LoadBundleFileOp.IsDestroyed) - throw new System.Exception("Should never get here !"); - - string error = $"The bundle {LoadBundleFileOp.BundleFileInfo.Bundle.BundleName} has been destroyed by unity bugs !"; - YooLogger.Error(error); - InvokeCompletion(Error, EOperationStatus.Failed); - } - /// /// 结束流程 /// @@ -242,12 +278,10 @@ namespace YooAsset public DownloadStatus GetDownloadStatus() { DownloadStatus status = new DownloadStatus(); - status.TotalBytes = LoadBundleFileOp.BundleFileInfo.Bundle.FileSize; - status.DownloadedBytes = LoadBundleFileOp.DownloadedBytes; - foreach (var dependBundle in LoadDependBundleFileOp.Depends) + foreach (var bundleLoader in _bundleLoaders) { - status.TotalBytes += dependBundle.BundleFileInfo.Bundle.FileSize; - status.DownloadedBytes += dependBundle.DownloadedBytes; + status.TotalBytes += bundleLoader.LoadBundleInfo.Bundle.FileSize; + status.DownloadedBytes += bundleLoader.DownloadedBytes; } if (status.TotalBytes == 0) @@ -315,13 +349,14 @@ namespace YooAsset /// internal void GetBundleDebugInfos(List output) { - var bundleInfo = new DebugBundleInfo(); - bundleInfo.BundleName = LoadBundleFileOp.BundleFileInfo.Bundle.BundleName; - bundleInfo.RefCount = LoadBundleFileOp.RefCount; - bundleInfo.Status = LoadBundleFileOp.Status; - output.Add(bundleInfo); - - LoadDependBundleFileOp.GetBundleDebugInfos(output); + foreach (var bundleLoader in _bundleLoaders) + { + var bundleInfo = new DebugBundleInfo(); + bundleInfo.BundleName = bundleLoader.LoadBundleInfo.Bundle.BundleName; + bundleInfo.RefCount = bundleLoader.RefCount; + bundleInfo.Status = bundleLoader.Status; + output.Add(bundleInfo); + } } #endregion } diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/RawFileProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Provider/RawFileProvider.cs new file mode 100644 index 00000000..879c323c --- /dev/null +++ b/Assets/YooAsset/Runtime/ResourceManager/Provider/RawFileProvider.cs @@ -0,0 +1,14 @@ + +namespace YooAsset +{ + internal class RawFileProvider : ProviderOperation + { + public RawFileProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo) : base(manager, providerGUID, assetInfo) + { + } + protected override void ProcessBundleResult() + { + InvokeCompletion(string.Empty, EOperationStatus.Succeed); + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Bundle/RawBundle.cs.meta b/Assets/YooAsset/Runtime/ResourceManager/Provider/RawFileProvider.cs.meta similarity index 83% rename from Assets/YooAsset/Runtime/ResourceManager/Bundle/RawBundle.cs.meta rename to Assets/YooAsset/Runtime/ResourceManager/Provider/RawFileProvider.cs.meta index 1abf950e..849ac2fe 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Bundle/RawBundle.cs.meta +++ b/Assets/YooAsset/Runtime/ResourceManager/Provider/RawFileProvider.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: c6e71c986d2a8c74d981deeed7b5a8ef +guid: 49b6e666518da98479966a5cf0504d59 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/SceneProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Provider/SceneProvider.cs new file mode 100644 index 00000000..1a6f365d --- /dev/null +++ b/Assets/YooAsset/Runtime/ResourceManager/Provider/SceneProvider.cs @@ -0,0 +1,69 @@ +using System.Collections; +using System.Collections.Generic; +using System.IO; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace YooAsset +{ + internal sealed class SceneProvider : ProviderOperation + { + private readonly LoadSceneParameters _loadParams; + private bool _suspendLoad; + private FSLoadSceneOperation _loadSceneOp; + + /// + /// 场景加载模式 + /// + public LoadSceneMode SceneMode + { + get + { + return _loadParams.loadSceneMode; + } + } + + public SceneProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo, LoadSceneParameters loadParams, bool suspendLoad) : base(manager, providerGUID, assetInfo) + { + _loadParams = loadParams; + _suspendLoad = suspendLoad; + SceneName = Path.GetFileNameWithoutExtension(assetInfo.AssetPath); + } + protected override void ProcessBundleResult() + { + if (_loadSceneOp == null) + { + _loadSceneOp = BundleResultObject.LoadSceneOperation(MainAssetInfo, _loadParams, _suspendLoad); + } + + if (IsWaitForAsyncComplete) + _loadSceneOp.WaitForAsyncComplete(); + + // 注意:场景加载中途可以取消挂起 + if (_suspendLoad == false) + _loadSceneOp.UnSuspendLoad(); + + Progress = _loadSceneOp.Progress; + if (_loadSceneOp.IsDone == false) + return; + + if (_loadSceneOp.Status != EOperationStatus.Succeed) + { + InvokeCompletion(_loadSceneOp.Error, EOperationStatus.Failed); + } + else + { + SceneObject = _loadSceneOp.Result; + InvokeCompletion(string.Empty, EOperationStatus.Succeed); + } + } + + /// + /// 解除场景加载挂起操作 + /// + public void UnSuspendLoad() + { + _suspendLoad = false; + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Loader/LoadDependFileOperation.cs.meta b/Assets/YooAsset/Runtime/ResourceManager/Provider/SceneProvider.cs.meta similarity index 83% rename from Assets/YooAsset/Runtime/ResourceManager/Loader/LoadDependFileOperation.cs.meta rename to Assets/YooAsset/Runtime/ResourceManager/Provider/SceneProvider.cs.meta index edd0393a..ca503d52 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Loader/LoadDependFileOperation.cs.meta +++ b/Assets/YooAsset/Runtime/ResourceManager/Provider/SceneProvider.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 3834f832061fdd74fbfb1eba381b1b3e +guid: 8586015105ad65f438e2f2e9c64c3df1 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/SubAssetsProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Provider/SubAssetsProvider.cs new file mode 100644 index 00000000..ee44b493 --- /dev/null +++ b/Assets/YooAsset/Runtime/ResourceManager/Provider/SubAssetsProvider.cs @@ -0,0 +1,36 @@ + +namespace YooAsset +{ + internal sealed class SubAssetsProvider : ProviderOperation + { + private FSLoadSubAssetsOperation _loadSubAssetsOp; + + public SubAssetsProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo) : base(manager, providerGUID, assetInfo) + { + } + protected override void ProcessBundleResult() + { + if (_loadSubAssetsOp == null) + { + _loadSubAssetsOp = BundleResultObject.LoadSubAssetsAsync(MainAssetInfo); + } + + if (IsWaitForAsyncComplete) + _loadSubAssetsOp.WaitForAsyncComplete(); + + Progress = _loadSubAssetsOp.Progress; + if (_loadSubAssetsOp.IsDone == false) + return; + + if (_loadSubAssetsOp.Status != EOperationStatus.Succeed) + { + InvokeCompletion(_loadSubAssetsOp.Error, EOperationStatus.Failed); + } + else + { + SubAssetObjects = _loadSubAssetsOp.Result; + InvokeCompletion(string.Empty, EOperationStatus.Succeed); + } + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/SubAssetsProvider.cs.meta b/Assets/YooAsset/Runtime/ResourceManager/Provider/SubAssetsProvider.cs.meta new file mode 100644 index 00000000..1ead3daf --- /dev/null +++ b/Assets/YooAsset/Runtime/ResourceManager/Provider/SubAssetsProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0cef140e594c94640abfcd439f6b8be3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/ResourceManager/ResourceManager.cs b/Assets/YooAsset/Runtime/ResourceManager/ResourceManager.cs index 894e7652..2cda07f4 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/ResourceManager.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/ResourceManager.cs @@ -15,8 +15,6 @@ namespace YooAsset internal readonly Dictionary _providerDic = new Dictionary(5000); internal readonly Dictionary _loaderDic = new Dictionary(5000); - - private bool _simulationOnEditor; private IBundleQuery _bundleQuery; /// @@ -35,7 +33,6 @@ namespace YooAsset /// public void Initialize(InitializeParameters initializeParameters, IBundleQuery bundleServices) { - _simulationOnEditor = initializeParameters is EditorSimulateModeParameters; _bundleQuery = bundleServices; } @@ -52,13 +49,13 @@ namespace YooAsset // 卸载主资源包加载器 string mainBundleName = _bundleQuery.GetMainBundleName(assetInfo); - var mainLoader = TryGetFileLoader(mainBundleName); + var mainLoader = TryGetBundleFileLoader(mainBundleName); if (mainLoader != null) { mainLoader.TryDestroyProviders(); if (mainLoader.CanDestroyLoader()) { - string bundleName = mainLoader.BundleFileInfo.Bundle.BundleName; + string bundleName = mainLoader.LoadBundleInfo.Bundle.BundleName; mainLoader.DestroyLoader(); _loaderDic.Remove(bundleName); } @@ -68,12 +65,12 @@ namespace YooAsset string[] dependBundleNames = _bundleQuery.GetDependBundleNames(assetInfo); foreach (var dependBundleName in dependBundleNames) { - var dependLoader = TryGetFileLoader(dependBundleName); + var dependLoader = TryGetBundleFileLoader(dependBundleName); if (dependLoader != null) { if (dependLoader.CanDestroyLoader()) { - string bundleName = dependLoader.BundleFileInfo.Bundle.BundleName; + string bundleName = dependLoader.LoadBundleInfo.Bundle.BundleName; dependLoader.DestroyLoader(); _loaderDic.Remove(bundleName); } @@ -92,7 +89,7 @@ namespace YooAsset { YooLogger.Error($"Failed to load scene ! {assetInfo.Error}"); CompletedProvider completedProvider = new CompletedProvider(this, assetInfo); - completedProvider.SetCompleted(assetInfo.Error); + completedProvider.SetCompletedWithError(assetInfo.Error); return completedProvider.CreateHandle(); } @@ -106,10 +103,7 @@ namespace YooAsset string providerGUID = $"{assetInfo.GUID}-{++_sceneCreateCount}"; ProviderOperation provider; { - if (_simulationOnEditor) - provider = new DatabaseSceneProvider(this, providerGUID, assetInfo, loadSceneParams, suspendLoad); - else - provider = new BundledSceneProvider(this, providerGUID, assetInfo, loadSceneParams, suspendLoad); + provider = new SceneProvider(this, providerGUID, assetInfo, loadSceneParams, suspendLoad); provider.InitSpawnDebugInfo(); _providerDic.Add(providerGUID, provider); OperationSystem.StartOperation(PackageName, provider); @@ -131,18 +125,15 @@ namespace YooAsset { YooLogger.Error($"Failed to load asset ! {assetInfo.Error}"); CompletedProvider completedProvider = new CompletedProvider(this, assetInfo); - completedProvider.SetCompleted(assetInfo.Error); + completedProvider.SetCompletedWithError(assetInfo.Error); return completedProvider.CreateHandle(); } string providerGUID = nameof(LoadAssetAsync) + assetInfo.GUID; - ProviderOperation provider = TryGetProvider(providerGUID); + ProviderOperation provider = TryGetAssetProvider(providerGUID); if (provider == null) { - if (_simulationOnEditor) - provider = new DatabaseAssetProvider(this, providerGUID, assetInfo); - else - provider = new BundledAssetProvider(this, providerGUID, assetInfo); + provider = new AssetProvider(this, providerGUID, assetInfo); provider.InitSpawnDebugInfo(); _providerDic.Add(providerGUID, provider); OperationSystem.StartOperation(PackageName, provider); @@ -161,18 +152,15 @@ namespace YooAsset { YooLogger.Error($"Failed to load sub assets ! {assetInfo.Error}"); CompletedProvider completedProvider = new CompletedProvider(this, assetInfo); - completedProvider.SetCompleted(assetInfo.Error); + completedProvider.SetCompletedWithError(assetInfo.Error); return completedProvider.CreateHandle(); } string providerGUID = nameof(LoadSubAssetsAsync) + assetInfo.GUID; - ProviderOperation provider = TryGetProvider(providerGUID); + ProviderOperation provider = TryGetAssetProvider(providerGUID); if (provider == null) { - if (_simulationOnEditor) - provider = new DatabaseSubAssetsProvider(this, providerGUID, assetInfo); - else - provider = new BundledSubAssetsProvider(this, providerGUID, assetInfo); + provider = new SubAssetsProvider(this, providerGUID, assetInfo); provider.InitSpawnDebugInfo(); _providerDic.Add(providerGUID, provider); OperationSystem.StartOperation(PackageName, provider); @@ -191,18 +179,15 @@ namespace YooAsset { YooLogger.Error($"Failed to load all assets ! {assetInfo.Error}"); CompletedProvider completedProvider = new CompletedProvider(this, assetInfo); - completedProvider.SetCompleted(assetInfo.Error); + completedProvider.SetCompletedWithError(assetInfo.Error); return completedProvider.CreateHandle(); } string providerGUID = nameof(LoadAllAssetsAsync) + assetInfo.GUID; - ProviderOperation provider = TryGetProvider(providerGUID); + ProviderOperation provider = TryGetAssetProvider(providerGUID); if (provider == null) { - if (_simulationOnEditor) - provider = new DatabaseAllAssetsProvider(this, providerGUID, assetInfo); - else - provider = new BundledAllAssetsProvider(this, providerGUID, assetInfo); + provider = new AllAssetsProvider(this, providerGUID, assetInfo); provider.InitSpawnDebugInfo(); _providerDic.Add(providerGUID, provider); OperationSystem.StartOperation(PackageName, provider); @@ -221,18 +206,15 @@ namespace YooAsset { YooLogger.Error($"Failed to load raw file ! {assetInfo.Error}"); CompletedProvider completedProvider = new CompletedProvider(this, assetInfo); - completedProvider.SetCompleted(assetInfo.Error); + completedProvider.SetCompletedWithError(assetInfo.Error); return completedProvider.CreateHandle(); } string providerGUID = nameof(LoadRawFileAsync) + assetInfo.GUID; - ProviderOperation provider = TryGetProvider(providerGUID); + ProviderOperation provider = TryGetAssetProvider(providerGUID); if (provider == null) { - if (_simulationOnEditor) - provider = new DatabaseRawFileProvider(this, providerGUID, assetInfo); - else - provider = new BundledRawFileProvider(this, providerGUID, assetInfo); + provider = new RawFileProvider(this, providerGUID, assetInfo); provider.InitSpawnDebugInfo(); _providerDic.Add(providerGUID, provider); OperationSystem.StartOperation(PackageName, provider); @@ -295,20 +277,18 @@ namespace YooAsset internal LoadBundleFileOperation CreateMainBundleFileLoader(AssetInfo assetInfo) { BundleInfo bundleInfo = _bundleQuery.GetMainBundleInfo(assetInfo); - return CreateFileLoaderInternal(bundleInfo); + return CreateBundleFileLoaderInternal(bundleInfo); } - internal LoadDependBundleFileOperation CreateDependFileLoaders(AssetInfo assetInfo) + internal List CreateDependBundleFileLoaders(AssetInfo assetInfo) { BundleInfo[] bundleInfos = _bundleQuery.GetDependBundleInfos(assetInfo); - List depends = new List(bundleInfos.Length); + List result = new List(bundleInfos.Length); foreach (var bundleInfo in bundleInfos) { - LoadBundleFileOperation dependLoader = CreateFileLoaderInternal(bundleInfo); - depends.Add(dependLoader); + var bundleLoader = CreateBundleFileLoaderInternal(bundleInfo); + result.Add(bundleLoader); } - var operation = new LoadDependBundleFileOperation(depends); - OperationSystem.StartOperation(PackageName, operation); - return operation; + return result; } internal void RemoveBundleProviders(List removeList) { @@ -322,11 +302,11 @@ namespace YooAsset return _loaderDic.Count > 0; } - private LoadBundleFileOperation CreateFileLoaderInternal(BundleInfo bundleInfo) + private LoadBundleFileOperation CreateBundleFileLoaderInternal(BundleInfo bundleInfo) { // 如果加载器已经存在 string bundleName = bundleInfo.Bundle.BundleName; - LoadBundleFileOperation loaderOperation = TryGetFileLoader(bundleName); + LoadBundleFileOperation loaderOperation = TryGetBundleFileLoader(bundleName); if (loaderOperation != null) return loaderOperation; @@ -336,14 +316,14 @@ namespace YooAsset _loaderDic.Add(bundleName, loaderOperation); return loaderOperation; } - private LoadBundleFileOperation TryGetFileLoader(string bundleName) + private LoadBundleFileOperation TryGetBundleFileLoader(string bundleName) { if (_loaderDic.TryGetValue(bundleName, out LoadBundleFileOperation value)) return value; else return null; } - private ProviderOperation TryGetProvider(string providerGUID) + private ProviderOperation TryGetAssetProvider(string providerGUID) { if (_providerDic.TryGetValue(providerGUID, out ProviderOperation value)) return value; diff --git a/Assets/YooAsset/Runtime/ResourcePackage/BundleInfo.cs b/Assets/YooAsset/Runtime/ResourcePackage/BundleInfo.cs index cec99558..b6bd1aff 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/BundleInfo.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/BundleInfo.cs @@ -3,19 +3,14 @@ namespace YooAsset { internal class BundleInfo { - private readonly string _importFilePath; private readonly IFileSystem _fileSystem; + private readonly string _importFilePath; /// /// 资源包对象 /// public readonly PackageBundle Bundle; - /// - /// 注意:该字段只用于帮助编辑器下的模拟模式。 - /// - public string[] IncludeAssetsInEditor; - public BundleInfo(IFileSystem fileSystem, PackageBundle bundle) { @@ -31,21 +26,13 @@ namespace YooAsset } /// - /// 加载资源文件 + /// 加载资源包 /// public FSLoadBundleOperation LoadBundleFile() { return _fileSystem.LoadBundleFile(Bundle); } - /// - /// 卸载资源文件 - /// - public void UnloadBundleFile(object result) - { - _fileSystem.UnloadBundleFile(Bundle, result); - } - /// /// 创建下载器 /// diff --git a/Assets/YooAsset/Runtime/ResourcePackage/EBuildBundleType.cs b/Assets/YooAsset/Runtime/ResourcePackage/EBuildBundleType.cs new file mode 100644 index 00000000..edb8f0d5 --- /dev/null +++ b/Assets/YooAsset/Runtime/ResourcePackage/EBuildBundleType.cs @@ -0,0 +1,26 @@ + +namespace YooAsset +{ + internal enum EBuildBundleType + { + /// + /// 未知类型 + /// + Unknown = 0, + + /// + /// 虚拟资源包 + /// + VirtualBundle = 1, + + /// + /// AssetBundle + /// + AssetBundle = 2, + + /// + /// 原生文件 + /// + RawBundle = 3, + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourcePackage/EBuildBundleType.cs.meta b/Assets/YooAsset/Runtime/ResourcePackage/EBuildBundleType.cs.meta new file mode 100644 index 00000000..63df32c4 --- /dev/null +++ b/Assets/YooAsset/Runtime/ResourcePackage/EBuildBundleType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2ea43593e14f4fb469b0e9abe9a8434d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs b/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs index 417b1c78..02cbfae2 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs @@ -39,6 +39,7 @@ namespace YooAsset buffer.WriteBool(manifest.LocationToLower); buffer.WriteBool(manifest.IncludeAssetGUID); buffer.WriteInt32(manifest.OutputNameStyle); + buffer.WriteInt32(manifest.BuildBundleType); buffer.WriteUTF8(manifest.BuildPipeline); buffer.WriteUTF8(manifest.PackageName); buffer.WriteUTF8(manifest.PackageVersion); @@ -111,6 +112,7 @@ namespace YooAsset manifest.LocationToLower = buffer.ReadBool(); manifest.IncludeAssetGUID = buffer.ReadBool(); manifest.OutputNameStyle = buffer.ReadInt32(); + manifest.BuildBundleType = buffer.ReadInt32(); manifest.BuildPipeline = buffer.ReadUTF8(); manifest.PackageName = buffer.ReadUTF8(); manifest.PackageVersion = buffer.ReadUTF8(); @@ -122,7 +124,7 @@ namespace YooAsset // 读取资源列表 int packageAssetCount = buffer.ReadInt32(); - manifest.AssetList = new List(packageAssetCount); + CreateAssetCollection(manifest, packageAssetCount); for (int i = 0; i < packageAssetCount; i++) { var packageAsset = new PackageAsset(); @@ -131,12 +133,12 @@ namespace YooAsset packageAsset.AssetGUID = buffer.ReadUTF8(); packageAsset.AssetTags = buffer.ReadUTF8Array(); packageAsset.BundleID = buffer.ReadInt32(); - manifest.AssetList.Add(packageAsset); + FillAssetCollection(manifest, packageAsset); } // 读取资源包列表 int packageBundleCount = buffer.ReadInt32(); - manifest.BundleList = new List(packageBundleCount); + CreateBundleCollection(manifest, packageBundleCount); for (int i = 0; i < packageBundleCount; i++) { var packageBundle = new PackageBundle(); @@ -148,36 +150,129 @@ namespace YooAsset packageBundle.Encrypted = buffer.ReadBool(); packageBundle.Tags = buffer.ReadUTF8Array(); packageBundle.DependIDs = buffer.ReadInt32Array(); - manifest.BundleList.Add(packageBundle); + FillBundleCollection(manifest, packageBundle); } } - // 填充BundleDic - manifest.BundleDic1 = new Dictionary(manifest.BundleList.Count); - manifest.BundleDic2 = new Dictionary(manifest.BundleList.Count); - foreach (var packageBundle in manifest.BundleList) - { - packageBundle.ParseBundle(manifest); - manifest.BundleDic1.Add(packageBundle.BundleName, packageBundle); - manifest.BundleDic2.Add(packageBundle.FileName, packageBundle); - } - - // 填充AssetDic - manifest.AssetDic = new Dictionary(manifest.AssetList.Count); - foreach (var packageAsset in manifest.AssetList) - { - // 注意:我们不允许原始路径存在重名 - string assetPath = packageAsset.AssetPath; - if (manifest.AssetDic.ContainsKey(assetPath)) - throw new Exception($"AssetPath have existed : {assetPath}"); - else - manifest.AssetDic.Add(assetPath, packageAsset); - } - + // 初始化资源清单 + InitManifest(manifest); return manifest; } #endif + #region 解析资源清单辅助方法 + public static void InitManifest(PackageManifest manifest) + { + // 填充资源包内包含的主资源列表 + foreach (var packageAsset in manifest.AssetList) + { + int bundleID = packageAsset.BundleID; + if (bundleID >= 0 && bundleID < manifest.BundleList.Count) + { + var packageBundle = manifest.BundleList[bundleID]; + packageBundle.IncludeMainAssets.Add(packageAsset); + } + else + { + throw new Exception($"Invalid bundle id : {bundleID} Asset path : {packageAsset.AssetPath}"); + } + } + } + + public static void CreateAssetCollection(PackageManifest manifest, int assetCount) + { + manifest.AssetList = new List(assetCount); + manifest.AssetDic = new Dictionary(assetCount); + + if (manifest.EnableAddressable) + manifest.AssetPathMapping1 = new Dictionary(assetCount * 3); + else + manifest.AssetPathMapping1 = new Dictionary(assetCount * 2); + + if (manifest.IncludeAssetGUID) + manifest.AssetPathMapping2 = new Dictionary(assetCount); + else + manifest.AssetPathMapping2 = new Dictionary(); + } + public static void FillAssetCollection(PackageManifest manifest, PackageAsset packageAsset) + { + // 添加到列表集合 + manifest.AssetList.Add(packageAsset); + + // 注意:我们不允许原始路径存在重名 + string assetPath = packageAsset.AssetPath; + if (manifest.AssetDic.ContainsKey(assetPath)) + throw new System.Exception($"AssetPath have existed : {assetPath}"); + else + manifest.AssetDic.Add(assetPath, packageAsset); + + // 填充AssetPathMapping1 + { + string location = packageAsset.AssetPath; + if (manifest.LocationToLower) + location = location.ToLower(); + + // 添加原生路径的映射 + if (manifest.AssetPathMapping1.ContainsKey(location)) + throw new System.Exception($"Location have existed : {location}"); + else + manifest.AssetPathMapping1.Add(location, packageAsset.AssetPath); + + // 添加无后缀名路径的映射 + string locationWithoutExtension = Path.ChangeExtension(location, null); + if (ReferenceEquals(location, locationWithoutExtension) == false) + { + if (manifest.AssetPathMapping1.ContainsKey(locationWithoutExtension)) + YooLogger.Warning($"Location have existed : {locationWithoutExtension}"); + else + manifest.AssetPathMapping1.Add(locationWithoutExtension, packageAsset.AssetPath); + } + } + + // 添加可寻址地址 + if (manifest.EnableAddressable) + { + string location = packageAsset.Address; + if (string.IsNullOrEmpty(location) == false) + { + if (manifest.AssetPathMapping1.ContainsKey(location)) + throw new System.Exception($"Location have existed : {location}"); + else + manifest.AssetPathMapping1.Add(location, packageAsset.AssetPath); + } + } + + // 填充AssetPathMapping2 + if (manifest.IncludeAssetGUID) + { + if (manifest.AssetPathMapping2.ContainsKey(packageAsset.AssetGUID)) + throw new System.Exception($"AssetGUID have existed : {packageAsset.AssetGUID}"); + else + manifest.AssetPathMapping2.Add(packageAsset.AssetGUID, packageAsset.AssetPath); + } + } + + public static void CreateBundleCollection(PackageManifest manifest, int bundleCount) + { + manifest.BundleList = new List(bundleCount); + manifest.BundleDic1 = new Dictionary(bundleCount); + manifest.BundleDic2 = new Dictionary(bundleCount); + manifest.BundleDic3 = new Dictionary(bundleCount); + } + public static void FillBundleCollection(PackageManifest manifest, PackageBundle packageBundle) + { + // 初始化资源包 + packageBundle.InitBundle(manifest); + + // 添加到列表集合 + manifest.BundleList.Add(packageBundle); + + manifest.BundleDic1.Add(packageBundle.BundleName, packageBundle); + manifest.BundleDic2.Add(packageBundle.FileName, packageBundle); + manifest.BundleDic3.Add(packageBundle.BundleGUID, packageBundle); + } + #endregion + /// /// 注意:该类拷贝自编辑器 /// diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/DeserializeManifestOperation.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/DeserializeManifestOperation.cs index 7b2a54b2..c28017a6 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/DeserializeManifestOperation.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/DeserializeManifestOperation.cs @@ -1,6 +1,7 @@ using System.IO; using System.Collections; using System.Collections.Generic; +using System; namespace YooAsset { @@ -14,6 +15,7 @@ namespace YooAsset DeserializeAssetList, PrepareBundleList, DeserializeBundleList, + InitManifest, Done, } @@ -80,6 +82,7 @@ namespace YooAsset Manifest.LocationToLower = _buffer.ReadBool(); Manifest.IncludeAssetGUID = _buffer.ReadBool(); Manifest.OutputNameStyle = _buffer.ReadInt32(); + Manifest.BuildBundleType = _buffer.ReadInt32(); Manifest.BuildPipeline = _buffer.ReadUTF8(); Manifest.PackageName = _buffer.ReadUTF8(); Manifest.PackageVersion = _buffer.ReadUTF8(); @@ -95,20 +98,8 @@ namespace YooAsset if (_steps == ESteps.PrepareAssetList) { _packageAssetCount = _buffer.ReadInt32(); - Manifest.AssetList = new List(_packageAssetCount); - Manifest.AssetDic = new Dictionary(_packageAssetCount); - - if (Manifest.EnableAddressable) - Manifest.AssetPathMapping1 = new Dictionary(_packageAssetCount * 3); - else - Manifest.AssetPathMapping1 = new Dictionary(_packageAssetCount * 2); - - if (Manifest.IncludeAssetGUID) - Manifest.AssetPathMapping2 = new Dictionary(_packageAssetCount); - else - Manifest.AssetPathMapping2 = new Dictionary(); - _progressTotalValue = _packageAssetCount; + ManifestTools.CreateAssetCollection(Manifest, _packageAssetCount); _steps = ESteps.DeserializeAssetList; } if (_steps == ESteps.DeserializeAssetList) @@ -121,57 +112,7 @@ namespace YooAsset packageAsset.AssetGUID = _buffer.ReadUTF8(); packageAsset.AssetTags = _buffer.ReadUTF8Array(); packageAsset.BundleID = _buffer.ReadInt32(); - Manifest.AssetList.Add(packageAsset); - - // 注意:我们不允许原始路径存在重名 - string assetPath = packageAsset.AssetPath; - if (Manifest.AssetDic.ContainsKey(assetPath)) - throw new System.Exception($"AssetPath have existed : {assetPath}"); - else - Manifest.AssetDic.Add(assetPath, packageAsset); - - // 填充AssetPathMapping1 - { - string location = packageAsset.AssetPath; - if (Manifest.LocationToLower) - location = location.ToLower(); - - // 添加原生路径的映射 - if (Manifest.AssetPathMapping1.ContainsKey(location)) - throw new System.Exception($"Location have existed : {location}"); - else - Manifest.AssetPathMapping1.Add(location, packageAsset.AssetPath); - - // 添加无后缀名路径的映射 - string locationWithoutExtension = Path.ChangeExtension(location, null); - if (ReferenceEquals(location, locationWithoutExtension) == false) - { - if (Manifest.AssetPathMapping1.ContainsKey(locationWithoutExtension)) - YooLogger.Warning($"Location have existed : {locationWithoutExtension}"); - else - Manifest.AssetPathMapping1.Add(locationWithoutExtension, packageAsset.AssetPath); - } - } - if (Manifest.EnableAddressable) - { - string location = packageAsset.Address; - if (string.IsNullOrEmpty(location) == false) - { - if (Manifest.AssetPathMapping1.ContainsKey(location)) - throw new System.Exception($"Location have existed : {location}"); - else - Manifest.AssetPathMapping1.Add(location, packageAsset.AssetPath); - } - } - - // 填充AssetPathMapping2 - if (Manifest.IncludeAssetGUID) - { - if (Manifest.AssetPathMapping2.ContainsKey(packageAsset.AssetGUID)) - throw new System.Exception($"AssetGUID have existed : {packageAsset.AssetGUID}"); - else - Manifest.AssetPathMapping2.Add(packageAsset.AssetGUID, packageAsset.AssetPath); - } + ManifestTools.FillAssetCollection(Manifest, packageAsset); _packageAssetCount--; Progress = 1f - _packageAssetCount / _progressTotalValue; @@ -188,11 +129,8 @@ namespace YooAsset if (_steps == ESteps.PrepareBundleList) { _packageBundleCount = _buffer.ReadInt32(); - Manifest.BundleList = new List(_packageBundleCount); - Manifest.BundleDic1 = new Dictionary(_packageBundleCount); - Manifest.BundleDic2 = new Dictionary(_packageBundleCount); - Manifest.BundleDic3 = new Dictionary(_packageBundleCount); _progressTotalValue = _packageBundleCount; + ManifestTools.CreateBundleCollection(Manifest, _packageBundleCount); _steps = ESteps.DeserializeBundleList; } if (_steps == ESteps.DeserializeBundleList) @@ -208,14 +146,7 @@ namespace YooAsset packageBundle.Encrypted = _buffer.ReadBool(); packageBundle.Tags = _buffer.ReadUTF8Array(); packageBundle.DependIDs = _buffer.ReadInt32Array(); - packageBundle.ParseBundle(Manifest); - Manifest.BundleList.Add(packageBundle); - Manifest.BundleDic1.Add(packageBundle.BundleName, packageBundle); - Manifest.BundleDic2.Add(packageBundle.FileName, packageBundle); - - // 注意:原始文件可能存在相同的BundleGUID - if (Manifest.BundleDic3.ContainsKey(packageBundle.BundleGUID) == false) - Manifest.BundleDic3.Add(packageBundle.BundleGUID, packageBundle); + ManifestTools.FillBundleCollection(Manifest, packageBundle); _packageBundleCount--; Progress = 1f - _packageBundleCount / _progressTotalValue; @@ -225,10 +156,16 @@ namespace YooAsset if (_packageBundleCount <= 0) { - _steps = ESteps.Done; - Status = EOperationStatus.Succeed; + _steps = ESteps.InitManifest; } } + + if (_steps == ESteps.InitManifest) + { + ManifestTools.InitManifest(Manifest); + _steps = ESteps.Done; + Status = EOperationStatus.Succeed; + } } catch (System.Exception e) { diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PackageAsset.cs b/Assets/YooAsset/Runtime/ResourcePackage/PackageAsset.cs index edfe4cc2..fb5d40b7 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/PackageAsset.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/PackageAsset.cs @@ -31,6 +31,12 @@ namespace YooAsset /// public int BundleID; + /// + /// 所属资源包名称(仅编辑器有效) + /// + [NonSerialized] + public string BundleNameInEditor; + /// /// 是否包含Tag /// diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PackageBundle.cs b/Assets/YooAsset/Runtime/ResourcePackage/PackageBundle.cs index 8efbd0f7..61060978 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/PackageBundle.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/PackageBundle.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Collections.Generic; namespace YooAsset { @@ -46,17 +47,6 @@ namespace YooAsset /// public int[] DependIDs; - - /// - /// 所属的包裹名称 - /// - public string PackageName { private set; get; } - - /// - /// 所属的构建管线 - /// - public string BuildPipeline { private set; get; } - /// /// 资源包GUID /// @@ -65,6 +55,18 @@ namespace YooAsset get { return FileHash; } } + /// + /// 资源包类型 + /// + private int _bundleType; + public int BundleType + { + get + { + return _bundleType; + } + } + /// /// 文件名称 /// @@ -93,18 +95,23 @@ namespace YooAsset } } + /// + /// 包含的主资源集合 + /// + [NonSerialized] + public readonly List IncludeMainAssets = new List(10); + public PackageBundle() { } /// - /// 解析资源包 + /// 初始化资源包 /// - public void ParseBundle(PackageManifest manifest) + public void InitBundle(PackageManifest manifest) { - PackageName = manifest.PackageName; - BuildPipeline = manifest.BuildPipeline; + _bundleType = manifest.BuildBundleType; _fileExtension = ManifestTools.GetRemoteBundleFileExtension(BundleName); _fileName = ManifestTools.GetRemoteBundleFileName(manifest.OutputNameStyle, BundleName, _fileExtension, FileHash); } diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PackageDetail.cs b/Assets/YooAsset/Runtime/ResourcePackage/PackageDetail.cs index 67de00c3..bd4c5c87 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/PackageDetail.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/PackageDetail.cs @@ -28,6 +28,11 @@ namespace YooAsset /// public int OutputNameStyle; + /// + /// 构建资源包类型 + /// + public int BuildBundleType; + /// /// 构建管线名称 /// diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PackageManifest.cs b/Assets/YooAsset/Runtime/ResourcePackage/PackageManifest.cs index 50c58e4f..cb2cbf7f 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/PackageManifest.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/PackageManifest.cs @@ -37,6 +37,11 @@ namespace YooAsset /// public int OutputNameStyle; + /// + /// 构建资源包类型 + /// + public int BuildBundleType; + /// /// 构建管线名称 /// @@ -67,6 +72,23 @@ namespace YooAsset /// public List BundleList = new List(); + /// + /// 资源映射集合(提供AssetPath获取PackageAsset) + /// + [NonSerialized] + public Dictionary AssetDic; + + /// + /// 资源路径映射集合(提供Location获取AssetPath) + /// + [NonSerialized] + public Dictionary AssetPathMapping1; + + /// + /// 资源路径映射集合(提供AssetGUID获取AssetPath) + /// + [NonSerialized] + public Dictionary AssetPathMapping2; /// /// 资源包集合(提供BundleName获取PackageBundle) @@ -86,24 +108,6 @@ namespace YooAsset [NonSerialized] public Dictionary BundleDic3; - /// - /// 资源映射集合(提供AssetPath获取PackageAsset) - /// - [NonSerialized] - public Dictionary AssetDic; - - /// - /// 资源路径映射集合(提供Location获取AssetPath) - /// - [NonSerialized] - public Dictionary AssetPathMapping1; - - /// - /// 资源路径映射集合(提供AssetGUID获取AssetPath) - /// - [NonSerialized] - public Dictionary AssetPathMapping2; - /// /// 获取包裹的详细信息 @@ -116,6 +120,7 @@ namespace YooAsset details.LocationToLower = LocationToLower; details.IncludeAssetGUID = IncludeAssetGUID; details.OutputNameStyle = OutputNameStyle; + details.BuildBundleType = BuildBundleType; details.BuildPipeline = BuildPipeline; details.PackageName = PackageName; details.PackageVersion = PackageVersion; @@ -357,25 +362,6 @@ namespace YooAsset } } - /// - /// 获取资源包内的主资源列表 - /// - public string[] GetBundleIncludeAssets(string assetPath) - { - List assetList = new List(); - if (TryGetPackageAsset(assetPath, out PackageAsset result)) - { - foreach (var packageAsset in AssetList) - { - if (packageAsset.BundleID == result.BundleID) - { - assetList.Add(packageAsset.AssetPath); - } - } - } - return assetList.ToArray(); - } - #region 调试方法 [Conditional("DEBUG")] private void DebugCheckLocation(string location) diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/EditorSimulateBuildParam.cs b/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/EditorSimulateBuildParam.cs index 2a94b901..a946f3b4 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/EditorSimulateBuildParam.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/EditorSimulateBuildParam.cs @@ -3,6 +3,14 @@ namespace YooAsset { public class EditorSimulateBuildParam { + /// + /// 包裹名称 + /// public string PackageName; + + /// + /// 模拟构建管线名称 + /// + public string BuildPipelineName = "EditorSimulateBuildPipeline"; } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/EditorSimulateModeImpl.cs b/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/EditorSimulateModeImpl.cs index aec77f30..be08ca09 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/EditorSimulateModeImpl.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/EditorSimulateModeImpl.cs @@ -106,7 +106,6 @@ namespace YooAsset if (EditorFileSystem.Belong(packageBundle)) { BundleInfo bundleInfo = new BundleInfo(EditorFileSystem, packageBundle); - bundleInfo.IncludeAssetsInEditor = ActiveManifest.GetBundleIncludeAssets(assetInfo.AssetPath); return bundleInfo; } diff --git a/Assets/YooAsset/Runtime/Services/IDecryptionServices.cs b/Assets/YooAsset/Runtime/Services/IDecryptionServices.cs index bf58ecfa..1e954a3e 100644 --- a/Assets/YooAsset/Runtime/Services/IDecryptionServices.cs +++ b/Assets/YooAsset/Runtime/Services/IDecryptionServices.cs @@ -20,20 +20,36 @@ namespace YooAsset /// public uint FileLoadCRC; } + public struct DecryptResult + { + /// + /// 资源包对象 + /// + public AssetBundle Result; + + /// + /// 异步请求句柄 + /// + public AssetBundleCreateRequest CreateRequest; + + /// + /// 托管流对象 + /// 注意:流对象在资源包对象释放的时候会自动释放 + /// + public Stream ManagedStream; + } public interface IDecryptionServices { /// /// 同步方式获取解密的资源包对象 - /// 注意:加载流对象在资源包对象释放的时候会自动释放 /// - AssetBundle LoadAssetBundle(DecryptFileInfo fileInfo, out Stream managedStream); + DecryptResult LoadAssetBundle(DecryptFileInfo fileInfo); /// /// 异步方式获取解密的资源包对象 - /// 注意:加载流对象在资源包对象释放的时候会自动释放 /// - AssetBundleCreateRequest LoadAssetBundleAsync(DecryptFileInfo fileInfo, out Stream managedStream); + DecryptResult LoadAssetBundleAsync(DecryptFileInfo fileInfo); /// /// 获取解密的字节数据