【a】可视化剧本编辑器 10.StoryEditor
This commit is contained in:
101
Assets/10.StoryEditor/RunTime/Player/Graph/GraphPlayer.cs
Normal file
101
Assets/10.StoryEditor/RunTime/Player/Graph/GraphPlayer.cs
Normal file
@@ -0,0 +1,101 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user