diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/UIModule/UIModule.cs b/UnityProject/Assets/TEngine/Runtime/Modules/UIModule/UIModule.cs index 18bf7a1b..cd9e8ad5 100644 --- a/UnityProject/Assets/TEngine/Runtime/Modules/UIModule/UIModule.cs +++ b/UnityProject/Assets/TEngine/Runtime/Modules/UIModule/UIModule.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Cysharp.Threading.Tasks; using UnityEngine; using UnityEngine.UI; using YooAsset; @@ -267,6 +268,16 @@ namespace TEngine { ShowUIImp(typeof(T), false, userDatas); } + + /// + /// 异步打开窗口。 + /// + /// 用户自定义数据。 + /// 打开窗口操作句柄。 + public async UniTask ShowUIAsyncAwait(params System.Object[] userDatas) where T : UIWindow + { + return await ShowUIAwaitImp(typeof(T), true, userDatas); + } /// /// 同步打开窗口。 @@ -298,6 +309,38 @@ namespace TEngine window.InternalLoad(window.AssetName, OnWindowPrepare, isAsync, userDatas).Forget(); } } + + private async UniTask ShowUIAwaitImp(Type type, bool isAsync, params System.Object[] userDatas) + { + string windowName = type.FullName; + + // 如果窗口已经存在 + if (IsContains(windowName)) + { + UIWindow window = GetWindow(windowName); + Pop(window); //弹出窗口 + Push(window); //重新压入 + window.TryInvoke(OnWindowPrepare, userDatas); + return window; + } + else + { + UIWindow window = CreateInstance(type); + Push(window); //首次压入 + window.InternalLoad(window.AssetName, OnWindowPrepare, isAsync, userDatas).Forget(); + float time = 0f; + while (!window.IsLoadDone) + { + time += Time.time; + if (time > 60f) + { + break; + } + await UniTask.Yield(); + } + return window; + } + } /// /// 关闭窗口 @@ -459,6 +502,88 @@ namespace TEngine return window; } + + /// + /// 异步获取窗口。 + /// + /// 打开窗口操作句柄。 + public async UniTask GetUIAsyncAwait() where T : UIWindow + { + string windowName = typeof(T).FullName; + var window = GetWindow(windowName); + if (window == null) + { + return null; + } + + var ret = window as T; + + if (ret == null) + { + return null; + } + + if (ret.IsLoadDone) + { + return ret; + } + + float time = 0f; + while (!ret.IsLoadDone) + { + time += Time.time; + if (time > 60f) + { + break; + } + await UniTask.Yield(); + } + return ret; + } + + /// + /// 异步获取窗口。 + /// + /// 回调。 + /// 打开窗口操作句柄。 + public void GetUIAsync(Action callback) where T : UIWindow + { + string windowName = typeof(T).FullName; + var window = GetWindow(windowName); + if (window == null) + { + return; + } + + var ret = window as T; + + if (ret == null) + { + return; + } + + if (ret.IsLoadDone) + { + return; + } + + GetUIAsyncImp(callback).Forget(); + + async UniTaskVoid GetUIAsyncImp(Action ctx) + { + float time = 0f; + while (!ret.IsLoadDone) + { + time += Time.time; + if (time > 60f) + { + break; + } + await UniTask.Yield(); + } + ctx?.Invoke(ret); + } + } private UIWindow GetWindow(string windowName) {