1
This commit is contained in:
108
Src/Unity/Scripts/UX/Waiting/UXWaiting.cs
Normal file
108
Src/Unity/Scripts/UX/Waiting/UXWaiting.cs
Normal file
@@ -0,0 +1,108 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using BITKit.UX;
|
||||
using UnityEngine;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using kcp2k;
|
||||
using UnityEngine.Pool;
|
||||
using UnityEngine.UIElements;
|
||||
namespace BITKit
|
||||
{
|
||||
public class UXWaiting : MonoBehaviour,IUXWaiting
|
||||
{
|
||||
public sealed class WaitingHandle : IUXWaitingHandle
|
||||
{
|
||||
public string Message
|
||||
{
|
||||
get => label.text;
|
||||
set => SetMessage(value);
|
||||
}
|
||||
public object Container => container;
|
||||
internal VisualElement container;
|
||||
internal Label label;
|
||||
public async void SetMessage(string message)
|
||||
{
|
||||
await UniTask.SwitchToMainThread();
|
||||
if(container.panel!=null)
|
||||
{
|
||||
label.text = message;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[SerializeField] private VisualTreeAsset handleTemplate;
|
||||
[SerializeField] private bool asGlobal;
|
||||
|
||||
[UXBindPath("waiting-container")]
|
||||
private VisualElement _container;
|
||||
[UXBindPath("waiting-root")]
|
||||
private VisualElement _root;
|
||||
|
||||
private Pool<IUXWaitingHandle> _pool;
|
||||
|
||||
public IUXWaitingHandle Get()
|
||||
{
|
||||
var handle = _pool.Take();
|
||||
Active();
|
||||
return handle;
|
||||
async void Active()
|
||||
{
|
||||
await UniTask.SwitchToMainThread();
|
||||
handle.As<WaitingHandle>().container.SetActive(true);
|
||||
_root.SetActive(true);
|
||||
}
|
||||
}
|
||||
public async void Release(IUXWaitingHandle handle)
|
||||
{
|
||||
_pool.Return(handle);
|
||||
Check();
|
||||
}
|
||||
private void Awake()
|
||||
{
|
||||
UXUtils.Inject(this);
|
||||
foreach (var x in _container.Children().ToArray())
|
||||
{
|
||||
x.RemoveFromHierarchy();
|
||||
}
|
||||
|
||||
_pool = new Pool<IUXWaitingHandle>(Create,OnReset,10);
|
||||
|
||||
if (asGlobal)
|
||||
{
|
||||
DI.Register<IUXWaiting>(this);
|
||||
}
|
||||
|
||||
_root.SetActive(false);
|
||||
}
|
||||
|
||||
private async void OnReset(IUXWaitingHandle obj)
|
||||
{
|
||||
await UniTask.SwitchToMainThread();
|
||||
obj.As<WaitingHandle>().container.SetActive(false);
|
||||
}
|
||||
private async void Check()
|
||||
{
|
||||
await UniTask.Yield();
|
||||
await UniTask.SwitchToMainThread();
|
||||
if(destroyCancellationToken.IsCancellationRequested) return;
|
||||
_root.SetActive(_container.Children().Any(x=>x.style.display != DisplayStyle.None));
|
||||
}
|
||||
|
||||
private IUXWaitingHandle Create()
|
||||
{
|
||||
var handle = new WaitingHandle
|
||||
{
|
||||
container = _container.Create(handleTemplate),
|
||||
label = _container.Q<Label>(UXConstant.ContextLabel)
|
||||
};
|
||||
|
||||
handle.SetMessage($"未初始化");
|
||||
|
||||
handle.container.SetActive(false);
|
||||
|
||||
return handle;
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,34 +0,0 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using UnityEngine.UIElements;
|
||||
namespace BITKit
|
||||
{
|
||||
public class WaitingScreen : MonoBehaviour
|
||||
{
|
||||
static ValidHandle isWaiting = new();
|
||||
public static void Excute(object obj)
|
||||
{
|
||||
isWaiting.AddElement(obj);
|
||||
}
|
||||
public static void Complete(object obj)
|
||||
{
|
||||
isWaiting.RemoveElement(obj);
|
||||
}
|
||||
[Header(Constant.Header.Components)]
|
||||
public UIDocument document;
|
||||
void Start()
|
||||
{
|
||||
isWaiting = new();
|
||||
isWaiting.AddListener(SetWaiting);
|
||||
|
||||
isWaiting.Invoke();
|
||||
}
|
||||
async void SetWaiting(bool wait)
|
||||
{
|
||||
await UniTask.SwitchToMainThread();
|
||||
document.rootVisualElement.SetActive(wait);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user