Godot 4脚本跨场景节点连接问题:如何将关卡节点接入MiniMap场景?
解决Godot 4中"Invalid call. Nonexistent function 'get_node' in base PackedScene"错误
错误原因
你调用get_node的对象是PackedScene资源类型,而非场景实例化后的Node对象。这意味着执行level_scene.get_node(...)时,level_scene还只是未实例化的场景文件,不具备get_node方法。
修正方案
核心是确保只有在场景实例化(得到Node对象)后,再调用get_node获取子节点,同时根据关卡值动态加载对应场景:
extends SubViewport @onready var camera = $Camera2D # 内部变量存储当前关卡,避免setter循环触发 var _current_level = 0 var _level_instance = null # 存储实例化后的关卡节点 var Background var Buildings var Tile_Map # 关卡属性,设置时自动加载对应场景 var level = Global.level: set(value): _current_level = value # 清理旧的关卡实例(防止内存泄漏) if _level_instance != null: _level_instance.queue_free() # 根据关卡值拼接场景路径 var level_path = "res://Scens/Levels/Level%d/Level_%d.tscn" % [_current_level, _current_level] # 加载并实例化关卡场景 var packed_scene = preload(level_path) _level_instance = packed_scene.instantiate() # 从实例化后的节点中获取子节点 Background = _level_instance.get_node("ParallaxBG") Buildings = _level_instance.get_node("Buildings") Tile_Map = _level_instance.get_node("TileMap") func _physics_process(_delta): camera.position = Global.player_position if Input.is_action_just_pressed("action"): # 将关卡元素添加到MiniMap视图 add_child(Background) add_child(Buildings) add_child(Tile_Map) # 切换到关卡1(示例) level = 1
注意事项
- 核对关卡场景路径:确保
Level1、Level2等场景的路径和代码中拼接的格式一致,若路径命名规则不同,需调整level_path的拼接逻辑。 - 子节点名称匹配:确保场景中
ParallaxBackground、Buildings、TileMap的节点名称和代码中的ParallaxBG、Buildings、TileMap完全一致(大小写敏感)。 - 重复切换关卡时,通过
queue_free()销毁旧实例,避免内存堆积。
内容的提问来源于stack exchange,提问作者DIY Виктор
相关产品推荐
相关产品推荐

