get_tree (). get_current_scene () возвращает ноль в godot / gdscript - PullRequest
1 голос
/ 23 мая 2019

Я пытался получить имя текущей сцены, используя 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(), хотя они практически находятся в одном и том же удаленном месте в узле.

Скриншот treeScreenshotBeforeAndAfterChangingScenes

...