169 lines
5.4 KiB
C#
169 lines
5.4 KiB
C#
using System.Collections.Generic;
|
|
using AibisDream.Utility;
|
|
using UnityEngine;
|
|
using Yarn.Unity;
|
|
|
|
namespace AibisDream
|
|
{
|
|
public class LineRunner : DialoguePresenterBase
|
|
{
|
|
[SerializeField] private LineAdvanceInput advanceInput;
|
|
[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);
|
|
|
|
// 最后交给推进处理
|
|
advanceInput.RunLine(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() {}
|
|
}
|
|
} |