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