using System.Collections.Generic; using AibisDream.Utility; using UnityEngine; using Yarn.Unity; namespace AibisDream { public class LineRunner : DialoguePresenterBase { [SerializeField] private DialogViewType defaultViewType = DialogViewType.StandardBubble; private readonly Dictionary _screenViewDict = new(); public override YarnTask OnDialogueStartedAsync() { return YarnTask.CompletedTask; } public override YarnTask OnDialogueCompleteAsync() { HideDialog(); return YarnTask.CompletedTask; } public override async YarnTask RunLineAsync(LocalizedLine dialogueLine, LineCancellationToken token) { var lineSyncEvent = BuildSyncToken(dialogueLine); DialogController.Instance.lineSyncToken = lineSyncEvent; DispatchToView(dialogueLine, lineSyncEvent); using var skipReg = token.HurryUpToken.Register(() => { if (lineSyncEvent.state == LineSyncState.PlayText) { lineSyncEvent.TrySkip(); } }); using var advanceReg = token.NextContentToken.Register(() => { if (lineSyncEvent.state != LineSyncState.Advanced) { lineSyncEvent.ForceAdvance(); } }); await lineSyncEvent.AwaitCompletion(); } private LineSyncToken BuildSyncToken(LocalizedLine dialogueLine) { if (dialogueLine.GetCharacterVo().dialogViewType == DialogViewType.Screen) { // 自动推进视图 return LineSyncToken.CreateAuto(dialogueLine); } if (dialogueLine.GetCharacterVo().dialogViewType == DialogViewType.Task) { return LineSyncToken.CreateImmediate(dialogueLine); } if (dialogueLine.GetCharacterVo().dialogViewType == DialogViewType.Default) { // 手动推进视图 return LineSyncToken.CreateDefault(dialogueLine); } // 指定了视图类型 return LineSyncToken.CreateDefault(dialogueLine); } private void DispatchToView(LocalizedLine dialogueLine, LineSyncToken lineSyncEvent) { if (dialogueLine.GetCharacterVo().dialogViewType == DialogViewType.Screen) { if (_screenViewDict.TryGetValue(DialogViewType.Screen, out var view)) { view.RunLine(lineSyncEvent); } else { Debug.LogWarning($"未注册的视图类型: {dialogueLine.GetCharacterVo().dialogViewType}"); } return; } if (dialogueLine.GetCharacterVo().dialogViewType == DialogViewType.Task) { if (_screenViewDict.TryGetValue(DialogViewType.Task, out var view)) { view.RunLine(lineSyncEvent); } else { Debug.LogWarning($"未注册的视图类型: {dialogueLine.GetCharacterVo().dialogViewType}"); } return; } if (dialogueLine.GetCharacterVo().dialogViewType == DialogViewType.Default) { if (_screenViewDict.TryGetValue(defaultViewType, out var view)) { view.RunLine(lineSyncEvent); } else { Debug.LogWarning($"未注册的视图类型: {defaultViewType}"); } return; } if (_screenViewDict.TryGetValue(dialogueLine.GetCharacterVo().dialogViewType, out var specificView)) { specificView.RunLine(lineSyncEvent); } else { Debug.LogWarning($"未注册的视图类型: {dialogueLine.GetCharacterVo().dialogViewType}"); } } public void LoadBubbleData(BubbleSlotGroupData data) { if (!_screenViewDict.TryGetValue(data.dialogViewType, out var view)) { Debug.LogWarning($"未注册的视图类型: {data.dialogViewType}"); return; } defaultViewType = data.dialogViewType; // 加载数据 if (view is BubbleGroup bubbleGroup) { bubbleGroup.LoadBubbles(data); return; } } public void HideDialog() { foreach (var view in _screenViewDict.Values) { view.HideDialog(); } } 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); void HideDialog() { } } }