diff --git a/Assets/YooAsset/Runtime/AssetSystem/AssetSystem.cs b/Assets/YooAsset/Runtime/AssetSystem/AssetSystem.cs
index a80e830..ef158fb 100644
--- a/Assets/YooAsset/Runtime/AssetSystem/AssetSystem.cs
+++ b/Assets/YooAsset/Runtime/AssetSystem/AssetSystem.cs
@@ -130,7 +130,7 @@ namespace YooAsset
///
- /// 异步加载场景
+ /// 加载场景
///
public static SceneOperationHandle LoadSceneAsync(string scenePath, LoadSceneMode sceneMode, bool activateOnLoad, int priority)
{
@@ -161,7 +161,7 @@ namespace YooAsset
}
///
- /// 异步加载资源对象
+ /// 加载资源对象
///
public static AssetOperationHandle LoadAssetAsync(string assetPath, System.Type assetType)
{
@@ -179,7 +179,7 @@ namespace YooAsset
}
///
- /// 异步加载所有子资源对象
+ /// 加载子资源对象
///
public static SubAssetsOperationHandle LoadSubAssetsAsync(string assetPath, System.Type assetType)
{
@@ -196,6 +196,24 @@ namespace YooAsset
return provider.CreateHandle() as SubAssetsOperationHandle;
}
+ ///
+ /// 加载资源包里的所有资源对象
+ ///
+ public static AllAssetsOperationHandle LoadAllAssetsAsync(string assetPath, System.Type assetType)
+ {
+ ProviderBase provider = TryGetProvider(assetPath);
+ if (provider == null)
+ {
+ if (SimulationOnEditor)
+ provider = new DatabaseAllAssetsProvider(assetPath, assetType);
+ else
+ provider = new BundledAllAssetsProvider(assetPath, assetType);
+ provider.InitSpawnDebugInfo();
+ _providers.Add(provider);
+ }
+ return provider.CreateHandle() as AllAssetsOperationHandle;
+ }
+
internal static void UnloadSubScene(ProviderBase provider)
{
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Handles/AllAssetsOperationHandle.cs b/Assets/YooAsset/Runtime/AssetSystem/Handles/AllAssetsOperationHandle.cs
new file mode 100644
index 0000000..3d0ae3e
--- /dev/null
+++ b/Assets/YooAsset/Runtime/AssetSystem/Handles/AllAssetsOperationHandle.cs
@@ -0,0 +1,69 @@
+
+namespace YooAsset
+{
+ public sealed class AllAssetsOperationHandle : OperationHandleBase
+ {
+ private System.Action _callback;
+
+ internal AllAssetsOperationHandle(ProviderBase provider) : base(provider)
+ {
+ }
+ internal override void InvokeCallback()
+ {
+ _callback?.Invoke(this);
+ }
+
+ ///
+ /// 完成委托
+ ///
+ public event System.Action Completed
+ {
+ add
+ {
+ if (IsValid == false)
+ throw new System.Exception($"{nameof(AllAssetsOperationHandle)} is invalid");
+ if (Provider.IsDone)
+ value.Invoke(this);
+ else
+ _callback += value;
+ }
+ remove
+ {
+ if (IsValid == false)
+ throw new System.Exception($"{nameof(AllAssetsOperationHandle)} is invalid");
+ _callback -= value;
+ }
+ }
+
+ ///
+ /// 资源包内的资源对象集合
+ ///
+ public UnityEngine.Object[] AllAssetObjects
+ {
+ get
+ {
+ if (IsValid == false)
+ return null;
+ return Provider.AllAssetObjects;
+ }
+ }
+
+ ///
+ /// 等待异步执行完毕
+ ///
+ public void WaitForAsyncComplete()
+ {
+ if (IsValid == false)
+ return;
+ Provider.WaitForAsyncComplete();
+ }
+
+ ///
+ /// 释放资源句柄
+ ///
+ public void Release()
+ {
+ this.ReleaseInternal();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Handles/AllAssetsOperationHandle.cs.meta b/Assets/YooAsset/Runtime/AssetSystem/Handles/AllAssetsOperationHandle.cs.meta
new file mode 100644
index 0000000..b5dd03a
--- /dev/null
+++ b/Assets/YooAsset/Runtime/AssetSystem/Handles/AllAssetsOperationHandle.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 05c287035a2264f469a654a6152b02c9
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledAllAssetsProvider.cs b/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledAllAssetsProvider.cs
new file mode 100644
index 0000000..420a2b6
--- /dev/null
+++ b/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledAllAssetsProvider.cs
@@ -0,0 +1,116 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace YooAsset
+{
+ internal sealed class BundledAllAssetsProvider : BundledProvider
+ {
+ private AssetBundleRequest _cacheRequest;
+ public override float Progress
+ {
+ get
+ {
+ if (_cacheRequest == null)
+ return 0;
+ return _cacheRequest.progress;
+ }
+ }
+
+ public BundledAllAssetsProvider(string assetPath, System.Type assetType)
+ : base(assetPath, assetType)
+ {
+ }
+ public override void Update()
+ {
+ if (IsDone)
+ return;
+
+ if (Status == EStatus.None)
+ {
+ Status = EStatus.CheckBundle;
+ }
+
+ // 1. 检测资源包
+ if (Status == EStatus.CheckBundle)
+ {
+ if (IsWaitForAsyncComplete)
+ {
+ DependBundles.WaitForAsyncComplete();
+ OwnerBundle.WaitForAsyncComplete();
+ }
+
+ if (DependBundles.IsDone() == false)
+ return;
+ if (OwnerBundle.IsDone() == false)
+ return;
+
+ if (DependBundles.IsSucceed() == false)
+ {
+ Status = EStatus.Fail;
+ LastError = DependBundles.GetLastError();
+ InvokeCompletion();
+ return;
+ }
+
+ if (OwnerBundle.Status != AssetBundleLoaderBase.EStatus.Succeed)
+ {
+ Status = EStatus.Fail;
+ LastError = OwnerBundle.LastError;
+ InvokeCompletion();
+ return;
+ }
+
+ Status = EStatus.Loading;
+ }
+
+ // 2. 加载资源对象
+ if (Status == EStatus.Loading)
+ {
+ if (IsWaitForAsyncComplete)
+ {
+ if (AssetType == null)
+ AllAssetObjects = OwnerBundle.CacheBundle.LoadAllAssets();
+ else
+ AllAssetObjects = OwnerBundle.CacheBundle.LoadAllAssets(AssetType);
+ }
+ else
+ {
+ if (AssetType == null)
+ _cacheRequest = OwnerBundle.CacheBundle.LoadAllAssetsAsync();
+ else
+ _cacheRequest = OwnerBundle.CacheBundle.LoadAllAssetsAsync(AssetType);
+ }
+ Status = EStatus.Checking;
+ }
+
+ // 3. 检测加载结果
+ if (Status == EStatus.Checking)
+ {
+ if (_cacheRequest != null)
+ {
+ if (IsWaitForAsyncComplete)
+ {
+ // 强制挂起主线程(注意:该操作会很耗时)
+ YooLogger.Warning("Suspend the main thread to load unity asset.");
+ AllAssetObjects = _cacheRequest.allAssets;
+ }
+ else
+ {
+ if (_cacheRequest.isDone == false)
+ return;
+ AllAssetObjects = _cacheRequest.allAssets;
+ }
+ }
+
+ Status = AllAssetObjects == null ? EStatus.Fail : EStatus.Success;
+ if (Status == EStatus.Fail)
+ {
+ LastError = $"Failed to load all assets from bundle : {OwnerBundle.BundleFileInfo.BundleName}";
+ YooLogger.Error(LastError);
+ }
+ InvokeCompletion();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledAllAssetsProvider.cs.meta b/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledAllAssetsProvider.cs.meta
new file mode 100644
index 0000000..c2a5778
--- /dev/null
+++ b/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledAllAssetsProvider.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: dd972d8e33cbbaf4aa7f976d59896b0e
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseAllAssetsProvider.cs b/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseAllAssetsProvider.cs
new file mode 100644
index 0000000..b88f6b6
--- /dev/null
+++ b/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseAllAssetsProvider.cs
@@ -0,0 +1,127 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace YooAsset
+{
+ internal sealed class DatabaseAllAssetsProvider : ProviderBase
+ {
+ private string _bundleName;
+
+ public override float Progress
+ {
+ get
+ {
+ if (IsDone)
+ return 100f;
+ else
+ return 0;
+ }
+ }
+
+ public DatabaseAllAssetsProvider(string assetPath, System.Type assetType)
+ : base(assetPath, assetType)
+ {
+ }
+ public override void Update()
+ {
+#if UNITY_EDITOR
+ if (IsDone)
+ return;
+
+ if (Status == EStatus.None)
+ {
+ // 检测资源文件是否存在
+ string guid = UnityEditor.AssetDatabase.AssetPathToGUID(AssetPath);
+ if (string.IsNullOrEmpty(guid))
+ {
+ Status = EStatus.Fail;
+ LastError = $"Not found asset : {AssetPath}";
+ YooLogger.Error(LastError);
+ InvokeCompletion();
+ return;
+ }
+
+ // 获取资源包名称
+ _bundleName = AssetSystem.BundleServices.GetBundleName(AssetPath);
+ if (string.IsNullOrEmpty(_bundleName))
+ {
+ Status = EStatus.Fail;
+ LastError = $"Not found bundle name : {AssetPath}";
+ YooLogger.Error(LastError);
+ InvokeCompletion();
+ return;
+ }
+
+ Status = EStatus.Loading;
+
+ // 注意:模拟异步加载效果提前返回
+ if (IsWaitForAsyncComplete == false)
+ return;
+ }
+
+ // 1. 加载资源对象
+ if (Status == EStatus.Loading)
+ {
+ bool loadFailed = false;
+ if (AssetType == null)
+ {
+ List result = new List