📜  Godot中的SceneTree

📅  最后修改于: 2021-01-02 10:21:59             🧑  作者: Mango

Godot中的SceneTree

介绍

没有比这更多的深度了。这是事情开始变得抽象,但不要惊慌的时候。

在上一教程中,所有内容都围绕节点的概念展开。视图只是节点的集合。一旦进入可视化树,它们就会变得活跃。

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

主循环

这就是Godot内部工作的方式。操作系统是类,它是开始时唯一运行的实例。稍后,将加载所有驱动程序,服务器,脚本语言,可视系统等。

初始化完成后,必须为OS提供主循环才能运行。至此,所有这些工作人员都在工作(如果我们有兴趣查看其内部工作方式,我们可以检查源代码中的main / main.cpp文件)。

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

场景树

解释Godot如何工作的一种方式是,它是低级中间件上的高级游戏引擎。

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

无论哪种情况,视觉系统都将其主循环提供给OS场景树。播放场景时自动设置和设置;不需要其他工作。

必须知道此类的存在,因为它有一些基本用途:

  • 它包括根视口,在该视口中,当视图第一次作为场景树的一部分添加时(作为该视图的一部分)添加为子视图
  • 它包含有关组的信息,并且它们可以调用组中的所有节点或获取其列表。
  • 这包括一些全局状态功能,例如设置暂停模式或跳过该过程。

当节点是场景树的一部分时,只能通过调用Node .get_tree()来获得同步单例。

根视口

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

get_tree().get_root() # Access by the scene main loop.
get_node("/root") # Access via absolute path.

该节点包含主视口,默认情况下,在其内部绘制的是视口的子项,因此所有节点始终在顶部始终具有该类型的节点是有意义的。否则,什么也看不到!

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

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

场景树

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

这意味着如前一教程中所述,它将获得_enter_tree()和_ready()回调(以及_exit_tree() )。

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

树顺序

Godot中的大多数节点操作(例如绘制2D,处理或获取通知)都是按树顺序完成的。这意味着在树顺序中具有较小等级的父级兄弟姐妹将在当前节点之前得到通知。

通过进入场景树“变得活跃”

  • 从磁盘加载场景或通过脚本创建场景。
  • 场景的根节点被添加为“根”视口的子代,或添加到该视口的任何子代和孙代。
  • 新添加的视图的每个节点将按照从上到下的顺序接收到“ Enter_tree”通知(GDScript中的_enter_tree()回调)。
  • 当节点及其所有子级都位于活动场景内时,将提供通知“ ready”(GDScript中的_ready()回调),以方便使用。
  • 删除场景后,他们会按照从下到上的顺序收到“退出场景”通知(GDScript中的_exit_tree()回调)

改变当前场景

加载场景后,需要将该场景更改为另一个场景。最简单的方法是使用SceneTree.change_scene()函数:

func _my_level_was_completed():
    get_tree().change_scene("res://levels/level2.tscn")

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