Files
aibis-dream/Assets/Scripts/Dialog System/LineRunner.cs
T

166 lines
5.2 KiB
C#

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<DialogViewType, ILineView> _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() { }
}
}