feat(ui): 添加录制工具面板

新增 RecordingToolPanel,按 Ctrl+R 唤出侧边栏,可独立控制光标、
版本号、Top Bar 与对话视觉的显隐。移除旧的
UIEventEnum.RecordingModeChanged 事件,改为各子系统提供显式
SetVisible API。在 Persistence 场景中配置面板层级与四个开关。
This commit is contained in:
2026-07-15 16:51:55 +08:00
parent b14599d18c
commit 91ffbeb130
9 changed files with 1737 additions and 138 deletions
+10 -12
View File
@@ -13,6 +13,7 @@ namespace AibisDream
public Sprite nextTalk, talking, option, interactive, holding, disable;
private Image _cursor;
private bool _cursorVisible = true;
private void Start()
{
@@ -23,29 +24,26 @@ namespace AibisDream
#else
InitCursor();
#endif
EnumEventSystem.Global.Register<UIEventEnum, bool>(UIEventEnum.RecordingModeChanged, OnRecordingModeChanged);
}
private void OnDestroy()
{
EnumEventSystem.Global.UnRegister<UIEventEnum, bool>(UIEventEnum.RecordingModeChanged, OnRecordingModeChanged);
}
private void OnRecordingModeChanged(bool isRecording)
public void SetCursorVisible(bool visible)
{
#if UNITY_ANDROID || UNITY_IOS
return;
#endif
_cursorVisible = visible;
ApplyCursorVisibility();
}
private void ApplyCursorVisibility()
{
if (_cursor != null)
{
_cursor.gameObject.SetActive(!isRecording);
_cursor.gameObject.SetActive(_cursorVisible);
}
if (isRecording)
{
Cursor.visible = false;
}
Cursor.visible = false;
}
private void InitCursor()
@@ -12,8 +12,16 @@ namespace AibisDream
[SerializeField] private OptionView optionView;
[SerializeField] private TMP_Text widthEstimation;
private CanvasGroup _canvasGroup;
public override void OnSingletonInit()
{
_canvasGroup = GetComponent<CanvasGroup>();
if (_canvasGroup == null)
{
_canvasGroup = gameObject.AddComponent<CanvasGroup>();
}
EnumEventSystem.Global.Register<DialogEventEnum, LineInfo>(DialogEventEnum.LineStart, AddDialogueLine);
EnumEventSystem.Global.Register<DialogEventEnum, LineInfo>(DialogEventEnum.OptionSelected, AddDialogueLine);
EnumEventSystem.Global.Register(EventEnum.NextYarn, CleanDialogHistory);
@@ -55,6 +63,19 @@ namespace AibisDream
gameObject.SetActive(true);
}
/// <summary>
/// 仅隐藏对话视觉,不影响打字机、推进与选项交互。
/// </summary>
public void SetDialogVisualVisible(bool visible)
{
if (_canvasGroup == null)
{
_canvasGroup = GetComponent<CanvasGroup>();
}
_canvasGroup.alpha = visible ? 1f : 0f;
}
public void HideDialog()
{
lineView.HideDialog();
+18
View File
@@ -10,12 +10,15 @@ namespace AibisDream.UI
private BoolButton _autoBtn;
private BoolButton _ffwdBtn;
private Transform _topBar;
private bool _topBarVisible = true;
#region
public void Show()
{
gameObject.SetActive(true);
ApplyTopBarVisibility();
}
public void Hide()
@@ -23,10 +26,25 @@ namespace AibisDream.UI
gameObject.SetActive(false);
}
public void SetTopBarVisible(bool visible)
{
_topBarVisible = visible;
ApplyTopBarVisibility();
}
private void ApplyTopBarVisibility()
{
if (_topBar != null)
{
_topBar.gameObject.SetActive(_topBarVisible);
}
}
#endregion
private void Awake()
{
_topBar = transform.Find("Top Bar");
RegisterButton();
}
@@ -0,0 +1,85 @@
using AibisDream.Kit;
using UnityEngine;
using UnityEngine.UI;
namespace AibisDream.UI
{
/// <summary>
/// 录制 HUD 侧边栏:Ctrl+R 唤出,四个开关独立控制光标、版本号、Top Bar、对话视觉。
/// 挂在 Info Panel 下,与 VariableBar 同类调试 UI,不使用独立 Canvas。
/// UI 层级在 Persistence 场景中配置,不在运行时生成。
/// </summary>
public class RecordingToolPanel : MonoBehaviour
{
[SerializeField] private Toggle showCursorToggle;
[SerializeField] private Toggle showVersionToggle;
[SerializeField] private Toggle showTopBarToggle;
[SerializeField] private Toggle showDialogToggle;
private bool _showCursor = true;
private bool _showVersion = true;
private bool _showTopBar = true;
private bool _showDialog = true;
private VerText _verText;
private void Awake()
{
_verText = FindObjectOfType<VerText>(true);
gameObject.SetActive(false);
BindToggles();
ApplyAll();
}
public void TogglePanel()
{
gameObject.SetActive(!gameObject.activeSelf);
}
private void BindToggles()
{
showCursorToggle.isOn = _showCursor;
showVersionToggle.isOn = _showVersion;
showTopBarToggle.isOn = _showTopBar;
showDialogToggle.isOn = _showDialog;
showCursorToggle.onValueChanged.AddListener(OnShowCursorChanged);
showVersionToggle.onValueChanged.AddListener(OnShowVersionChanged);
showTopBarToggle.onValueChanged.AddListener(OnShowTopBarChanged);
showDialogToggle.onValueChanged.AddListener(OnShowDialogChanged);
}
private void OnShowCursorChanged(bool visible)
{
_showCursor = visible;
CursorManager.Instance?.SetCursorVisible(visible);
}
private void OnShowVersionChanged(bool visible)
{
_showVersion = visible;
_verText?.SetVisible(visible);
}
private void OnShowTopBarChanged(bool visible)
{
_showTopBar = visible;
UIManager.Instance?.GetPanel<MainPanel>()?.SetTopBarVisible(visible);
}
private void OnShowDialogChanged(bool visible)
{
_showDialog = visible;
DialogUIManager.Instance?.SetDialogVisualVisible(visible);
}
private void ApplyAll()
{
OnShowCursorChanged(_showCursor);
OnShowVersionChanged(_showVersion);
OnShowTopBarChanged(_showTopBar);
OnShowDialogChanged(_showDialog);
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7f3e2a1b9c4d5e6f8a0b1c2d3e4f5a6b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+11 -16
View File
@@ -23,7 +23,7 @@ namespace AibisDream
public RectTransform DialogCanvas { get; private set; }
private GraphicRaycaster _raycaster;
private bool _isRecordingMode;
private RecordingToolPanel _recordingToolPanel;
#endregion
@@ -52,24 +52,10 @@ namespace AibisDream
}
}
// 不明白为什么要用这个,不过留着也好
if (Input.GetKeyDown(KeyCode.C))
{
if (GetPanel<MainPanel>().IsOpen)
{
HidePanel<MainPanel>();
}
else
{
ShowPanel<MainPanel>();
}
}
if ((Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl))
&& Input.GetKeyDown(KeyCode.R))
{
_isRecordingMode = !_isRecordingMode;
EnumEventSystem.Global.Send(UIEventEnum.RecordingModeChanged, _isRecordingMode);
_recordingToolPanel?.TogglePanel();
}
}
@@ -81,6 +67,15 @@ namespace AibisDream
DialogCanvas = transform.Find("Dialog Canvas").GetComponent<RectTransform>();
// 获取 GraphicRaycaster
_raycaster = Canvas.GetComponent<GraphicRaycaster>();
_recordingToolPanel = GetComponentInChildren<RecordingToolPanel>(true);
if (_recordingToolPanel == null)
{
var infoPanel = transform.Find("UI Canvas/Info Panel");
if (infoPanel != null)
{
_recordingToolPanel = infoPanel.GetComponentInChildren<RecordingToolPanel>(true);
}
}
// 获取Panel
var panels = Canvas.GetComponentsInChildren<IUIPanel>(true);
_panelPool = new Dictionary<Type, IUIPanel>();