Files
aibis-dream/Assets/Scripts/Dialog System/LineRunner.cs
T
2026-01-13 19:20:06 +08:00

128 lines
4.5 KiB
C#

using System;
using System.Collections.Generic;
using AibisDream.Utility;
using UnityEngine;
using Yarn.Unity;
namespace AibisDream
{
public class LineRunner : DialogueViewBase
{
[SerializeField] private LineAdvanceInput advanceInput;
[SerializeField] private DialogViewType defaultViewType = DialogViewType.StandardBubble;
private readonly Dictionary<DialogViewType, ILineView> _screenViewDict = new();
public override void RunLine(LocalizedLine dialogueLine, Action onDialogueLineFinished)
{
LineSyncToken lineSyncEvent;
if (dialogueLine.TextID.Contains("第一章"))
{
Debug.Log($"第一章: {dialogueLine.GetCharacterVo().dialogViewType}");
}
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 if (dialogueLine.GetCharacterVo().dialogViewType == DialogViewType.Default)
{
// 手动推进视图
lineSyncEvent = LineSyncToken.CreateDefault(dialogueLine, onDialogueLineFinished);
if (_screenViewDict.TryGetValue(defaultViewType, out var view))
{
Debug.Log("defaultViewType: " + defaultViewType);
DialogController.Instance.lineSyncToken = lineSyncEvent;
view.RunLine(lineSyncEvent);
}
else
{
Debug.LogWarning($"未注册的视图类型: {defaultViewType}");
}
}
else
{
// 指定了视图类型
lineSyncEvent = LineSyncToken.CreateDefault(dialogueLine, onDialogueLineFinished);
if (_screenViewDict.TryGetValue(dialogueLine.GetCharacterVo().dialogViewType, out var view))
{
DialogController.Instance.lineSyncToken = lineSyncEvent;
view.RunLine(lineSyncEvent);
}
else
{
Debug.LogWarning($"未注册的视图类型: {dialogueLine.GetCharacterVo().dialogViewType}");
}
}
// 最后交给推进处理
advanceInput.RunLine(lineSyncEvent);
}
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() {}
}
}