为什么需要 NodeGraphView

项目的需求

之前写过一篇引导节点编辑器的文档,但随着项目需求的不断复杂,越发地发觉:原来的节点编辑器仅支持单一业务,不具有通用性,类似于任务、剧情这些系统,又需要重新写一遍序列化/反序列化、运行时的逻辑,重复造轮子。需要一个能让所有业务都轻松接入节点编辑器的基建,从而让每种业务图都应具备从编辑、保存、导出到运行时加载和执行的完整链路。

具体包括:

  • 在 Unity 中编辑节点、端口和连线。
  • 将编辑器图转换为独立的运行时数据,并由可替换的序列化器保存。
  • 在运行时反序列化数据,创建对应的 RuntimeNode 并驱动节点跳转。
  • 支持 Task、对话、剧情、AI 行为等不同业务。
  • 每种业务可以拥有自己的窗口、工具栏、节点内容、端口规则、导出位置及调试工具。

xNode 能做什么

xNode 是一个轻量级 Unity 节点图框架。它提供 NodeGraphNode、端口和默认编辑器,适合快速制作状态机、对话、决策等节点图。

xNode 的 NodeNodeGraph 都继承自 ScriptableObject,因此可以直接作为 Unity 资产保存;它并不是完全没有序列化。节点也可以在运行时通过业务代码调用 GetValue 等接口求值。官方将它定位为节点图框架,而不是一套通用的图运行时。

xNode 也可以通过 NodeEditorNodeGraphEditor 等扩展点定制节点和图的编辑体验。若业务需要独立的编辑器窗口、工具栏、导出流程或调试系统,这些能力需要项目自行设计和补齐。

xNode 无法直接覆盖的部分

对本项目而言,关键问题不是 xNode 能否显示节点,而是以下能力没有作为通用链路提供:

  • 编辑器图到独立 Runtime 文档的转换与导出。
  • 可替换序列化实现的统一入口。
  • 通用的运行时节点工厂、生命周期、节点跳转和执行器。
  • 不同业务各自的编辑器窗口、工具、导出策略和运行时 UI 的组织方式。

因此,使用 xNode 仍然可以完成业务,但每个业务都要自行组织运行时执行与导出逻辑,公共部分容易重复。

NodeGraphView 的方案

NodeGraphView 基于 Unity GraphView 建立编辑器层,并将配置图与运行时图明确拆分:

1
2
3
4
5
NodeGraphAsset
-> NodeGraphDocument
-> NodeGraphRuntimeDocument
-> GraphRunner
-> RuntimeNode

编辑器层负责节点显示、连线、保存和业务自定义;运行时层负责加载、反序列化、节点创建、生命周期和跳转。GraphRuntimeManager 持有 INodeGraphSerializer,业务可以更换序列化实现,而不需要修改图运行时调用方。

每种业务可以提供自己的:

1
2
3
4
5
6
7
GraphAsset
GraphController
GraphWindow
EditorNode
NodeView
RuntimeNode
业务 UI / 调试工具

例如 Task 图拥有自己的 TaskGraphWindowTaskGraphControllerTaskNodeTaskNodeViewTaskRuntimeNodeTaskPanel,同时复用通用的 GraphView 编辑器、序列化入口和 GraphRunner

taskNodeWidnows