Files
aibis-dream/Assets/Scripts/Dialog System/LineView.cs
T

84 lines
3.3 KiB
C#

using System;
using AibisDream.Framework;
using AibisDream.Utility;
using Yarn.Unity;
using UnityEngine;
namespace AibisDream
{
public class LineView : DialogueViewBase
{
public override void RunLine(LocalizedLine dialogueLine, Action onDialogueLineFinished)
{
EnumEventSystem.Global.Send(DialogEventEnum.LineStart, DialogText.GetLine(dialogueLine));
HandleLineOutput(dialogueLine, onDialogueLineFinished);
if (DialogController.Instance.quickRunMode)
{
// 在快速模式下,延迟更多帧数并重复检查,确保选项有足够时间显示
StartCoroutine(QuickRunNextStep(onDialogueLineFinished));
}
}
private System.Collections.IEnumerator QuickRunNextStep(Action onDialogueLineFinished)
{
// 延迟更多帧数,给Yarn足够时间检查下一个内容是否为选项
yield return null;
yield return null;
yield return null;
// 重复检查几次,确保选项有机会显示
for (int i = 0; i < 5; i++)
{
// 如果当前有显示选项,则不跳过
if (DialogCanvasManager.Instance.HasActiveOptions())
{
yield break;
}
// 等待一帧再次检查
yield return null;
}
// 如果经过多次检查都没有选项,则跳过到下一行
if (!DialogCanvasManager.Instance.HasActiveOptions())
{
DialogCanvasManager.Instance.TrySkipLine(true);
DialogCanvasManager.Instance.NextStep();
}
}
private void HandleLineOutput(LocalizedLine dialogueLine, Action onDialogueLineFinished)
{
DialogCanvasManager.Instance.ShowLine(dialogueLine.TextWithoutCharacterName.Text,
dialogueLine.GetCharacterVo(), onDialogueLineFinished, dialogueLine.TextID, dialogueLine.IsAutoSkipLine());
}
public override void RunOptions(DialogueOption[] dialogueOptions, Action<int> onOptionSelected)
{
EnumEventSystem.Global.Send(DialogEventEnum.OptionShow);
// 自动暂停快进,选项被选择后再恢复
bool wasQuickRun = DialogController.Instance.quickRunMode;
DialogController.Instance.quickRunMode = false;
// 包装原有回调,选项被选择后恢复快进状态
Action<int> wrappedOnOptionSelected = idx => {
// 延迟一帧恢复快进状态,确保Yarn流程正确执行
DialogController.Instance.StartCoroutine(RestoreQuickRunMode(wasQuickRun));
onOptionSelected(idx);
};
// 只调用一次ShowOptions,使用包装后的回调
var options = DialogOption.GeneOptions(dialogueOptions, wrappedOnOptionSelected);
DialogCanvasManager.Instance.ShowOptions(options);
}
private System.Collections.IEnumerator RestoreQuickRunMode(bool wasQuickRun)
{
yield return null; // 等待一帧
DialogController.Instance.quickRunMode = wasQuickRun;
}
}
}