【a】可视化剧本编辑器 10.StoryEditor

This commit is contained in:
mzh
2026-01-06 14:24:23 +08:00
parent f055116d4d
commit 2e8accfed8
80 changed files with 3145 additions and 0 deletions

View File

@@ -0,0 +1,43 @@
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using UnityEngine;
namespace Stary.Evo.StoryEditor
{
public class BeginNodePlayer : NodePlayer
{
public new BeginNodeData Data;
public List<NodePlayer> Next = new();
public BeginNodePlayer(GraphPlayer graph, BeginNodeData data) : base(graph, data)
{
Data = data;
}
public override bool Connect()
{
Debug.Log("BeginNodePlayer: Connect");
if (!base.Connect())
return false;
Data.next.ForEach(index => Next.Add(Graph.Nodes[index]));
Next.ForEach(node => node.Connect());
return true;
}
public override async UniTask Execute()
{
Init();
Debug.Log($"开始执行剧本: {Graph.Name}");
await base.Execute();
await MoveNext();
}
public override UniTask MoveNext()
{
Next.ForEach(node => node?.Execute());
return base.MoveNext();
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a5fb5ecf3bf3ef64996bd3a7905884f1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,38 @@
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using UnityEngine;
namespace Stary.Evo.StoryEditor
{
public class EndNodePlayer : NodePlayer
{
public new EndNodeData Data;
public List<NodePlayer> Pre = new();
public EndNodePlayer(GraphPlayer graph, EndNodeData data) : base(graph, data)
{
Data = data;
}
public override bool Connect()
{
if(!base.Connect())
return false;
Data.pre.ForEach(index => Pre.Add(Graph.Nodes[index]));
return true;
}
public override UniTask Execute()
{
Init();
Debug.Log($"剧本执行完成: {Graph.Name}");
// 标记剧本完成
Graph.Finished = true;
ScriptPlayer.ReleaseGraph();
return base.Execute();
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6894cd8522d600447966dc11b2a13905
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,66 @@
using System.Collections.Generic;
using System.Linq;
using Cysharp.Threading.Tasks;
namespace Stary.Evo.StoryEditor
{
public class FlowNodePlayer : NodePlayer
{
public new FlowNodeData Data;
public List<NodePlayer> Pre = new();
public List<NodePlayer> Next = new();
/// <summary>
/// 后续连接执行类型
/// </summary>
public NodeExecuteType ExecuteType;
public FlowNodePlayer(GraphPlayer graph, FlowNodeData data) : base(graph, data)
{
Data = data;
ExecuteType = data.executeType;
}
public override bool Connect()
{
if(!base.Connect())
return false;
Data.pre.ForEach(index => Pre.Add(Graph.Nodes[index]));
Data.next.ForEach(index => Next.Add(Graph.Nodes[index]));
Next.ForEach(node => node.Connect());
return true;
}
/// <summary>
/// 开始执行
/// </summary>
public override async UniTask Execute()
{
await base.Execute();
await MoveNext();
}
/// <summary>
/// 向下继续执行
/// </summary>
public override async UniTask MoveNext()
{
// 异步执行(并行)
if (ExecuteType == NodeExecuteType.Async)
{
Next.ForEach(node => node?.Execute());
}
// 同步执行(串行)
else
{
foreach (var node in Next.Where(node => node != null))
{
await node.Execute();
}
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 58805d324b439d242a445138bc3a33a2
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,65 @@
using Cysharp.Threading.Tasks;
namespace Stary.Evo.StoryEditor
{
public class NodePlayer
{
/// <summary>
/// 节点名称
/// </summary>
protected string Name;
/// <summary>
/// 图表
/// </summary>
protected GraphPlayer Graph;
/// <summary>
/// 数据
/// </summary>
protected NodeData Data;
/// <summary>
/// 初始化标志
/// </summary>
protected bool Initialized;
public NodePlayer(GraphPlayer graph, NodeData data)
{
Graph = graph;
Name = data.name;
Data = data;
}
/// <summary>
/// 连接节点
/// </summary>
public virtual bool Connect()
{
if(Initialized)
return false;
Initialized = true;
return true;
}
/// <summary>
/// 初始化
/// </summary>
public virtual void Init() => Graph.CurrentNodes.Add(this);
/// <summary>
/// 开始执行
/// </summary>
public virtual UniTask Execute()
{
Graph.CurrentNodes.Remove(this);
return UniTask.CompletedTask;
}
/// <summary>
/// 向下继续执行
/// </summary>
public virtual UniTask MoveNext() => UniTask.CompletedTask;
/// <summary>
/// 停止执行
/// </summary>
public virtual UniTask Stop() => UniTask.CompletedTask;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2b76627cea0be464c864e744ae0f0b45
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,32 @@
using Cysharp.Threading.Tasks;
namespace Stary.Evo.StoryEditor
{
public class ScriptParagraphNodePlayer : FlowNodePlayer
{
public new ScriptParagraphNodeData Data;
/// <summary>
/// 字幕路径
/// </summary>
public ResourcePathData CaptionPath;
/// <summary>
/// 语音路径
/// </summary>
public ResourcePathData AudioPath;
public ScriptParagraphNodePlayer(GraphPlayer graph, ScriptParagraphNodeData data) : base(graph, data)
{
Data = data;
CaptionPath = data.captionPath;
AudioPath = data.audioPath;
}
public override async UniTask Execute()
{
Init();
await ScriptPlayer.PlayScriptPara(this, Graph.Cts.Token);
await base.Execute();
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b263f1eba1f46094cab95e1c34ff2605
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: