diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/IResourceManager.cs b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/IResourceManager.cs
index 312ac7e4..f637095f 100644
--- a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/IResourceManager.cs
+++ b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/IResourceManager.cs
@@ -1,4 +1,5 @@
-using System.Threading;
+using System.Collections.Generic;
+using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.SceneManagement;
@@ -226,6 +227,14 @@ namespace TEngine
/// 资源信息。
public SubAssetsOperationHandle LoadSubAssetsSync(AssetInfo assetInfo);
+ ///
+ /// 通过Tag加载资源对象集合。
+ ///
+ /// 资源标识。
+ /// 资源类型。
+ /// 资源对象集合。
+ UniTask> LoadAssetsByTagAsync(string assetTag) where T : UnityEngine.Object;
+
///
/// 异步加载场景。
///
diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Operation.meta b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Operation.meta
new file mode 100644
index 00000000..b9f43e7e
--- /dev/null
+++ b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Operation.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 3b36f61f6af84adcb3bdba5976c7d9e6
+timeCreated: 1696849773
\ No newline at end of file
diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Operation/LoadAssetsByTagOperation.cs b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Operation/LoadAssetsByTagOperation.cs
new file mode 100644
index 00000000..57e98bc4
--- /dev/null
+++ b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Operation/LoadAssetsByTagOperation.cs
@@ -0,0 +1,125 @@
+using System.Collections.Generic;
+using UnityEngine;
+using YooAsset;
+
+namespace TEngine
+{
+ ///
+ /// 通过资源标识加载资源。
+ ///
+ /// 资源实例类型。
+ public class LoadAssetsByTagOperation : GameAsyncOperation where TObject : UnityEngine.Object
+ {
+ private enum ESteps
+ {
+ None,
+ LoadAssets,
+ CheckResult,
+ Done,
+ }
+
+ private readonly string _tag;
+ private ESteps _steps = ESteps.None;
+ private List _handles;
+
+ ///
+ /// 资源对象集合
+ ///
+ public List AssetObjects { private set; get; }
+
+
+ public LoadAssetsByTagOperation(string tag)
+ {
+ _tag = tag;
+ }
+
+ protected override void OnStart()
+ {
+ _steps = ESteps.LoadAssets;
+ }
+
+ protected override void OnUpdate()
+ {
+ if (_steps == ESteps.None || _steps == ESteps.Done)
+ return;
+
+ if (_steps == ESteps.LoadAssets)
+ {
+ AssetInfo[] assetInfos = YooAssets.GetAssetInfos(_tag);
+ _handles = new List(assetInfos.Length);
+ foreach (var assetInfo in assetInfos)
+ {
+ var handle = YooAssets.LoadAssetAsync(assetInfo);
+ _handles.Add(handle);
+ }
+
+ _steps = ESteps.CheckResult;
+ }
+
+ if (_steps == ESteps.CheckResult)
+ {
+ int index = 0;
+ foreach (var handle in _handles)
+ {
+ if (handle.IsDone == false)
+ {
+ Progress = (float)index / _handles.Count;
+ return;
+ }
+
+ index++;
+ }
+
+ AssetObjects = new List(_handles.Count);
+ foreach (var handle in _handles)
+ {
+ if (handle.Status == EOperationStatus.Succeed)
+ {
+ var assetObject = handle.AssetObject as TObject;
+ if (assetObject != null)
+ {
+ AssetObjects.Add(assetObject);
+ }
+ else
+ {
+ string error = $"资源类型转换失败:{handle.AssetObject.name}";
+ Debug.LogError($"{error}");
+ AssetObjects.Clear();
+ SetFinish(false, error);
+ return;
+ }
+ }
+ else
+ {
+ Debug.LogError($"{handle.LastError}");
+ AssetObjects.Clear();
+ SetFinish(false, handle.LastError);
+ return;
+ }
+ }
+
+ SetFinish(true);
+ }
+ }
+
+ private void SetFinish(bool succeed, string error = "")
+ {
+ Error = error;
+ Status = succeed ? EOperationStatus.Succeed : EOperationStatus.Failed;
+ _steps = ESteps.Done;
+ }
+
+ ///
+ /// 释放资源句柄
+ ///
+ public void ReleaseHandle()
+ {
+ foreach (var handle in _handles)
+ {
+ handle.Release();
+ }
+
+ _handles.Clear();
+ }
+ }
+}
\ No newline at end of file
diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Operation/LoadAssetsByTagOperation.cs.meta b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Operation/LoadAssetsByTagOperation.cs.meta
new file mode 100644
index 00000000..c39026b6
--- /dev/null
+++ b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Operation/LoadAssetsByTagOperation.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: b49f6372b68a4871baed40595ac22c61
+timeCreated: 1696849782
\ No newline at end of file
diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceManager.cs b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceManager.cs
index baa8ce79..8c2a6386 100644
--- a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceManager.cs
+++ b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceManager.cs
@@ -1,4 +1,5 @@
-using System.Threading;
+using System.Collections.Generic;
+using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.SceneManagement;
@@ -534,6 +535,22 @@ namespace TEngine
{
return YooAssets.LoadSubAssetsSync(assetInfo);
}
+
+ ///
+ /// 通过Tag加载资源对象集合。
+ ///
+ /// 资源标识。
+ /// 资源类型。
+ /// 资源对象集合。
+ public async UniTask>LoadAssetsByTagAsync(string assetTag) where T: UnityEngine.Object
+ {
+ LoadAssetsByTagOperation operation = new LoadAssetsByTagOperation(assetTag);
+ YooAssets.StartOperation(operation);
+ await operation.ToUniTask();
+ List assetObjects = operation.AssetObjects;
+ operation.ReleaseHandle();
+ return assetObjects;
+ }
///
/// 异步加载场景。
diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceModule.cs b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceModule.cs
index e818936e..53e0b819 100644
--- a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceModule.cs
+++ b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceModule.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections.Generic;
using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine;
@@ -536,6 +537,17 @@ namespace TEngine
return m_ResourceManager.LoadSubAssetsSync(assetInfo);
}
+
+ ///
+ /// 通过Tag加载资源对象集合。
+ ///
+ /// 资源标识。
+ /// 资源类型。
+ /// 资源对象集合。
+ public async UniTask>LoadAssetsByTagAsync(string assetTag) where T: UnityEngine.Object
+ {
+ return await m_ResourceManager.LoadAssetsByTagAsync(assetTag);
+ }
///
/// 异步加载场景。