Files
plugin-library/Assets/10.StoryEditor/RunTime/Player/Graph/GraphPlayer.cs

101 lines
2.8 KiB
C#
Raw Normal View History

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;
}
}
}