Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

分组

Godot 中的分组与其他软件中的标签类似。你可以将节点加入若干个分组之中,然后在代码中通过 SceneTree 来:

  • 获取某个分组中的节点列表。

  • 对分组中的所有节点调用方法。

  • 向分组中的所有节点发送通知。

这个功能可以用来组织大型场景、解耦代码。

管理分组

将节点添加到一个新的分组名称中即可创建分组,同样,将所有节点移出某个给定的分组即可移除分组。

为分组添加/移除节点有两种方法:

  • 在设计阶段,你可以通过编辑器里的 Groups(组)面板,或者在项目设置(Project Settings)中 Globals(全局)面板下的 Groups(组)标签页来进行设置。

  • 运行模式下,调用 Node.add_to_group()Node.remove_from_group()方法。

小技巧

虽然这并不是强制要求的,但还是建议你在给分组(group)命名时,使用 snake_case (蛇形命名法,也就是全小写并用下划线连接单词)的命名规范。

使用 Groups(组)面板

你可以通过 Groups(组)面板来创建新的组。

../../_images/groups_dock.webp

在‘场景(Scene)’面板中选中一个节点,然后点击那个带有 + 符号的添加按钮。

../../_images/groups_add_new_group_button.webp

现在你应该能看到‘创建新分组(Create New Group)’的弹窗出现了。在输入框里写下分组的名字即可。

你可以选择勾选 "全局(Global)"这个选项。勾选后,该分组将在整个项目中可见,并且可以在任何项目场景中被重复使用。此外,勾选它还能让你为该分组添加一段描述说明。

完成后,按“确定”创建它。

../../_images/groups_add_new_group_modal.webp

如果没勾选 Global(全局)选项,你应该能在 Groups(组)面板的 Scene Groups(场景组)下看到新建的组;如果勾选了该选项,则会在 Global Groups(全局组)下看到。

你可以把‘场景(Scene)’面板中选中的节点添加到分组里,具体操作是勾选‘分组(Groups)’面板里对应分组左侧的复选框。另外,你在创建新分组时,当时选中的那个节点会自动被勾选(也就是自动加入这个新分组)。

../../_images/groups_dock_with_created_groups.webp

从任何场景创建的项目中标记为“全局”的所有组都将在“全局组”下可见。

从当前场景中的节点派生的任何其他组都将显示在“场景组”下。

警告

全局组和场景组使用相同的底层逻辑。同名组被视为同一组。此功能纯粹是组织性的。

../../_images/groups_node_tab_with_multiple_types_of_groups.webp

你可以在项目设置(Project Settings)里的 Globals(全局)面板中,找到 Groups(组)标签页来管理全局组。在那里,你不仅能添加新的全局组,还能修改已有组的名称和描述。

../../_images/groups_global_groups_settings.webp

使用代码

你也可以通过脚本来管理分组。以下代码会在脚本所附加的节点进入场景树时,将其加入 guards(守卫)分组。

func _ready():
    add_to_group("guards")

想象一下你正在制作一个潜入类游戏,敌人发现玩家后,希望所有守卫和机器人都进入警觉状态。

下面的例子中,我们使用 SceneTree.call_group() 来通知所有敌人:玩家被发现了。

func _on_player_spotted():
    get_tree().call_group("guards", "enter_alert_mode")

以上代码会对 gurads 分组中的所有成员节点调用 enter_alter_mode 函数。

要获取由 guards 分组中的所有节点所构成的数组,请调用 SceneTree.get_nodes_in_group()

var guards = get_tree().get_nodes_in_group("guards")

SceneTree 类提供了许多有用的方法,例如与场景、场景节点层次结构及节点编组交互,还可以使你可以轻松切换场景或重新加载场景、退出游戏或暂停和恢复运行游戏。不仅如此,该类还提供了一些有用的信号。