Godot递归遍历节点树:短版本函数返回null的原因排查
为什么Godot中递归查找节点的简化函数返回null?
我在Godot Engine v4.0.2.stable中写了一个递归查找节点的函数,最初用全局变量temp存储找到的节点,这个版本能正常工作:
func find_node_in_tree(parent_node_ref, target_node_name): for node in parent_node_ref.get_children(): if temp != null: break if node.name == target_node_name: temp = node break else: if node.get_child_count() > 0: find_node_in_tree(node, target_node_name) return temp
但改成简化版后,函数始终返回null——调试时明明看到递归分支里已经return了目标节点,但主函数就是拿不到结果:
func find_node_in_tree(parent_node_ref, target_node_name): for node in parent_node_ref.get_children(): if node.name == target_node_name: return node else: if node.get_child_count() > 0: find_node_in_tree(node, target_node_name)
问题原因
简化版的核心问题是递归调用的返回值没有被处理。当递归进入子节点找到目标后,虽然当前递归分支返回了节点,但上层调用的函数只是执行了find_node_in_tree(node, target_node_name),没有接收这个返回值并继续向上传递。当循环遍历完所有子节点都没在当前层找到目标时,函数就会默认返回null,导致递归找到的结果丢失。
修复后的正确代码
只需要在递归调用时接收返回值,若结果不为null就直接返回,让结果逐层向上传递:
func find_node_in_tree(parent_node_ref, target_node_name): for node in parent_node_ref.get_children(): if node.name == target_node_name: return node else: if node.get_child_count() > 0: var result = find_node_in_tree(node, target_node_name) if result != null: return result return null
这样当递归分支找到目标节点时,结果会沿着调用链逐层返回,最终主函数就能拿到正确的节点引用。
内容的提问来源于stack exchange,提问作者DotFX
相关产品推荐
相关产品推荐

