74 lines
2.6 KiB
C#
74 lines
2.6 KiB
C#
using System.Collections.Generic;
|
||
using Ichni.UI;
|
||
using UnityEngine;
|
||
|
||
namespace Ichni.Menu.UI
|
||
{
|
||
/// <summary>
|
||
/// 通用 SelectionBox 的页面宿主,职责等同于 MessageBox 的页面容器:
|
||
/// 显示时动态生成一个 SelectionBox,选择完成后统一淡出并销毁本次实例。
|
||
/// </summary>
|
||
public class SelectionBoxUIPage : UIPageBase
|
||
{
|
||
[Header("Selection Box Page")]
|
||
public SelectionBox selectionBoxPrefab;
|
||
public RectTransform selectionBoxContainer;
|
||
|
||
private SelectionBox _currentSelectionBox;
|
||
private bool _isShowing;
|
||
|
||
/// <summary>当前是否已有一个 SelectionBox 等待玩家选择。</summary>
|
||
public bool IsShowing => _isShowing;
|
||
|
||
/// <summary>
|
||
/// 生成并显示一组运行时选项。页面显示期间拒绝重复请求,避免两个弹窗争夺输入。
|
||
/// </summary>
|
||
public bool Show(string title, string content, IReadOnlyList<SelectionBoxOption> options)
|
||
{
|
||
if (_isShowing)
|
||
{
|
||
Debug.LogWarning("[SelectionBoxUIPage] 已有 SelectionBox 显示中,忽略重复请求。");
|
||
return false;
|
||
}
|
||
|
||
if (mainCanvasGroup == null || selectionBoxPrefab == null || selectionBoxContainer == null)
|
||
{
|
||
Debug.LogWarning("[SelectionBoxUIPage] 缺少 CanvasGroup、SelectionBox Prefab 或容器,无法显示选项框。");
|
||
return false;
|
||
}
|
||
|
||
_currentSelectionBox = Instantiate(selectionBoxPrefab, selectionBoxContainer);
|
||
_currentSelectionBox.Closed += HandleSelectionBoxClosed;
|
||
if (!_currentSelectionBox.SetUp(title, content, options))
|
||
{
|
||
Destroy(_currentSelectionBox.gameObject);
|
||
_currentSelectionBox = null;
|
||
return false;
|
||
}
|
||
|
||
_isShowing = true;
|
||
|
||
// UIPageBase 默认淡入完成后才开启射线;选择框从出现瞬间就必须阻断底层输入。
|
||
mainCanvasGroup.gameObject.SetActive(true);
|
||
mainCanvasGroup.interactable = true;
|
||
mainCanvasGroup.blocksRaycasts = true;
|
||
FadeIn();
|
||
return true;
|
||
}
|
||
|
||
private void HandleSelectionBoxClosed(SelectionBox selectionBox)
|
||
{
|
||
if (selectionBox != _currentSelectionBox) return;
|
||
|
||
FadeOut(0.2f, false, () =>
|
||
{
|
||
if (_currentSelectionBox != null)
|
||
Destroy(_currentSelectionBox.gameObject);
|
||
|
||
_currentSelectionBox = null;
|
||
_isShowing = false;
|
||
});
|
||
}
|
||
}
|
||
}
|