com.alicizax.unity.framework/Runtime/UI/UIBase/UIHolderObjectBase.cs
陈思海 cd5de2c374 优化UIService模块
优化UI模块更多细节容错处理 优化UI模块内存泄露问题 优化性能
2026-04-23 20:19:46 +08:00

86 lines
2.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine;
namespace AlicizaX.UI.Runtime
{
[DisallowMultipleComponent]
public abstract class UIHolderObjectBase : 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;
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 IUITransitionPlayer transitionPlayer)
? transitionPlayer.PlayOpenAsync(cancellationToken)
: UniTask.CompletedTask;
}
internal UniTask PlayCloseTransitionAsync(CancellationToken cancellationToken = default)
{
return TryGetTransitionPlayer(out IUITransitionPlayer transitionPlayer)
? transitionPlayer.PlayCloseAsync(cancellationToken)
: UniTask.CompletedTask;
}
internal void StopTransition()
{
if (TryGetTransitionPlayer(out IUITransitionPlayer transitionPlayer))
{
transitionPlayer.Stop();
}
}
private bool TryGetTransitionPlayer(out IUITransitionPlayer transitionPlayer)
{
if (_transitionPlayer is Behaviour cachedBehaviour && cachedBehaviour.isActiveAndEnabled)
{
transitionPlayer = _transitionPlayer;
return true;
}
_transitionPlayer = GetComponent<IUITransitionPlayer>();
transitionPlayer = _transitionPlayer;
return transitionPlayer != null;
}
private void OnDestroy()
{
_isAlive = false;
_transitionPlayer = null;
}
}
}