Godot 中的场景树

17 Mar 2025 | 4 分钟阅读

引言

这方面的知识并不多。这是事情开始变得抽象的时候,但不要惊慌。

在上一篇教程中,所有内容都围绕着节点的概念。视图只是节点的集合。它们在进入视觉树后立即变为活动状态。

这个概念值得更详细地探讨。视觉系统也不是 Godot 的核心组件,因为可以跳过并编写一个脚本(或 C++ 代码),直接与服务器对话,但以这种方式创建游戏会做很多工作。

MainLoop(主循环)

这就是 Godot 内部的工作方式。 OS 是一个类,它是从一开始就运行的唯一实例。 稍后,所有驱动程序、服务器、脚本语言、视觉系统等都会被加载。

初始化完成后,必须为 OS 提供主循环才能运行。 到目前为止,所有这些都在内部工作(如果我们要了解其内部工作原理,可以在源代码中检查 main / main.cpp 文件)。

游戏、用户程序或游戏从主循环开始。 这个类中的一些初始化方法是被动的(帧同步回调)、固定的(物理同步回调)和输入。 同样,这是低级别的,而在 Godot 中制作游戏时,我们很少会编写 Menloop。

SceneTree(场景树)

解释 Godot 工作方式的一种方法是,它是一个基于低级中间件的高级游戏引擎。

视觉系统是游戏引擎,而 OS 和服务器是低级 API。

在任何一种情况下,视觉系统都会将其主循环提供给 OS,也就是场景树。 场景树在播放场景时自动设置; 不需要额外的操作。

了解这个类的存在至关重要,因为它有一些基本用途

  • 它包括根视口,当视图首次打开以成为场景树的一部分时,将视图添加为子节点(紧挨着它)
  • 它包含关于组的信息,并且它们具有调用组中所有节点或获取其列表的方法。
  • 这包括一些全局状态功能,例如设置暂停模式或跳过进程。

当节点是场景树的一部分时,可以通过调用 Node .get_tree () 获得 syntry 单例。

根视口

根视口位于场景的顶部。 形成一个节点,可以通过两种不同的方式获得

此节点包含主视口,无论视口的子节点是什么,默认情况下都会在其中绘制,因此所有节点始终在顶部都有这种类型的节点是有意义的; 否则,将看不到任何内容!

虽然在场景中创建了其他视口(分屏效果等),但这是唯一一个从未由用户创建的视口。 它是在 SceneTree 中自动构建的。

虽然在场景中创建了其他视口(用于分屏效果等),但这是唯一一个从未由用户创建的视口。 它是在 SceneTree 中自动创建的。

Scenetree(场景树)

当一个节点间接或直接连接到根视口时,它将成为场景树的一部分。

这意味着,正如之前的教程中所解释的那样,它将获得 _enter_tree() 和 _ready() 回调(以及 _exit_tree())。

SceneTree in Godot

当节点进入视图树时,它们会变为活动状态。 它们可以访问它们从进程、输入、2D 和 3D 显示、通知、播放声音、组等所需的一切。 当它们从其他场景树中移除时,它们会失去访问权限。

树顺序

Godot 中大多数节点操作,例如绘制 2D、处理或获取通知,都是按照树顺序进行的。 这意味着父节点是树顺序中排名较小的同级节点,将在当前节点之前收到通知。

SceneTree in Godot

通过进入场景树“变为活动状态”

  1. 场景是从磁盘加载或通过脚本创建的。
  2. 场景的根节点被添加为“根”视口的子节点或其任何子节点及其子节点的子节点。
  3. 新添加的视图的每个节点都将按照自顶向下的顺序接收“Enter_tree”通知(GDScript 中的 _enter_tree() 回调)。
  4. 当节点及其所有子节点都在活动场景中时,会提供一个方便的通知“ready”(GDScript 中的 _ready() 回调)。
  5. 当移除场景时,它们将按照自底向上的顺序接收“退出场景”通知(GDScript 中的 _exit_tree() 回调)

更改当前场景

加载场景后,需要将此场景更改为另一个场景。 这样做的一种简单方法是使用 SceneTree.change_scene() 函数

这是一种快速且有用的切换场景的方法,但缺点是游戏将停止,直到加载并播放新场景。 在你的游戏中的某个时刻,可能需要创建一个带有进度条、动画指示器或线程(后台)加载的适当加载屏幕。 这应该使用自动加载(请参阅下一章!)和后台加载自动完成。


下一主题#