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

Godot中Reference类无法调用get_tree()的场景切换问题求助

问题原因与解决方案

为什么Reference类不能调用get_tree()?

Reference是Godot的非节点基类,用于创建独立于场景树的资源或数据对象,它不属于场景树的层级结构,自然没有get_tree()方法——这个方法是Node类的专属成员,只有继承自Node且已挂载到场景树的对象才能调用。

实例化Player后调用get_tree()返回null的原因

你实例化的Player节点只是一个内存中的对象,还没有被添加到场景树中。只有当节点通过add_child()等方法加入场景树的节点层级后,get_tree()才会返回有效的SceneTree实例,否则返回null,调用change_scene自然会触发空实例错误。

实现读档时场景切换的可行方案

方案1:将读档脚本改为继承Node的全局节点

把脚本的继承类从Reference改成Node,然后在Godot项目设置的AutoLoad中添加这个脚本。AutoLoad的节点会在游戏启动时自动挂载到场景树,此时你可以直接调用get_tree():

extends Node

func load_game(player_data):
    get_tree().change_scene("res://Map/" + player_data.scene)

方案2:在调用读档方法时传入场景树内的节点

如果坚持用Reference类,可在调用读档函数时,传递一个已存在于场景树中的节点(比如当前场景的根节点),通过这个节点获取场景树:

extends Reference

func load_game(caller_node: Node, player_data):
    caller_node.get_tree().change_scene("res://Map/" + player_data.scene)

调用示例(在某个场景节点的脚本中):

var save_system = preload("res://SaveSystem.gd").new()
save_system.load_game(self, player_data)

方案3:通过Engine获取主循环(SceneTree)

Godot的主循环本质就是SceneTree实例,可通过Engine.get_main_loop()获取并转换类型,直接调用场景切换方法:

extends Reference

func load_game(player_data):
    var scene_tree = Engine.get_main_loop() as SceneTree
    scene_tree.change_scene("res://Map/" + player_data.scene)

相关Godot文档指引

  • Node类文档:明确get_tree()方法的归属与使用前提,只有挂载到场景树的Node对象才能调用。
  • SceneTree类文档:学习change_scene等场景管理核心方法的参数与使用场景。
  • AutoLoad文档:了解全局节点的配置方式,让脚本始终能访问场景树。
  • Reference类文档:明确该类的设计用途——用于非场景树关联的资源或数据对象,无场景树访问能力。

内容的提问来源于stack exchange,提问作者DinoNyte

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:55:17