通用运行时与序列化接口

运行时部分负责加载导出的图数据、创建 RuntimeNode、执行节点生命周期并完成节点跳转。

运行时结构

1
2
3
4
5
GraphRuntimeManager
-> GraphRunner
-> INodeGraphRuntimeNode
-> NodeGraphRuntimeNodeBase<TData>
-> 业务 RuntimeNode

GraphRuntimeManager

GraphRuntimeManager 是单例入口,负责:

  • 持有多个 GraphRunner
  • 从字符串、TextAsset 或 Resources 加载运行时图。
  • 统一序列化和反序列化入口。
  • 更新、卸载和清理 Runner。
1
2
GraphRunner runner = GraphRuntimeManager.Instance
.LoadFromResources("TaskGraphs/NewGraph0");

GraphRunner

GraphRunner 维护当前节点和节点映射,并提供以下执行流程:

1
2
3
4
5
6
7
8
Start
-> 找到 StartRuntimeNode
-> OnEnter
-> Step
-> 当前节点 Update
-> MoveNext(exitKey)
-> OnLeave
-> 下一个节点 OnEnter

Start() 会启动图并自动执行 Start 节点的一次 Step(),因此业务调用方通常只需要调用 Start()

RuntimeNode 接口

每个 RuntimeNode 都实现 INodeGraphRuntimeNode

1
2
3
4
5
6
void Init(GraphRunner runner, NodeGraphRuntimeNodeData data);
void OnInit();
void OnEnter();
string Update();
void OnLeave();
void OnDispose();

通常业务节点继承 NodeGraphRuntimeNodeBase<TUserData>,只实现实际需要的方法。

运行时节点注册

RuntimeNode 使用 NodeRuntime 特性绑定编辑器节点类型:

1
2
3
4
[NodeRuntime("Game.NodeGraphs.Editor.TaskNode")]
public class TaskRuntimeNode : NodeGraphRuntimeNodeBase<TaskNodeData>
{
}

NodeGraphRuntimeFactory 会根据导出数据中的节点类型创建对应的 RuntimeNode。

可替换序列化器

序列化接口分为:

1
2
3
4
5
6
7
8
9
public interface IGraphSerializer
{
string Serialize<T>(T data);
}

public interface IGraphDeserializer
{
T Deserialize<T>(string serializedData) where T : new();
}

INodeGraphSerializer 组合上述两个接口。当前实现为 NodeGraphNewtonJsonSerializer,Manager 持有接口类型:

1
2
private readonly INodeGraphSerializer serializer =
new NodeGraphNewtonJsonSerializer();

项目需要切换 JSON 工具或二进制工具时,实现 INodeGraphSerializer,再替换这一个实例即可。

taskNodeWidnows