using SLSUtilities.UI; using UnityEngine; using Yarn.Unity; namespace Cielonos.UI { public class DialogUIPage : UIPageBase { public DialogueRunner dialogueRunner; private string _pendingNode; /// /// 带参数打开:指定要启动的 Yarn 节点名。 /// public void Open(string yarnNode) { _pendingNode = yarnNode; Open(); // 调用 base.Open() -> 注册到 UIPageManager -> 自动阻塞游戏输入 } public override void Open() { base.Open(); string node = string.IsNullOrEmpty(_pendingNode) ? "Start" : _pendingNode; if (dialogueRunner != null) { if (dialogueRunner.IsDialogueRunning) { dialogueRunner.Stop(); } dialogueRunner.StartDialogue(node); } _pendingNode = null; } protected override void Start() { base.Start(); // 绑定对话结束时的回调函数,关闭 UI 页面从而释放输入锁定 if (dialogueRunner != null) { dialogueRunner.onDialogueComplete.AddListener(OnDialogueComplete); } } private void OnDestroy() { if (dialogueRunner != null) { dialogueRunner.onDialogueComplete.RemoveListener(OnDialogueComplete); } } /// /// 对话结束时,由 DialogueRunner 的 onDialogueComplete 事件触发。 /// public void OnDialogueComplete() { Close(); // base.Close() -> UIPageManager.UnregisterPage -> 恢复输入锁定 } } }