using System; using UnityEngine; using Yarn.Unity; namespace AibisDream { public class YarnOption { private int _idx; private readonly DialogueOption _dialogueOption; private Action _onOptionSelected; /// /// 选项中的文字 /// public string Text => _dialogueOption.Line.TextWithoutCharacterName.Text; public bool IsAvailable => _dialogueOption.IsAvailable; public int Index => _idx; public YarnOption(int idx, DialogueOption dialogueOption, Action onOptionSelected) { _dialogueOption = dialogueOption; _onOptionSelected = onOptionSelected; _idx = idx; } /// /// 选择该选项 /// public void SelectOption() { if (!IsAvailable) { Debug.LogWarning($"选项 {Text} 不可用"); return; } if (_onOptionSelected == null) { Debug.LogWarning($"选项 {Text} 已经执行过了"); return; } // 执行选项 _onOptionSelected.Invoke(_dialogueOption.DialogueOptionID); _onOptionSelected = null; } /// /// 生成选项 /// /// 原始选项 /// 选择 /// 包装选项 public static YarnOption[] GeneOptions(DialogueOption[] options, Action onOptionSelected) { var yarnOptions = new YarnOption[options.Length]; for (var i = 0; i < options.Length; i++) { yarnOptions[i] = new YarnOption(i, options[i], onOptionSelected); } return yarnOptions; } } public class YarnContinueStep { private Action _nextStep; public YarnContinueStep(Action nextStep) { _nextStep = nextStep; } /// /// 继续对话 /// public void ContinueTalk() { if (_nextStep != null) { _nextStep.Invoke(); _nextStep = null; } else { Debug.LogWarning("对话已经继续,请勿重复触发"); } } /// /// 生成继续命令 /// /// 下一句命令 /// 命令 public static YarnContinueStep GeneContinueStep(Action nextStep) { return new YarnContinueStep(nextStep); } } }