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 is Behaviour cachedBehaviour && cachedBehaviour.isActiveAndEnabled) { transitionPlayer = _transitionPlayer; return true; } _transitionPlayer = null; int bestPriority = int.MinValue; MonoBehaviour[] behaviours = GetComponents(); for (int i = 0; i < behaviours.Length; i++) { MonoBehaviour behaviour = behaviours[i]; if (behaviours.IsNull() || !behaviour.isActiveAndEnabled || behaviour is not IUITransitionPlayer player) { continue; } if (player.Priority > bestPriority) { _transitionPlayer = player; bestPriority = player.Priority; } } transitionPlayer = _transitionPlayer; return transitionPlayer != null; } private void OnDestroy() { _isAlive = false; _transitionPlayer = null; } } }