新增GetUIAsync,ShowUIAsyncAwait

新增GetUIAsync,ShowUIAsyncAwait
This commit is contained in:
ALEXTANGXIAO
2024-08-11 10:24:27 +08:00
parent 6ff9546152
commit 4911ec074c

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.UI;
using YooAsset;
@@ -268,6 +269,16 @@ namespace TEngine
ShowUIImp(typeof(T), false, userDatas);
}
/// <summary>
/// 异步打开窗口。
/// </summary>
/// <param name="userDatas">用户自定义数据。</param>
/// <returns>打开窗口操作句柄。</returns>
public async UniTask<UIWindow> ShowUIAsyncAwait<T>(params System.Object[] userDatas) where T : UIWindow
{
return await ShowUIAwaitImp(typeof(T), true, userDatas);
}
/// <summary>
/// 同步打开窗口。
/// </summary>
@@ -299,6 +310,38 @@ namespace TEngine
}
}
private async UniTask<UIWindow> 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;
}
}
/// <summary>
/// 关闭窗口
/// </summary>
@@ -460,6 +503,88 @@ namespace TEngine
return window;
}
/// <summary>
/// 异步获取窗口。
/// </summary>
/// <returns>打开窗口操作句柄。</returns>
public async UniTask<T> GetUIAsyncAwait<T>() 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;
}
/// <summary>
/// 异步获取窗口。
/// </summary>
/// <param name="callback">回调。</param>
/// <returns>打开窗口操作句柄。</returns>
public void GetUIAsync<T>(Action<T> 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<T> 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)
{
for (int i = 0; i < _stack.Count; i++)