using System; using System.Threading; using Cysharp.Threading.Tasks; using UnityEngine; namespace AlicizaX.UI.Runtime { [DisallowMultipleComponent] public abstract class UIHolderObjectBase : UnityEngine.MonoBehaviour { public Action OnWindowInitEvent; public Action OnWindowBeforeShowEvent; public Action OnWindowAfterShowEvent; public Action OnWindowBeforeClosedEvent; public Action OnWindowAfterClosedEvent; public Action OnWindowDestroyEvent; private GameObject _target; private IUITransitionPlayer _transitionPlayer; /// /// UI实例资源对象。 /// public GameObject Target => _target ??= gameObject; private RectTransform _rectTransform; /// /// 窗口矩阵位置组件。 /// public RectTransform RectTransform => _rectTransform ??= _target.transform as RectTransform; /// /// 可见性 /// public bool Visible { get => Target.activeSelf; internal set { _target.SetActive(value); } } public virtual void Awake() { _target = gameObject; } private bool _isAlive = true; public bool IsValid() { return this != null && _isAlive; } internal UniTask PlayOpenTransitionAsync(CancellationToken cancellationToken = default) { return TryGetTransitionPlayer(out var transitionPlayer) ? transitionPlayer.PlayOpenAsync(cancellationToken) : UniTask.CompletedTask; } internal UniTask PlayCloseTransitionAsync(CancellationToken cancellationToken = default) { return TryGetTransitionPlayer(out var transitionPlayer) ? transitionPlayer.PlayCloseAsync(cancellationToken) : UniTask.CompletedTask; } internal void StopTransition() { if (TryGetTransitionPlayer(out var transitionPlayer)) { transitionPlayer.Stop(); } } private bool TryGetTransitionPlayer(out IUITransitionPlayer transitionPlayer) { if (_transitionPlayer != null) { transitionPlayer = _transitionPlayer; return true; } MonoBehaviour[] behaviours = GetComponents(); for (int i = 0; i < behaviours.Length; i++) { if (behaviours[i] is IUITransitionPlayer player) { _transitionPlayer = player; transitionPlayer = player; return true; } } transitionPlayer = null; return false; } private void OnDestroy() { _isAlive = false; _transitionPlayer = null; } } }