本文档详细介绍了节点如何构成 Godot Engine 中场景的构建块,以及它们是如何以分层结构组织起来以创建场景树结构的。理解节点和树系统是 Godot 架构和游戏开发工作流的基础。
有关渲染这些节点的视口系统的信息,请参阅 视口系统。
节点是 Godot 中所有场景的基础构建块。 Node 类是所有场景对象的基类,提供树管理、场景组织和消息传递的核心功能。
Godot 场景中的每个元素——从 UI 控件到 3D 对象,从音频播放器到物理实体——都是 Node 或派生自 Node 类。
来源
Godot 中的节点构成了称为场景树的分层树结构。这个节点树是决定节点之间如何关联、如何处理以及如何渲染的核心组织结构。
父子关系在 Node 类的的数据结构中明确表示
来源
虽然节点构成了层级关系,但 SceneTree 类管理着整个活动的层级结构。SceneTree 负责:
活动场景中的每个节点都属于 SceneTree,并且每个节点都可以通过 get_tree() 方法访问 SceneTree。
来源
节点在场景树中遵循一个明确定义的生命周期。理解这个生命周期对于初始化资源、启动行为和正确清理至关重要。
_enter_tree():当节点进入场景树时调用_ready():当节点及其所有子节点都已初始化并准备就绪时调用_process(delta):每帧调用一次,用于基于帧的行为_physics_process(delta):以固定时间间隔(物理滴答)调用,用于基于物理的行为_exit_tree():当节点即将离开场景树时调用生命周期回调的顺序很重要
_enter_tree() → 子节点的 _enter_tree() → 子节点的 _ready() → 父节点的 _ready()_exit_tree() → 父节点的 _exit_tree()来源
节点可以动态地添加到树中或从中移除
使用 add_child() 方法将一个节点添加为另一个节点的子节点
Node::add_child(Node* p_node, bool p_force_readable_name = false, Node::InternalMode p_internal = INTERNAL_MODE_DISABLED)
节点可以通过两种方式移除
remove_child():从父节点中移除节点,但不释放内存queue_free():安全地将节点的删除推迟到当前帧结束时来源
节点具有一种处理模式,该模式决定了何时应处理它们
节点有几个与处理相关的回调
_process(delta):每帧调用一次,用于平滑动画和非物理行为_physics_process(delta):以固定间隔调用,用于物理相关行为_input(event):当发生输入事件时调用_unhandled_input(event):当输入事件未被任何控件处理时调用_unhandled_key_input(event):当按键输入事件未被处理时调用来源
节点可以组织成组以便于管理和访问。这允许您通过单个函数调用来定位多个节点。
SceneTree 提供了与组交互的方法
call_group(group, method, ...):在组中的所有节点上调用一个方法notify_group(group, notification):向组中的所有节点发送通知set_group(group, property, value):在组中的所有节点上设置一个属性来源
Godot 的 UI 也建立在节点树结构之上,具有额外的层级概念
控件除了正常的节点结构之外,还具有额外的父子关系,以及专门的布局系统、大小调整和定位。
来源
节点,特别是 UI 控件,可以通过主题系统修改其外观。主题是定义控件视觉属性的资源。
主题可以
来源
Godot 中的场景是保存到磁盘的节点集合,可以实例化多次。这种系统允许高效地重用节点结构。
当场景被实例化时
_enter_tree()_ready() 通知来源
Godot 的节点系统核心围绕几个关键类和机制构建
节点系统使用各种数据结构来有效地维护树
来源
场景树中的处理遵循特定顺序
对于节点,处理顺序如下
在每个处理阶段内,节点按优先级顺序(数值越小越靠前),然后按树顺序(对于具有相同优先级的节点)进行处理。
来源
节点和树结构是 Godot 架构的核心。这种分层方法提供了一种清晰、直观的方式来组织游戏元素,同时为场景管理、处理和组件间的通信提供了强大的功能。
理解节点之间的关系,它们是如何处理的,以及它们如何进入和退出树,对于有效的 Godot 开发至关重要。