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;
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|