我试图通过使用get_tree().get_current_scene().get_name()
获取当前场景的名称,但出现错误:
尝试在空实例的基础“空实例”中调用函数“get_name”。
我发现那get_current_scene()
是给我null
的。这是在功能按预期工作的更改场景之后。即
get_tree().get_current_scene().get_name()
在menu.gd中返回菜单
get_tree().get_current_scene().get_name()
在game.gd中返回错误,因为get_tree().get_current_scene()
是null
levelManager.gd(自动加载的单例)[完整脚本]
extends Node
const SCENE_PATH = "res://scenes/"
func change_scene(scene_name):
deffer_call("_deffered_change_scene", scene_name)
func _deffered_change_scene(scene_name):
var path = SCENE_PATH + scene_name + ".tscn"
var root = get_tree().get_root()
var current = root.get_child(root.get_child_count() - 1)
current.free()
var scene_resource = ResourceLoader.load(path)
var new_scene = scene_resource.instance()
get_tree().get_root().add_child(new_scene)
get_tree().set_current_scene(new_scene)
func _process(_delta):
if Input.is_action_pressed("close"):
get_tree().quit()
func deffer_call(func_name, func_param):
call_deferred(func_name, func_param)
--[缩短的脚本: ]--
菜单.gd
extends Node
func _ready():
var scene_name = get_tree().get_current_scene().get_name()
print(scene_name) # returns 'menu'
# on full version of the script, mechanism that called _change_scene here
func _change_scene():
levelManager.change_scene("game")
游戏.gd
extends Node
#game variables declared here
func _ready():
var scene_name = get_tree().get_current_scene().get_name()
print(scene_name) #returns an error due to get_tree().get_current_scene() being null
# rest of the game logic code here
我想知道为什么会这样。我从levelManager.gd更改场景的方式有问题吗?
我通过以下方式解决了这个问题:在 levelManager.gd 中设置var current_scene_name
——在
menu.gd和game.gd中current_scene_name
——通过调用重新设置self.get_name()
即 levelManager.gd
var current_scene_name
-- menu.gd和game.gd --
var scene_name = self.get_name()
levelManager.current_scene_name(scene_name)
^ 这显然是一种解决方法。它有效,但我仍然想知道为什么我在调用后得到不同的输出,get_tree()
而它们实际上位于节点中的同一个远程位置。
截屏