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

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 Виктор

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 08:30:20