Files
Cielonos/Assets/Scripts/SLSUtilities/UI/UIPageBase.cs

70 lines
2.1 KiB
C#
Raw Normal View History

2026-05-10 11:47:55 -04:00
using System;
using Sirenix.OdinInspector;
using UnityEngine;
namespace SLSUtilities.UI
{
/// <summary>
/// 覆盖式 UI 页面基类(机械台、物流中心、地图、结算等)。
/// 继承自 UIElementBase额外提供 Open/Close 生命周期和 UIPageManager 注册。
/// 页面打开时自动阻塞游戏输入,关闭时恢复。
/// </summary>
[RequireComponent(typeof(CanvasGroup))]
public class UIPageBase : UIElementBase
{
[Title("Page Settings")]
[SerializeField] protected bool closeOnEsc = true;
/// <summary>当前页面是否处于打开状态。</summary>
public bool IsOpen { get; private set; }
/// <summary>是否允许按 ESC 关闭此页面。</summary>
public bool CloseOnEsc => closeOnEsc;
/// <summary>页面打开后触发。</summary>
public event Action PageOpened;
/// <summary>页面关闭后触发。</summary>
public event Action PageClosed;
protected virtual void Start()
{
Hide();
}
/// <summary>
/// 打开页面:显示 UI注册到 UIPageManager 栈,触发生命周期回调。
/// 若已打开则忽略。
/// </summary>
public virtual void Open()
{
if (IsOpen) return;
IsOpen = true;
Show();
UIPageManager.Instance.RegisterPage(this);
OnPageOpened();
PageOpened?.Invoke();
}
/// <summary>
/// 关闭页面:从 UIPageManager 栈中移除,隐藏 UI触发生命周期回调。
/// 若未打开则忽略。
/// </summary>
public virtual void Close()
{
if (!IsOpen) return;
IsOpen = false;
UIPageManager.Instance.UnregisterPage(this);
Hide();
OnPageClosed();
PageClosed?.Invoke();
}
/// <summary>页面打开后的可覆盖回调。</summary>
protected virtual void OnPageOpened() { }
/// <summary>页面关闭后的可覆盖回调。</summary>
protected virtual void OnPageClosed() { }
}
}