feat(dialog): 添加梦境选项提示语支持
标记 #option_prompt 的台词不再进入普通台词流程,由 OptionView 暂存并在下一组 Dream Options 出现时显示在选项上方,同时通过 新增 LineHistoryAppend 事件加入对话历史。OnelineOptions 支持 提示语文本与独立选项根节点,并改为按实例追踪销毁按钮。
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user