Godot官方master文档把groups比作其他软件里的标签:一个节点可以同时属于多个组。SceneTree可以取得某组的节点列表,也可以对组内所有节点调用方法或发送通知。[1] 这是一种把节点按组名联系起来的方式;节点的成员关系与场景树的父子关系,并不是同一种组织信息。
分组文档分别描述设计时与执行时的管理。在设计时,编辑器的Groups面板以及项目设置Globals面板里的Groups页提供相应界面;执行时则有节点的方法。[1] 两个时段面对的仍是组名和节点归属。本文采用这些对象的含义,没有把文档中的按钮或脚本改写成项目配置步骤。
在Groups面板的说明中,Global选项使一个组在项目范围内可见,并能在项目中的任何场景复用,还允许为它添加描述。被标为Global的组,不论从哪个场景创建,都显示于Global Groups之下。其他从当前场景节点取得的组,则列在Scene Groups下。[1] 这两个列表交代的是编辑器如何汇集和展示名称:一边面向项目,一边来自当前场景节点。
这并没有创造两套互相隔离的同名组。原文紧接着警告,两类分组使用相同的底层逻辑,同名组被视为同一个;这项区别纯粹用于组织。[1] 因此,某个名称出现在Global或Scene的界面类别中,不能额外为它补出一个与同名组不同的命名空间。可见范围的差别可以成立,组名所指对象却不能仅因列表栏目不同就被拆成两个。
Node类对add_to_group的说明转向另一个条件:persistent参数的默认值为false;若为true,这个组会在节点随PackedScene保存时被存储。[2] 这里的“持久”联系的是保存场景这一对象关系,不是名称能否在项目范围显示。一个描述组从哪里可见,另一个描述它在所述保存情形中是否被保存,二者回答的问题不同。
同一方法段还明确,所有在Groups面板中创建并显示的组都是persistent。[2] 将这句话与前面的界面列表放在一起,可以看出面板中的Scene类别也不能简单解释成“只因不是Global便不会保存”。分组教程已经说,面板会显示Global Groups与Scene Groups;方法说明给面板创建显示的组统一加上持久性条件。这个联系来自两份文字的明确范围,不是观察某个项目保存结果所得。
组名的返回顺序也有独立限制。Node说明顺序不保证,并可能在不同运行之间变化。[2] 组名识别成员集合,顺序却没有因此成为稳定编号。资料中若只是列出了几个组名,不能再把该列表位置直接解释为文档承诺的处理优先级;本篇也没有给组设定排序或运行安排。
最后,入树状态仍需单独考虑。Node方法的相邻说明写明,节点不在树内时,SceneTree的组方法不会对该节点起作用。[2] 所以,已经说清组名和成员归属,仍未省略这个生效条件。它与persistent的保存条件、Global的编辑器可见范围各有所指,不能用其中一个属性替代另外两个。
本篇依据官方godot-docs的master文字,不将其标作stable或4.5发行说明。只读取分组教程及Node方法连续文字和邻接,没有运行脚本、观察截图或检验性能;首次发布日期未知。
资料:[1] https://raw.githubusercontent.com/godotengine/godot-docs/master/tutorials/scripting/groups.rst
[2] https://raw.githubusercontent.com/godotengine/godot-docs/master/classes/class_node.rst
信息来源
- Godot Engine godot-docs官方master源码:Groups (godot-docs master)
- Godot Engine godot-docs官方master源码:Node (godot-docs master)
本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。