Я пытался получить имя текущей сцены, используя get_tree().get_current_scene().get_name()
, но я получаю сообщение об ошибке:
Попытка вызвать функцию 'get_name' в базовом 'null instance' для null
Экземпляр.
Я узнал, что get_current_scene()
дал мне null
. Это после сцены изменения, где функция работала так, как задумано.
то есть
get_tree().get_current_scene().get_name()
в menu.gd возвращает меню
get_tree().get_current_scene().get_name()
in 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)
- [ Укороченные скрипты: ] -
menu.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")
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 ?
Я решил эту проблему:
настройка var current_scene_name
в levelManager.gd
- в 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()
, хотя они практически находятся в одном и том же удаленном месте в узле.
Скриншот