feat(dialog): 添加梦境选项提示语支持

标记 #option_prompt 的台词不再进入普通台词流程,由 OptionView
暂存并在下一组 Dream Options 出现时显示在选项上方,同时通过
新增 LineHistoryAppend 事件加入对话历史。OnelineOptions 支持
提示语文本与独立选项根节点,并改为按实例追踪销毁按钮。
This commit is contained in:
2026-07-19 00:00:17 +08:00
parent 081ed0d883
commit c751a859ff
7 changed files with 496 additions and 38 deletions
@@ -24,6 +24,13 @@ namespace AibisDream
public override async YarnTask RunLineAsync(LocalizedLine dialogueLine, LineCancellationToken token)
{
// 选项提示语由 OptionView 暂存,并在 Dream Options 出现时直接显示。
// 不创建 LineSyncToken,避免进入普通台词的动画、推进和音频流程。
if (dialogueLine.IsOptionPromptLine())
{
return;
}
var lineSyncEvent = BuildSyncToken(dialogueLine);
DialogController.Instance.lineSyncToken = lineSyncEvent;
DispatchToView(dialogueLine, lineSyncEvent);
+33 -1
View File
@@ -4,6 +4,7 @@ using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using AibisDream.Framework;
using AibisDream.Utility;
using UnityEngine;
using Yarn.Unity;
@@ -17,6 +18,7 @@ namespace AibisDream
[SerializeField] private DialogViewType defaultViewType = DialogViewType.StandardBubble;
private OptionExploreTracker? _tracker;
private LineInfo? _pendingOptionPrompt;
private void Awake()
{
@@ -32,20 +34,36 @@ namespace AibisDream
public override YarnTask OnDialogueStartedAsync()
{
ClearPendingOptionPrompt();
return YarnTask.CompletedTask;
}
public override YarnTask OnDialogueCompleteAsync()
{
ClearPendingOptionPrompt();
HideDialog();
return YarnTask.CompletedTask;
}
public override YarnTask RunLineAsync(LocalizedLine line, LineCancellationToken token)
{
if (line.IsOptionPromptLine())
{
_pendingOptionPrompt = LineInfo.Generate(line);
}
else
{
ClearPendingOptionPrompt();
}
return YarnTask.CompletedTask;
}
public override void OnNodeExit(string nodeName)
{
ClearPendingOptionPrompt();
}
public void LoadBubbles(BubbleSlotGroupData data)
{
defaultViewType = data.dialogViewType;
@@ -68,6 +86,8 @@ namespace AibisDream
optionId => optionSelectedSource.TrySetResult(optionId));
var viewType = GetCurrentViewType(options);
var optionPrompt = _pendingOptionPrompt;
ClearPendingOptionPrompt();
switch (viewType)
{
@@ -76,7 +96,13 @@ namespace AibisDream
defaultOptions.ShowOptions(options);
break;
case DialogViewType.OnelineBox:
onelineOptions.ShowOptions(options);
onelineOptions.ShowOptions(options, optionPrompt?.lineText);
if (optionPrompt.HasValue)
{
EnumEventSystem.Global.Send(
DialogEventEnum.LineHistoryAppend,
optionPrompt.Value);
}
break;
case DialogViewType.CenterOption:
centerOptions.ShowOptions(options);
@@ -106,10 +132,16 @@ namespace AibisDream
}
catch (TaskCanceledException)
{
HideDialog();
return null;
}
}
private void ClearPendingOptionPrompt()
{
_pendingOptionPrompt = null;
}
private DialogViewType GetCurrentViewType(DialogOption[] options)
{
var optionViewType = options[0].Character.dialogViewType;