From cb9129261bb190ea92550e9b385b752481159243 Mon Sep 17 00:00:00 2001 From: ALEXTANG <574809918@qq.com> Date: Mon, 9 Oct 2023 19:32:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=80=9A=E8=BF=87Tag?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E8=B5=84=E6=BA=90=E5=AF=B9=E8=B1=A1=E9=9B=86?= =?UTF-8?q?=E5=90=88=E7=9A=84=E6=8E=A5=E5=8F=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加通过Tag加载资源对象集合的接口。 --- .../ResourceModule/IResourceManager.cs | 11 +- .../Modules/ResourceModule/Operation.meta | 3 + .../Operation/LoadAssetsByTagOperation.cs | 125 ++++++++++++++++++ .../LoadAssetsByTagOperation.cs.meta | 3 + .../Modules/ResourceModule/ResourceManager.cs | 19 ++- .../Modules/ResourceModule/ResourceModule.cs | 12 ++ 6 files changed, 171 insertions(+), 2 deletions(-) create mode 100644 UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Operation.meta create mode 100644 UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Operation/LoadAssetsByTagOperation.cs create mode 100644 UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Operation/LoadAssetsByTagOperation.cs.meta 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); + } /// /// 异步加载场景。