diff --git a/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs b/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs
new file mode 100644
index 00000000..409eebc1
--- /dev/null
+++ b/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs
@@ -0,0 +1,267 @@
+using System.Collections.Generic;
+using System.Threading;
+using Cysharp.Threading.Tasks;
+using UnityEngine;
+using YooAsset;
+
+namespace TEngine
+{
+ ///
+ /// 资源句柄数据。
+ ///
+ public class AssetHandleData : IMemory
+ {
+ ///
+ /// 资源操作句柄。
+ ///
+ private AssetOperationHandle _handle;
+
+ ///
+ /// 标签。
+ ///
+ public string Tag { private set; get; }
+
+ ///
+ /// 释放资源句柄数据对象。
+ ///
+ public void Clear()
+ {
+ if (_handle != null)
+ {
+ _handle.Dispose();
+ }
+
+ _handle = null;
+
+ Tag = string.Empty;
+ }
+
+ ///
+ /// 从内存池中获取资源句柄数据。
+ ///
+ /// 资源操作句柄。
+ /// 标签。
+ /// 资源句柄数据。
+ public static AssetHandleData Alloc(AssetOperationHandle handle, string tag)
+ {
+ AssetHandleData assetHandleData = MemoryPool.Acquire();
+ assetHandleData._handle = handle;
+ assetHandleData.Tag = tag;
+ return assetHandleData;
+ }
+
+ ///
+ /// 释放资源句柄数据到内存池。
+ ///
+ /// 释放资源句柄数据。
+ public static void Release(AssetHandleData assetHandleData)
+ {
+ if (assetHandleData == null)
+ {
+ Log.Fatal("Release AssetHandleData Failed !");
+ return;
+ }
+
+ MemoryPool.Release(assetHandleData);
+ }
+ }
+
+ ///
+ /// 资源分组数据。
+ /// DisposeGroup。
+ ///
+ public class AssetGroup : IMemory
+ {
+ private Dictionary _handles = new Dictionary(16);
+
+ ///
+ /// 注册资源数据到资源组内。
+ ///
+ /// 资源操作句柄。
+ /// 资源标识。
+ /// 是否注册成功。
+ public bool Register(AssetOperationHandle handle, string tag = "ROOT")
+ {
+ if (_handles.TryGetValue(tag, out var handleData))
+ {
+ _handles.Remove(tag);
+ AssetHandleData.Release(handleData);
+ handleData = null;
+ }
+
+ handleData = AssetHandleData.Alloc(handle, tag);
+ _handles.Add(tag, handleData);
+ return true;
+ }
+
+ ///
+ /// 从资源组内反注册资源数据。
+ ///
+ ///
+ ///
+ public bool UnRegister(string tag)
+ {
+ if (_handles.TryGetValue(tag, out var handleData))
+ {
+ _handles.Remove(tag);
+ AssetHandleData.Release(handleData);
+ return true;
+ }
+
+ Log.Warning($"UnRegister AssetHandleData Tag:{tag} Failed");
+ return false;
+ }
+
+ public void Clear()
+ {
+ var etr = _handles.GetEnumerator();
+ while (etr.MoveNext())
+ {
+ AssetHandleData assetHandleData = etr.Current.Value;
+ AssetHandleData.Release(assetHandleData);
+ }
+
+ etr.Dispose();
+ _handles.Clear();
+ }
+
+ ///
+ /// 从内存池中获取资源分组数据。
+ ///
+ /// 资源分组数据。
+ public static AssetGroup Alloc()
+ {
+ AssetGroup assetGroup = MemoryPool.Acquire();
+
+ return assetGroup;
+ }
+
+ ///
+ /// 将内存对象归还内存池。
+ ///
+ ///
+ public static void Release(AssetGroup assetGroup)
+ {
+ if (assetGroup == null)
+ {
+ Log.Fatal("Release AssetGroup Failed !");
+ return;
+ }
+
+ MemoryPool.Release(assetGroup);
+ }
+
+ ///
+ /// 同步加载资源。
+ ///
+ /// 要加载资源的名称。
+ /// 要加载资源的标签名称。
+ /// 要加载资源的类型。
+ /// 资源实例。
+ public T LoadAsset(string assetName, string tag) where T : Object
+ {
+ if (string.IsNullOrEmpty(assetName))
+ {
+ Log.Error("Asset name is invalid.");
+ return default;
+ }
+
+ AssetOperationHandle handle = YooAssets.LoadAssetSync(assetName);
+
+ Register(handle, tag);
+
+ if (typeof(T) == typeof(GameObject))
+ {
+ GameObject ret = handle.InstantiateSync();
+ return ret as T;
+ }
+ else
+ {
+ return handle.AssetObject as T;
+ }
+ }
+
+ ///
+ /// 同步加载资源。
+ ///
+ /// 要加载资源的名称。
+ /// 父节点位置。
+ /// 要加载资源的标签名称。
+ /// 要加载资源的类型。
+ /// 资源实例。
+ public T LoadAsset(string assetName, Transform parent, string tag) where T : Object
+ {
+ if (string.IsNullOrEmpty(assetName))
+ {
+ Log.Error("Asset name is invalid.");
+ return default;
+ }
+
+ AssetOperationHandle handle = YooAssets.LoadAssetSync(assetName);
+
+ Register(handle, tag);
+
+ if (typeof(T) == typeof(GameObject))
+ {
+ GameObject ret = handle.InstantiateSync(parent);
+ return ret as T;
+ }
+ else
+ {
+ return handle.AssetObject as T;
+ }
+ }
+
+ ///
+ /// 异步加载资源实例。
+ ///
+ /// 要加载的实例名称。
+ /// 要加载资源的标签名称。
+ /// 取消操作Token。
+ /// 资源实实例。
+ public async UniTask LoadAssetAsync(string assetName, string tag, CancellationToken cancellationToken) where T : Object
+ {
+ AssetOperationHandle handle = GameModule.Resource.LoadAssetAsyncHandle(assetName);
+
+ Register(handle, tag);
+
+ bool cancelOrFailed = await handle.ToUniTask(cancellationToken: cancellationToken).SuppressCancellationThrow();
+
+ if (cancelOrFailed)
+ {
+ UnRegister(tag);
+
+ return null;
+ }
+
+ return handle.AssetObject as T;
+ }
+
+ ///
+ /// 异步加载游戏物体。
+ ///
+ /// 要加载的游戏物体名称。
+ /// 要加载资源的标签名称。
+ /// 取消操作Token。
+ /// 异步游戏物体实例。
+ public async UniTask LoadGameObjectAsync(string assetName, string tag, CancellationToken cancellationToken)
+ {
+ AssetOperationHandle handle = GameModule.Resource.LoadAssetAsyncHandle(assetName);
+
+ Register(handle, tag);
+
+ bool cancelOrFailed = await handle.ToUniTask(cancellationToken: cancellationToken).SuppressCancellationThrow();
+
+ if (cancelOrFailed)
+ {
+ UnRegister(tag);
+
+ return null;
+ }
+
+ GameObject ret = handle.InstantiateSync();
+
+ return ret;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs.meta b/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs.meta
new file mode 100644
index 00000000..041541ed
--- /dev/null
+++ b/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 0f5648c599534f53a62688f519d430f8
+timeCreated: 1680757246
\ No newline at end of file