using AibisDream.Framework; using AibisDream.Kit; using AibisDream.UI; using TMPro; using UnityEngine; namespace AibisDream { public class DialogUIManager : Singleton { [SerializeField] private LineRunner lineView; [SerializeField] private OptionView optionView; [SerializeField] private TMP_Text widthEstimation; private CanvasGroup _canvasGroup; public override void OnSingletonInit() { _canvasGroup = GetComponent(); if (_canvasGroup == null) { _canvasGroup = gameObject.AddComponent(); } EnumEventSystem.Global.Register(DialogEventEnum.LineStart, AddDialogueLine); EnumEventSystem.Global.Register(DialogEventEnum.LineHistoryAppend, AddDialogueLine); EnumEventSystem.Global.Register(DialogEventEnum.OptionSelected, AddDialogueLine); EnumEventSystem.Global.Register(EventEnum.NextYarn, CleanDialogHistory); EnumEventSystem.Global.Register(GameLifecycleEvent.SessionEnded, CleanDialogHistory); EnumEventSystem.Global.Register(GameLifecycleEvent.SessionPaused, CloseCanvas); EnumEventSystem.Global.Register(GameLifecycleEvent.SessionResumed, OpenCanvas); } public override void OnSingletonDestroy() { EnumEventSystem.Global.UnRegister(DialogEventEnum.LineStart, AddDialogueLine); EnumEventSystem.Global.UnRegister(DialogEventEnum.LineHistoryAppend, AddDialogueLine); EnumEventSystem.Global.UnRegister(DialogEventEnum.OptionSelected, AddDialogueLine); EnumEventSystem.Global.UnRegister(EventEnum.NextYarn, CleanDialogHistory); EnumEventSystem.Global.UnRegister(GameLifecycleEvent.SessionEnded, CleanDialogHistory); EnumEventSystem.Global.UnRegister(GameLifecycleEvent.SessionPaused, CloseCanvas); EnumEventSystem.Global.UnRegister(GameLifecycleEvent.SessionResumed, OpenCanvas); } private void AddDialogueLine(LineInfo line) { if (line.character.dialogViewType == DialogViewType.Task) { return; } var panel = UIManager.Instance.GetPanel(); panel?.AppendDialogLine(line); } private void CleanDialogHistory() { var panel = UIManager.Instance.GetPanel(); panel?.ClearDialog(); } public void CloseCanvas() { gameObject.SetActive(false); } public void OpenCanvas() { gameObject.SetActive(true); } /// /// 仅隐藏对话视觉,不影响打字机、推进与选项交互。 /// public void SetDialogVisualVisible(bool visible) { if (_canvasGroup == null) { _canvasGroup = GetComponent(); } _canvasGroup.alpha = visible ? 1f : 0f; } public void HideDialog() { lineView.HideDialog(); optionView.HideDialog(); } public void RegisterScreenView(DialogViewType dialogViewType, ILineView screenView) { lineView.RegisterView(dialogViewType, screenView); } public void UnRegisterScreenView(DialogViewType dialogViewType) { lineView.UnRegisterView(dialogViewType); } public void LoadBubbles(BubbleSlotGroupData data) { lineView.LoadBubbleData(data); optionView.LoadBubbles(data); } public float EstimateTextWidth(string text, float fontSize) { widthEstimation.fontSize = fontSize; widthEstimation.text = text; widthEstimation.ForceMeshUpdate(); return widthEstimation.preferredWidth; } } public enum DialogViewType { Default, StandardBubble, OnelineBox, Screen, CenterText, CenterOption, Task, Log } }