using System; using AibisDream.Utility; using Yarn.Unity; namespace AibisDream { public class LineView : DialogueViewBase { // 进入指令选项模式 private bool _isInCommand; public override void RunLine(LocalizedLine dialogueLine, Action onDialogueLineFinished) { _isInCommand = dialogueLine.Text.HasCommandAttr(); if (_isInCommand) { DialogCanvasManager.GetCurView().HideDialog(); base.RunLine(dialogueLine, onDialogueLineFinished); return; } Action jumpVoice = SkipVoice; HandleLineOutput(dialogueLine, jumpVoice, onDialogueLineFinished); HandleVoiceOutput(dialogueLine); if (DialogController.Instance.quickRunMode) { onDialogueLineFinished.Invoke(); } } private void HandleLineOutput(LocalizedLine dialogueLine, Action onTextShowed, Action onDialogueLineFinished) { // 对话系统正在交谈状态 //DialogController.Instance.IsTalking = true; DialogCanvasManager.GetCurView().ShowLine(dialogueLine.TextWithoutCharacterName.Text, dialogueLine.GetCharacterVo(), onDialogueLineFinished, onTextShowed, dialogueLine.IsAutoSkipLine()); } private void HandleVoiceOutput(LocalizedLine dialogueLine) { // 播放语音 var voicePath = dialogueLine.GetCharacterVo().voicePath; if (!string.IsNullOrWhiteSpace(voicePath)) { AudioManager.Instance.RandomPlayVoice(voicePath); } } private void SkipVoice() { AudioManager.Instance.StopVoice(); } public override void RunOptions(DialogueOption[] dialogueOptions, Action onOptionSelected) { if (_isInCommand) { DialogCanvasManager.GetCurView().HideDialog(); base.RunOptions(dialogueOptions, onOptionSelected); return; } //DialogController.Instance.IsTalking = true; DialogCanvasManager.GetCurView().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 (DialogController.Instance.IsBlock) { return; } if (!DialogCanvasManager.GetCurView().TrySkipLine()) { AudioManager.Instance.StopVoice(); requestInterrupt.Invoke(); } } } }