using Cysharp.Threading.Tasks; using SepCore.Definition; using SepCore.UI; using UnityGameFramework.Runtime; namespace SepCore.AsyncTask { /// /// UI 异步扩展方法 /// public static class UIAsyncExtension { /// /// 等待界面打开完成 /// /// UI组件 /// 界面序列编号 /// 超时时间(秒),0表示不超时 /// 打开的界面 public static UniTask WaitOpenUIFormAsync(this UIComponent uiComponent, int serialId, float timeout = 30f) { return AsyncTaskHelper.WaitSuccessOrFailureAsync( OpenUIFormSuccessEventArgs.EventId, OpenUIFormFailureEventArgs.EventId, successArgs => successArgs.UIForm.SerialId == serialId, failureArgs => failureArgs.SerialId == serialId, timeout ).ContinueWith(successArgs => successArgs.UIForm); } /// /// 异步打开界面 /// /// UI组件 /// 界面资源名称 /// 界面组名称 /// 是否暂停被覆盖的界面 /// 用户自定义数据 /// 超时时间(秒),0表示不超时 /// 打开的界面 public static UniTask OpenUIFormAsync(this UIComponent uiComponent, string uiFormAssetName, string uiGroupName, bool pauseCoveredUIForm = true, object userData = null, float timeout = 30f) { int serialId = 0; UniTask waitTask = AsyncTaskHelper.WaitSuccessOrFailureAsync( OpenUIFormSuccessEventArgs.EventId, OpenUIFormFailureEventArgs.EventId, successArgs => successArgs.UIForm.SerialId == serialId, failureArgs => failureArgs.SerialId == serialId, timeout ).ContinueWith(successArgs => successArgs.UIForm); serialId = uiComponent.OpenUIForm(uiFormAssetName, uiGroupName, pauseCoveredUIForm, userData); return waitTask; } /// /// 异步打开界面(通过界面编号) /// /// UI组件 /// 界面类型 /// 用户自定义数据 /// 超时时间(秒),0表示不超时 /// 打开的界面 public static UniTask OpenUIFormAsync(this UIComponent uiComponent, UIFormType uiType, object userData = null, float timeout = 30f) { int? serialId = uiComponent.OpenUIForm(uiType, userData); if (!serialId.HasValue) { return UniTask.FromResult(null); } return uiComponent.WaitOpenUIFormAsync(serialId.Value, timeout); } /// /// 异步关闭界面 /// /// UI组件 /// 界面序列编号 /// 用户自定义数据 /// 超时时间(秒),0表示不超时 /// 关闭完成事件 public static UniTask CloseUIFormAsync(this UIComponent uiComponent, int serialId, object userData = null, float timeout = 30f) { UniTask waitTask = AsyncTaskHelper.WaitEventAsync( CloseUIFormCompleteEventArgs.EventId, args => args.SerialId == serialId, timeout ); uiComponent.CloseUIForm(serialId, userData); return waitTask; } /// /// 异步关闭界面(通过界面对象) /// /// UI组件 /// 要关闭的界面 /// 用户自定义数据 /// 超时时间(秒),0表示不超时 /// 关闭完成事件 public static UniTask CloseUIFormAsync(this UIComponent uiComponent, UIForm uiForm, object userData = null, float timeout = 30f) { return CloseUIFormAsync(uiComponent, uiForm.SerialId, userData, timeout); } } }