101 lines
2.8 KiB
C#
101 lines
2.8 KiB
C#
using System.Collections.Generic;
|
|
using System.Threading;
|
|
using Cysharp.Threading.Tasks;
|
|
using UnityEngine;
|
|
|
|
namespace Stary.Evo.StoryEditor
|
|
{
|
|
public class GraphPlayer
|
|
{
|
|
/// <summary>
|
|
/// 剧本名称
|
|
/// </summary>
|
|
public string Name;
|
|
|
|
/// <summary>
|
|
/// 节点
|
|
/// </summary>
|
|
public List<NodePlayer> Nodes = new();
|
|
|
|
/// <summary>
|
|
/// 起始节点
|
|
/// </summary>
|
|
public BeginNodePlayer BeginNode;
|
|
/// <summary>
|
|
/// 结束节点
|
|
/// </summary>
|
|
public EndNodePlayer EndNode;
|
|
|
|
/// <summary>
|
|
/// 当前进行中的节点
|
|
/// </summary>
|
|
public List<NodePlayer> CurrentNodes = new();
|
|
|
|
/// <summary>
|
|
/// 播放完成
|
|
/// </summary>
|
|
public bool Finished;
|
|
|
|
/// <summary>
|
|
/// CTS
|
|
/// </summary>
|
|
public CancellationTokenSource Cts = new();
|
|
|
|
public GraphPlayer(GraphData data, IResource loader)
|
|
{
|
|
// 检查加载方式
|
|
if (loader.GetType().ToString() != data.resourceType)
|
|
{
|
|
Debug.LogError($"加载方式不匹配,剧本无法加载:{data.name}\n需要的加载方式: {data.resourceType}");
|
|
return;
|
|
}
|
|
|
|
Name = data.name;
|
|
data.nodes.ForEach(node =>
|
|
{
|
|
switch (node)
|
|
{
|
|
case BeginNodeData beginNode:
|
|
Nodes.Add(beginNode.GetPlayer(this));
|
|
break;
|
|
case EndNodeData endNode:
|
|
Nodes.Add(endNode.GetPlayer(this));
|
|
break;
|
|
case ScriptParagraphNodeData paraNode:
|
|
Nodes.Add(paraNode.GetPlayer(this));
|
|
break;
|
|
case FlowNodeData flowNode:
|
|
Nodes.Add(flowNode.GetPlayer(this));
|
|
break;
|
|
}
|
|
});
|
|
BeginNode = (BeginNodePlayer)Nodes[data.startNodeIndex];
|
|
BeginNode.Connect();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 执行剧本
|
|
/// </summary>
|
|
public async UniTask Execute()
|
|
{
|
|
// 初始化结束标志
|
|
Finished = false;
|
|
// 执行剧本
|
|
_ = BeginNode.Execute();
|
|
// 等待剧本完成
|
|
await UniTask.WaitUntil(() => Finished);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 停止剧本
|
|
/// </summary>
|
|
public void Stop()
|
|
{
|
|
// 取消并重置CancelToken
|
|
Cts.Cancel();
|
|
Cts = new();
|
|
// 标记剧本结束
|
|
Finished = true;
|
|
}
|
|
}
|
|
} |