using System; using System.Linq; using Yarn.Unity; namespace AibisDream { public class LineView : DialogueViewBase { private const string AutoNext = "auto_next"; // 进入指令选项模式 private bool _isInCommand; public override void RunLine(LocalizedLine dialogueLine, Action onDialogueLineFinished) { _isInCommand = dialogueLine.Text.HasCommandAttr(); if (_isInCommand) { DialogUiViewer.Instance.HideDialog(); base.RunLine(dialogueLine, onDialogueLineFinished); return; } HandleLineOutput(dialogueLine, onDialogueLineFinished); if (DialogController.Instance.quickRunMode) { onDialogueLineFinished.Invoke(); } } private void HandleLineOutput(LocalizedLine dialogueLine, Action onDialogueLineFinished) { // 对话系统正在交谈状态 DialogController.Instance.IsTalking = true; // 解析LocalizedLine if (dialogueLine.Metadata != null && dialogueLine.Metadata.Contains(AutoNext)) { // 自动跳过 DialogUiViewer.Instance.ShowAutoLine(dialogueLine.TextWithoutCharacterName.Text, dialogueLine.CharacterName, onDialogueLineFinished); } else { // 需要玩家点击 DialogUiViewer.Instance.ShowLine(dialogueLine.TextWithoutCharacterName.Text, dialogueLine.CharacterName, onDialogueLineFinished); } } public override void RunOptions(DialogueOption[] dialogueOptions, Action onOptionSelected) { if (_isInCommand) { DialogUiViewer.Instance.HideDialog(); base.RunOptions(dialogueOptions, onOptionSelected); return; } DialogController.Instance.IsTalking = true; DialogUiViewer.Instance.ShowOptions(dialogueOptions, onOptionSelected); } public override void InterruptLine(LocalizedLine dialogueLine, Action onDialogueLineFinished) { base.InterruptLine(dialogueLine, onDialogueLineFinished); } public override void DismissLine(Action onDismissalComplete) { base.DismissLine(onDismissalComplete); } public override void UserRequestedViewAdvancement() { if (_isInCommand) { return; } if (!DialogUiViewer.Instance.TrySkipLine()) { DialogUiViewer.Instance.AfterEndLine(); requestInterrupt.Invoke(); } } } }