108 lines
3.1 KiB
C#
108 lines
3.1 KiB
C#
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;
|
|
}
|
|
}
|
|
} |