- 文档
- 教程
- 游戏开发
【免费下载链接】godot-docs
Godot Engine official documentation
GraphFrame(图框)是 Godot Engine 中GraphEdit节点图编辑器体系里的一个特殊容器节点,用于将多个GraphElement(如GraphNode)组织成可视化的逻辑分组。本文基于 class_graphframe.rst 类参考文档,结合 GraphEdit 与 GraphElement 的相关 API,完整讲解 GraphFrame 的全部属性、方法、信号、主题项,以及如何在 GDScript 中创建图框、附加节点、定制标题栏和响应尺寸变化,帮助你打造结构清晰、可读性强的可视化编辑器界面。
一、GraphFrame 是什么
GraphFrame 是GraphEdit中用于组织其他 GraphElement的特殊 GraphElement。它本质上是一个可绘制背景、可拖动、可自动缩放的矩形分组框:
- 可以将其他 GraphElement 附加(attach)到图框上,形成逻辑分组;
- 可配置为自动调整尺寸,将内部所有附加元素完整包裹;
- 移动图框时,内部附加的所有元素会一起移动;
- 图框在
GraphEdit内部永远处于连接层(connection layer)和其他 GraphElement 之下,即始终作为背景存在,不会遮挡连线与节点。
1.1 继承体系
GraphFrame 的完整继承链为:
GraphFrame < GraphElement < Container < Control < CanvasItem < Node < Object从 class_graphelement.rst 可以看到,GraphElement是GraphEdit中所有可放置元素(GraphFrame与GraphNode)的公共基类,它本身继承自Container,因此 GraphFrame 天然具备容器布局能力。GraphElement 提供的draggable、resizable、selectable、selected、position_offset等基础能力,GraphFrame 全部继承。
1.2 与相关节点的关系
| 节点 | 角色 |
|---|---|
GraphEdit | 承载无限网格的图编辑器控件,GraphFrame 只能存在于其中 |
GraphElement | 所有图元素的基类,GraphFrame 与 GraphNode 的共同父类 |
GraphNode | 可连接端口的图节点,是 GraphFrame 最常见的“被附加成员” |
VisualShaderNodeFrame | 视觉着色器模块中同理念的分组框(见 class_visualshadernodeframe.rst),二者设计思路一致 |
二、属性详解:分组框的核心行为配置
GraphFrame 在 class_graphframe.rst 中定义了 7 个属性,其中 6 个为 GraphFrame 专有,1 个覆盖自Control。下表汇总全部属性及默认值:
| 属性 | 类型 | 默认值 | 作用 |
|---|---|---|---|
autoshrink_enabled | bool | true | 是否自动调整图框尺寸以包裹全部附加元素 |
autoshrink_margin | int | 40 | 自动缩小时,图框边界与附加元素之间的留白(像素) |
drag_margin | int | 16 | 图框内部可用于拖拽图框的边缘/内边距区域(像素) |
mouse_filter | int (MouseFilter) | 0 | 鼠标过滤,覆盖Control默认值(0即MOUSE_FILTER_STOP) |
tint_color | Color | Color(0.3, 0.3, 0.3, 0.75) | 启用着色时用于对图框着色的颜色 |
tint_color_enabled | bool | false | 是否启用着色(tint) |
title | String | "" | 图框标题 |
2.1 autoshrink_enabled 与 autoshrink_margin
- autoshrink_enabled:当为
true时,图框的矩形会自动调整,以将全部附加的 GraphElement 包裹在内(class_graphframe.rst)。新增/移动/删除附加元素都会触发重算,确保图框永远包住内容。 - autoshrink_margin:决定自动缩小时附加节点四周保留的留白像素数,默认
40。该值越大,图框相对内容越“松”,视觉上包围感越强(class_graphframe.rst)。
2.2 drag_margin
图框内部距边界drag_margin(默认16)像素的带状区域被视为“拖拽把手”,按住该区域即可拖动整个图框及其内部所有附加元素(class_graphframe.rst)。这保证了用户先选中/拖动内部节点时不会误拖整个分组。
2.3 tint_color 与 tint_color_enabled
tint_color_enabled默认为false,此时图框使用主题 StyleBox 绘制;- 一旦设为
true,图框会被tint_color(默认半透明深灰Color(0.3, 0.3, 0.3, 0.75))整体着色(class_graphframe.rst)。这一机制常被用来给不同功能区的分组赋予不同底色,例如“输入组”“处理组”“输出组”。
2.4 title
图框标题,默认空字符串(class_graphframe.rst)。标题显示在标题栏(title bar)中,可配合下面的get_titlebar_hbox()追加自定义控件。
2.5 mouse_filter 覆盖说明
GraphFrame 将Control.mouse_filter覆盖为0(即MOUSE_FILTER_STOP),意味着图框会拦截其区域内的鼠标事件,避免事件穿透到下层内容(class_graphframe.rst)。
三、方法与信号:运行时交互接口
3.1 get_titlebar_hbox()
get_titlebar_hbox() -> HBoxContainer返回标题栏使用的HBoxContainer。默认情况下该容器只包含一个用于显示标题的Label(class_graphframe.rst)。这是官方文档明确指出的扩展入口:你可以向其中追加自定义控件,比如“折叠/展开按钮”“关闭按钮”“节点计数标签”等,实现富交互的图框标题栏。
3.2 autoshrink_changed 信号
autoshrink_changed()当autoshrink_enabled或autoshrink_margin任一属性发生变化时发出(class_graphframe.rst)。可用于联动刷新其他 UI,比如当用户关闭自动缩小时同步显示手动调整大小的指示器。
四、与 GraphEdit 的协作 API
GraphFrame 的附加/分离逻辑由GraphEdit统一管理,相关接口都定义在 class_graphedit.rst 中:
| 接口 | 位置 | 说明 |
|---|---|---|
attach_graph_element_to_frame(element, frame) | class_graphedit.rst#L1104-L1110 | 将指定element附加到指定frame |
detach_graph_element_from_frame(element) | class_graphedit.rst#L1142-L1148 | 将element从当前所属图框分离 |
get_attached_nodes_of_frame(frame) | class_graphedit.rst#L1182-L1188 | 返回附加到该图框的节点名称数组 |
get_element_frame(element) | class_graphedit.rst#L1322-L1328 | 返回包含指定元素的 GraphFrame |
frame_rect_changed(frame, new_rect)信号 | class_graphedit.rst#L369-L375 | 图框被缩放到new_rect时发出 |
graph_elements_linked_to_frame_request(elements, frame)信号 | class_graphedit.rst#L381-L389 | 当一个或多个 GraphElement 被拖放到图框上(此前未附加到任何图框)时发出,elements为待附加元素数组 |
注意frame_rect_changed的参数类型:在 Godot 4.4 中new_rect已从Vector2改为Rect2,属于破坏性变更,迁移时需同步调整回调签名(见 upgrading_to_godot_4.4.rst)。
五、主题项:全面自定义图框外观
GraphFrame 支持 5 个主题项(class_graphframe.rst),分别控制背景、选中态背景、标题栏与缩放图标颜色:
| 主题项 | 类型 | 默认值 | 作用 |
|---|---|---|---|
resizer_color | Color | Color(0.875, 0.875, 0.875, 1) | 缩放(resizer)图标应用的色彩调制 |
panel | StyleBox | — | 图框背景的默认 StyleBox |
panel_selected | StyleBox | — | 图框被选中时的背景 StyleBox |
titlebar | StyleBox | — | 标题栏使用的 StyleBox |
titlebar_selected | StyleBox | — | 图框被选中时标题栏使用的 StyleBox |
使用方式与普通 Control 主题一致——可在GraphFrame节点上通过add_theme_stylebox_override("panel", stylebox)覆盖,也可在Theme资源中统一设置,从而让图框与项目的视觉风格保持一致。
六、实战示例:GDScript 中创建带分组框的节点图
下面是一个可在GraphEdit场景中直接运行的 GDScript 示例,演示创建图框、附加节点、定制标题栏并监听自动收缩变化的完整流程:
extends GraphEdit func _ready() -> void: # 1. 创建两个图节点(GraphNode) var node_a := GraphNode.new() node_a.title = "输入" node_a.position_offset = Vector2(100, 100) add_child(node_a) var node_b := GraphNode.new() node_b.title = "处理" node_b.position_offset = Vector2(100, 260) add_child(node_b) # 2. 创建图框并设置标题 var frame := GraphFrame.new() frame.title = "核心管线" frame.position_offset = Vector2(50, 50) add_child(frame) # 3. 将节点附加到图框(帧的矩形将自动包裹这两个节点) attach_graph_element_to_frame(node_a.name, frame.name) attach_graph_element_to_frame(node_b.name, frame.name) # 4. 定制标题栏:追加一个折叠提示 Label var hint := Label.new() hint.text = "(自动收缩:开)" frame.get_titlebar_hbox().add_child(hint) # 5. 监听自动收缩状态变化 frame.autoshrink_changed.connect(func() -> void: hint.text = "(自动收缩:关)" if not frame.autoshrink_enabled else "(自动收缩:开)" ) # 6. 监听图框缩放事件(注意 4.4 起 new_rect 为 Rect2) frame_rect_changed.connect(func(f: GraphFrame, new_rect: Rect2) -> void: print("图框 ", f.name, " 缩放为 ", new_rect) ) # 7. 查询分组信息 print("图框内节点:", get_attached_nodes_of_frame(frame.name)) print("节点 node_a 所属图框:", get_element_frame(node_a.name).name) # 8. 演示动态分离 # detach_graph_element_from_frame(node_a.name)要点回顾:
- 附加操作必须通过
GraphEdit.attach_graph_element_to_frame()完成,直接修改父子关系不会建立“图框-成员”关联; - 启用自动收缩时无需手动设置图框尺寸,
autoshrink_margin决定包围留白; - 标题栏定制通过
get_titlebar_hbox()返回的容器追加子控件实现。
七、设计思路与适用场景
7.1 分组的移动语义
图框移动时内部所有附加元素同步移动,这与“组(group)”“帧(frame)”的常见语义一致,非常适合在节点编辑器中表达模块、阶段、职责域等层级关系。
7.2 同理念的姊妹实现
在视觉着色器(Visual Shader)模块中存在同理念的 VisualShaderNodeFrame:一个可以附加其他视觉着色器节点、自动缩放包裹、支持自定义标题/描述/颜色的矩形框。理解 GraphFrame 的附加与自动收缩模型,可以帮助你理解视觉着色器中的分组机制,两者 API 设计高度同源。
7.3 优化体积构建时的可用性
需要注意的是,在启用“优化体积(optimize for size)”的构建配置中,GraphFrame与GraphEdit、GraphElement、GraphNode等图编辑控件会一同被禁用,以减小二进制体积(见 optimizing_for_size.rst)。如果你的发布包不需要节点图编辑功能,这类裁剪可显著减重;反之,需要在构建配置中保留图编辑相关模块。
八、小结
GraphFrame 是 Godot 节点图编辑体系中负责分组组织的关键控件:
- 继承
GraphElement,可被选中、拖动、缩放,并始终作为背景层存在; - 通过
autoshrink_enabled/autoshrink_margin实现自动包裹成员的布局能力; - 通过
drag_margin精确控制“拖整个组”与“拖内部元素”的鼠标区域; - 通过
title+get_titlebar_hbox()提供标题栏扩展点; - 通过
GraphEdit的附加/分离/查询 API 与frame_rect_changed、graph_elements_linked_to_frame_request信号完成分组生命周期管理; - 通过
panel、panel_selected、titlebar、titlebar_selected、resizer_color五个主题项实现外观定制。
掌握这些属性与 API,你就能在自研的流程图编辑器、状态机编辑器、可视化脚本工具中轻松实现“分组框 + 自动布局 + 联动移动”的成熟交互模式。
- 文档
- 教程
- 游戏开发
【免费下载链接】godot-docs
Godot Engine official documentation
相关推荐
Godot 编辑器扩展:EditorNode3DGizmo 详解与自定义 3D 节点编辑 Gizmo 实战
Godot 编辑器扩展:EditorNode3DGizmo 详解与自定义 3D 节点编辑 Gizmo 实战 EditorNode3DGizmo 是 Godot
文档教程游戏开发ET框架AI行为树编辑器:可视化节点开发与自动布局功能详解
ET框架AI行为树编辑器:可视化节点开发与自动布局功能详解 1. AI框架设计理念与行为树基础 ET框架的AI系统核心在于"根据当前状态执行相应行为"的设计理念
游戏开发后端微服务云原生ZenML 自定义扩展实战:从业务数据类型到管道组件的3种落地路径
ZenML 自定义扩展实战:从业务数据类型到管道组件的3种落地路径 ZenML 的标准组件用久了会碰到天花板:你要传给下游的业务对象没有内置材料化器,序列化后类
MLOps机器学习后端工作流自动化AI Agent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考