Godot中get_tree().get_nodes_in_group()返回已删除节点的问题求助
问题分析与解决方案
核心问题原因
queue_free() 是延迟删除操作,它只会将节点标记为待删除状态,要等到当前帧所有逻辑处理完成后,才会真正将节点从场景树和对应分组中移除。所以在同一帧的 _physics_process 里调用 get_nodes_in_group("Enemy") 时,已死亡的敌人节点还没被清理,导致统计数量不变。
而直接用 free() 报错,是因为在信号回调(比如 _on_hit_box_on_killed)执行时,节点正处于信号处理的锁定状态,此时无法直接强制删除节点。
修复方案
1. 敌人死亡时先移除分组,再延迟删除
修改敌人死亡代码,在 queue_free() 前手动将节点从 "Enemy" 组中移除,这样控制器的统计会立刻更新:
func _on_hit_box_on_killed(): remove_from_group("Enemy") # 先从分组中移除,让统计实时生效 get_parent().remove_child(self) queue_free()
2. 简化控制器的统计逻辑
没必要手动遍历计数,直接调用分组的 size() 方法即可获取当前敌人数量:
extends Node2D func _physics_process(delta): var enemy_count = get_tree().get_nodes_in_group("Enemy").size() print(enemy_count) if enemy_count <= 0: get_tree().change_scene_to_file("res://scenes/samples/top_down_sample.tscn")
内容的提问来源于stack exchange,提问作者Bárbara Perez
相关产品推荐
相关产品推荐

