using System; using System.Collections.Generic; using AibisDream.Utility; using UnityEngine; using Yarn.Unity; namespace AibisDream { public class LineRunner : DialogueViewBase { [SerializeField] private DialogViewType[] lineViewTypes; [SerializeField] private LineAdvanceInput advanceInput; [SerializeField] private BubbleGroup bubbleGroup; private readonly Dictionary _screenViewDict = new(); public override void RunLine(LocalizedLine dialogueLine, Action onDialogueLineFinished) { LineSyncToken lineSyncEvent; if (dialogueLine.GetCharacterVo().dialogViewType == DialogViewType.Screen) { // 自动推进视图 lineSyncEvent = LineSyncToken.CreateAuto(dialogueLine, onDialogueLineFinished); DialogController.Instance.lineSyncToken = lineSyncEvent; if (_screenViewDict.TryGetValue(DialogViewType.Screen, out var view)) { view.RunLine(lineSyncEvent); } else { Debug.LogWarning($"未注册的视图类型: {dialogueLine.GetCharacterVo().dialogViewType}"); } } else if (dialogueLine.GetCharacterVo().dialogViewType == DialogViewType.Task) { lineSyncEvent = LineSyncToken.CreateImmediate(dialogueLine, onDialogueLineFinished); DialogController.Instance.lineSyncToken = lineSyncEvent; if (_screenViewDict.TryGetValue(DialogViewType.Task, out var view)) { view.RunLine(lineSyncEvent); } else { Debug.LogWarning($"未注册的视图类型: {dialogueLine.GetCharacterVo().dialogViewType}"); } } else { // 手动推进视图 lineSyncEvent = LineSyncToken.CreateDefault(dialogueLine, onDialogueLineFinished); DialogController.Instance.lineSyncToken = lineSyncEvent; bubbleGroup.RunLine(lineSyncEvent); } // 最后交给推进处理 advanceInput.RunLine(lineSyncEvent); } public void RegisterView(DialogViewType dialogViewType, ILineView view) { _screenViewDict.Add(dialogViewType, view); } public void UnRegisterView(DialogViewType dialogViewType) { _screenViewDict.Remove(dialogViewType); } } public interface ILineView { void RunLine(LineSyncToken token); } }