65 lines
1.8 KiB
C#
65 lines
1.8 KiB
C#
using SLSUtilities.UI;
|
|
using UnityEngine;
|
|
using Yarn.Unity;
|
|
|
|
namespace Cielonos.UI
|
|
{
|
|
public class DialogUIPage : UIPageBase
|
|
{
|
|
public DialogueRunner dialogueRunner;
|
|
|
|
private string _pendingNode;
|
|
|
|
/// <summary>
|
|
/// 带参数打开:指定要启动的 Yarn 节点名。
|
|
/// </summary>
|
|
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);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 对话结束时,由 DialogueRunner 的 onDialogueComplete 事件触发。
|
|
/// </summary>
|
|
public void OnDialogueComplete()
|
|
{
|
|
Close(); // base.Close() -> UIPageManager.UnregisterPage -> 恢复输入锁定
|
|
}
|
|
}
|
|
} |