节点系统简介

基于Graph的节点编辑器是非常强大的,而且Graph(图)是重要的数据结构之一,很多实际的问题的算法和解决方案都需要用图和其中的节点(Node)来实现。
举几个例子:Unity中我们所知的ShaderGraph,AssetGraph都是基于Graph的节点编辑器,而Bolt也为我们提供了可视化编程解决方案类似于UE中的蓝图。
游戏业务逻辑中的行为树,带有分支的对话系统,技能编辑器,都可以用Graphview实现。作为逻辑程序员,这些是我们最有可能利用Graphview自己动手实现的功能。
另外状态机也可以使用节点系统进行可视化,状态机中的某个状态可以看作是一个节点,完全可以使用GraphView实现另一个PlayMaker。

GraphView为我们提供了什么

GraphView为我们提供了一整套节点系统的UI解决方案,它本身是由UIElement实现的。Graph,Node,Port,Edge,这些复杂的UI和交互已经为我们实现了,我们可以通过扩展Node实现我们自己的节点编辑功能

GraphView没有提供什么

不幸的是,除了UI以外,GraphView并没有提供其他功能比如:

1.编辑后的数据序列化,我们需要自己实现编辑器可视化数据的保存功能
2.运行时的Graph行为。GraphView中的node和node之间的关系,运行起来到底代表什么,能做什么,需要我们自己实现。举个例子:剧情对话功能是我们想要实现的运行时功能,而Graphview对此一无所知。

避免重复造轮子,其他现成的节点方案,xNode和bolt

知道了这些,我们可以想象到,从0实现一个节点系统还是有不少的工作量。
如果想要更完整的方案,可以先参考下开源的 xNode ,他实现了GraphView几乎相同的UI功能,使用传统GUI,所以向下兼容到Unity5,而GraphView至少需要2019。
同时xNode提供了数据序列化功能,和运行时的Graph基类。
如果还不满足,想要更多集成的功能,可以看看bolt。bolt相当于UE中的蓝图。我对bolt还没有太多研究,感兴趣的各位可以查看其他资料。

下面我们正式来实现一个Graphview的表达式功能系统。