From 7ae6ef94bacdfac37c16f53f2544bd8060887cc2 Mon Sep 17 00:00:00 2001 From: ALEXTANG <574809918@qq.com> Date: Sun, 7 Apr 2024 15:45:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=90=8C=E6=97=B6=E5=AF=B9?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E5=9B=BE=E7=89=87=E8=BF=9B=E8=A1=8C=E5=BC=82?= =?UTF-8?q?=E6=AD=A5SetSprite=E7=9A=84=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正同时对一个图片进行异步SetSprite的处理 --- .../Implement/SetSpriteExtensions.cs | 4 +- .../ResourceExtComponent.Resource.cs | 9 ++++- .../Extension/ResourceExtComponent.cs | 38 ++++++++++++++++++- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Extension/Implement/SetSpriteExtensions.cs b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Extension/Implement/SetSpriteExtensions.cs index 0df8a6cf..99cbf351 100644 --- a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Extension/Implement/SetSpriteExtensions.cs +++ b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Extension/Implement/SetSpriteExtensions.cs @@ -12,7 +12,7 @@ public static class SetSpriteExtensions /// 是否使用原始分辨率。 public static void SetSprite(this Image image, string location, bool setNativeSize = false) { - GameModule.ResourceExt.SetAssetByResources(SetSpriteObject.Create(image, location, setNativeSize)); + GameModule.ResourceExt.SetAssetByResources(SetSpriteObject.Create(image, location, setNativeSize)).Forget(); } /// @@ -22,6 +22,6 @@ public static class SetSpriteExtensions /// 资源定位地址。 public static void SetSprite(this SpriteRenderer spriteRenderer, string location) { - GameModule.ResourceExt.SetAssetByResources(SetSpriteObject.Create(spriteRenderer, location)); + GameModule.ResourceExt.SetAssetByResources(SetSpriteObject.Create(spriteRenderer, location)).Forget(); } } \ No newline at end of file diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Extension/ResourceExtComponent.Resource.cs b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Extension/ResourceExtComponent.Resource.cs index 9e1cd629..9cabc430 100644 --- a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Extension/ResourceExtComponent.Resource.cs +++ b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Extension/ResourceExtComponent.Resource.cs @@ -1,3 +1,5 @@ +using Cysharp.Threading.Tasks; + namespace TEngine { public partial class ResourceExtComponent @@ -17,11 +19,13 @@ namespace TEngine private void OnLoadAssetFailure(string assetName, LoadResourceStatus status, string errormessage, object userdata) { + _assetLoadingList.Remove(assetName); Log.Error("Can not load asset from '{1}' with error message '{2}'.", assetName, errormessage); } private void OnLoadAssetSuccess(string assetName, object asset, float duration, object userdata) { + _assetLoadingList.Remove(assetName); ISetAssetObject setAssetObject = (ISetAssetObject)userdata; UnityEngine.Object assetObject = asset as UnityEngine.Object; if (assetObject != null) @@ -39,8 +43,10 @@ namespace TEngine /// 通过资源系统设置资源。 /// /// 需要设置的对象。 - public void SetAssetByResources(ISetAssetObject setAssetObject) where T : UnityEngine.Object + public async UniTaskVoid SetAssetByResources(ISetAssetObject setAssetObject) where T : UnityEngine.Object { + await TryWaitingLoading(setAssetObject.Location); + if (m_AssetItemPool.CanSpawn(setAssetObject.Location)) { var assetObject = (T)m_AssetItemPool.Spawn(setAssetObject.Location).Target; @@ -48,6 +54,7 @@ namespace TEngine } else { + _assetLoadingList.Add(setAssetObject.Location); m_ResourceModule.LoadAssetAsync(setAssetObject.Location, typeof(T), m_LoadAssetCallbacks, setAssetObject); } } diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Extension/ResourceExtComponent.cs b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Extension/ResourceExtComponent.cs index 7aa5f6a4..fb9a0580 100644 --- a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Extension/ResourceExtComponent.cs +++ b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/Extension/ResourceExtComponent.cs @@ -1,6 +1,9 @@ -using System.Collections; +using System; +using System.Collections; using System.Collections.Generic; +using Cysharp.Threading.Tasks; using UnityEngine; +using Object = UnityEngine.Object; #if ODIN_INSPECTOR using Sirenix.OdinInspector; #endif @@ -13,6 +16,13 @@ namespace TEngine [DisallowMultipleComponent] public partial class ResourceExtComponent : Module { + private readonly TimeoutController _timeoutController = new TimeoutController(); + + /// + /// 正在加载的资源列表。 + /// + private readonly HashSet _assetLoadingList = new HashSet(); + /// /// 检查是否可以释放间隔 /// @@ -104,5 +114,31 @@ namespace TEngine m_LoadAssetObjectsLinkedList.AddLast(new LoadAssetObject(setAssetObject, assetObject)); setAssetObject.SetAsset(assetObject); } + + private async UniTask TryWaitingLoading(string assetObjectKey) + { + if (_assetLoadingList.Contains(assetObjectKey)) + { + try + { + await UniTask.WaitUntil( + () => !_assetLoadingList.Contains(assetObjectKey)) +#if UNITY_EDITOR + .AttachExternalCancellation(_timeoutController.Timeout(TimeSpan.FromSeconds(60))); + _timeoutController.Reset(); +#else + ; +#endif + + } + catch (OperationCanceledException ex) + { + if (_timeoutController.IsTimeout()) + { + Log.Error($"LoadAssetAsync Waiting {assetObjectKey} timeout. reason:{ex.Message}"); + } + } + } + } } } \ No newline at end of file