Godot报错Cannot get path of node 节点未入场景树求助
问题根因
你触发报错是因为踩了Godot两个核心机制的常见误区:
- 直接通过脚本类名调用
.new()创建实例时,只会执行脚本本身的_init()构造逻辑,不会加载对应.tscn场景文件里预定义的子节点结构。你写的Baldosa.new()只是生成了一个挂载Baldosa.gd脚本的空Node2D节点,根本没有加载Baldosa.tscn里提前做好的Sprite子节点,自然找不到对应节点。 _init()是对象内存层面的构造回调,执行时节点还未被加入场景树,哪怕子节点已经存在,这个阶段调用get_node()查询路径也会触发「节点不在场景树」的报错。所有涉及节点路径查询、节点属性访问的初始化逻辑,必须放到_ready()回调中——_ready()的官方触发时机就是当前节点及其所有子节点全部完成入树,此时所有节点路径都可正常访问。
修复方案
按以下顺序修改代码即可解决问题:
- 修改Maquina.gd的实例化逻辑:所有带预定义场景结构的节点,不要直接用脚本类
.new()创建,要先预加载对应场景资源,再调用instantiate()生成实例,这样场景里提前做好的Sprite子节点才会被正常创建:
# Maquina.gd extends Node class_name Maquina func _init(): # 替换原来的Baldosa.new()写法 var baldosa_scene = preload("res://Baldosa.tscn") var baldosa : Baldosa = baldosa_scene.instantiate() add_child(baldosa) baldosa.set_texture(load("res://sprites/TileIcons/bat.png"))
- 修改Baldosa.gd的初始化逻辑:把子节点查询代码从
_init()移到_ready(),同时给set_texture()加简单的容错,避免节点未就绪时调用报错:
# Baldosa.gd extends Node2D class_name Baldosa var imagen : Sprite func _ready(): # 节点全部入树后再查询子节点,不会触发路径错误 imagen = get_node('Sprite') func set_texture(paramTextura: Texture): # 容错:如果节点还没就绪,等_ready执行完再赋值 if not is_node_ready(): await ready imagen.texture = paramTextura
- 原Main.gd中的代码逻辑符合Godot生命周期规范,不需要修改。
内容的提问来源于stack exchange,提问作者Fahed
相关产品推荐
相关产品推荐

