1. 组是由场景树维护的
这一点从获取组成员时要先获取场景树就可以看出
get_tree().get_nodes_in_group("group_name")
2. 节点离开场景树时会被移除所在组
我在场景添加了一个Node,并把它放到“UI”组中,然后反复将它从场景树中添加/移除
extends Node
func _ready():
add_to_group("UI")
print("ready!!!!")
func _enter_tree():
print("entered tree")
func _exit_tree():
print("exited tree")
func _process(delta):
if Input.is_action_just_pressed("ui_left"):
print("i am running!!!!!!!!!!!!!!!!!!!!!!")
在一个Manager中控制节点
var is_child = false
func _process(delta):
if Input.is_action_just_pressed("ui_page_up"):
if is_child:
remove_child(node)
is_child = false
else:
add_child(node)
is_child = true
if Input.is_action_just_pressed("ui_run"):
var list :=get_tree().get_nodes_in_group("UI")
print("Nodes in UI group:" + str(list.size()))
添加到场景
entered tree
ready!!!!
Nodes in UI group:1
从场景移除
exited tree
Nodes in UI group:0
再次添加到场景
entered tree
Nodes in UI group:1
从上面的代码和结果可以看出:
- 节点从场景树
remove_child
以后会被移除所在组,所以没有必要在_exit_tree
中手动remove_from_group
- 再次将节点
add_child
以后以后会被再次添加到组,所以没有必要在_enter_tree
中手动add_to_group
- 顺便再次验证了《Node类:生命周期》,
_ready
在_enter_tree
之后调用,并且只调用一次,而_enter_tree
每次加入场景树都会调用