通用节点编辑器01-xNode对比
为什么需要 NodeGraphView
项目的需求
之前写过一篇引导节点编辑器的文档,但随着项目需求的不断复杂,越发地发觉:原来的节点编辑器仅支持单一业务,不具有通用性,类似于任务、剧情这些系统,又需要重新写一遍序列化/反序列化、运行时的逻辑,重复造轮子。需要一个能让所有业务都轻松接入节点编辑器的基建,从而让每种业务图都应具备从编辑、保存、导出到运行时加载和执行的完整链路。
具体包括:
- 在 Unity 中编辑节点、端口和连线。
- 将编辑器图转换为独立的运行时数据,并由可替换的序列化器保存。
- 在运行时反序列化数据,创建对应的
RuntimeNode并驱动节点跳转。 - 支持 Task、对话、剧情、AI 行为等不同业务。
- 每种业务可以拥有自己的窗口、工具栏、节点内容、端口规则、导出位置及调试工具。
xNode 能做什么
xNode 是一个轻量级 Unity 节点图框架。它提供 NodeGraph、Node、端口和默认编辑器,适合快速制作状态机、对话、决策等节点图。
xNode 的 Node 和 NodeGraph 都继承自 ScriptableObject,因此可以直接作为 Unity 资产保存;它并不是完全没有序列化。节点也可以在运行时通过业务代码调用 GetValue 等接口求值。官方将它定位为节点图框架,而不是一套通用的图运行时。
xNode 也可以通过 NodeEditor、NodeGraphEditor 等扩展点定制节点和图的编辑体验。若业务需要独立的编辑器窗口、工具栏、导出流程或调试系统,这些能力需要项目自行设计和补齐。
xNode 无法直接覆盖的部分
对本项目而言,关键问题不是 xNode 能否显示节点,而是以下能力没有作为通用链路提供:
- 编辑器图到独立 Runtime 文档的转换与导出。
- 可替换序列化实现的统一入口。
- 通用的运行时节点工厂、生命周期、节点跳转和执行器。
- 不同业务各自的编辑器窗口、工具、导出策略和运行时 UI 的组织方式。
因此,使用 xNode 仍然可以完成业务,但每个业务都要自行组织运行时执行与导出逻辑,公共部分容易重复。
NodeGraphView 的方案
NodeGraphView 基于 Unity GraphView 建立编辑器层,并将配置图与运行时图明确拆分:
1 | NodeGraphAsset |
编辑器层负责节点显示、连线、保存和业务自定义;运行时层负责加载、反序列化、节点创建、生命周期和跳转。GraphRuntimeManager 持有 INodeGraphSerializer,业务可以更换序列化实现,而不需要修改图运行时调用方。
每种业务可以提供自己的:
1 | GraphAsset |
例如 Task 图拥有自己的 TaskGraphWindow、TaskGraphController、TaskNode、TaskNodeView、TaskRuntimeNode 和 TaskPanel,同时复用通用的 GraphView 编辑器、序列化入口和 GraphRunner。

