You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:00:54