Godot中如何获取另一个场景中的节点?
Godot 跨场景获取并存储节点引用的实现方案
首先明确前提:get_node() 只能检索到当前已经挂载到场景树中的节点,未实例化、未加入场景树的场景节点无法直接通过路径获取,可根据使用场景选择以下方案:
- 方案1:使用全局自动加载单例存储引用(最稳定推荐)
适合需要跨多个场景频繁访问的公共节点
操作步骤:
- 新建全局脚本,例如命名为
Global.gd,提前定义用于存储节点的变量:
# Global.gd 内容 var player: CharacterBody2D var game_ui: Control
- 进入「项目设置-自动加载」页签,将
Global.gd添加到自动加载列表并启用,该脚本会作为全局单例全程存在于场景树中。 - 在对应节点所属场景的
_ready()生命周期中,将自身引用赋值给全局变量:
# 玩家节点所属脚本的内容 func _ready(): Global.player = self
- 任意场景都可以直接调用
Global.player访问该节点,无需重复执行get_node查找。
注意节点销毁时要清空引用避免野指针报错:
func _exit_tree(): if Global.player == self: Global.player = null
- 方案2:动态实例化场景时直接存储引用
适合你手动加载并挂载其他场景的场景
当你在当前脚本中动态实例化外部场景时,直接把返回的实例存在变量中即可直接调用:
var boss_scene = preload("res://scenes/Boss.tscn") # 实例化后存储引用 var current_boss = boss_scene.instantiate() add_child(current_boss) # 后续直接使用存储的变量调用节点方法 current_boss.take_damage(10)
- 方案3:通过场景树绝对路径访问已挂载节点
仅适合两个场景均已加入当前场景树的临时场景使用
如果目标节点已经在场景树中,可以用根路径/root/开头的绝对路径查找:
# 假设场景树结构为 Root -> MainUI -> ScoreLabel var score_label = get_node("/root/MainUI/ScoreLabel")
注意:该方法强依赖场景树层级结构,后续调整节点位置会直接导致路径失效,不建议在核心逻辑中使用
内容的提问来源于stack exchange,提问作者T-Rex
相关产品推荐
相关产品推荐

