【问题标题】:Why am I not able to reassign this basic variables value (GODOT game engine)为什么我无法重新分配这个基本变量值(GODOT 游戏引擎)
【发布时间】:2026-01-28 08:35:01
【问题描述】:

我在一个名为“var Current_Scene”的自动加载中有一个简单的变量,它没有分配任何值(这意味着它自动为空。

在我的游戏中,当您单击一个按钮时,“Current_Scene”的值应该会更改为一个名为“Main Street”的字符串。当我检查调试中的值是否更改时,它说“Current_Scenes”值仍然为空。即使我通过将 "Current_Scenes" 值预设为字符串 "cat" 进行实验,在我尝试将其更改为 "Main Street" 后,调试说它仍然是猫。想知道我错过了什么?

下面是我的代码,用于检查我的值是否被正确重新分配:(在场景 2 中)

func _ready():
        if SceneChange.Current_Scene != "Main Street":
        print(SceneChange.Current_Scene)

下面是我在自动加载中设置变量的代码:(在自动加载中)

var Current_Scene

下面是我想要更改变量值的按钮的代码:(在不同的场景 1 中)

func _on_Button_pressed():
#starts world clock when start button is clicked
WorldClock._WorldTimerStart()

SceneChange.RemoveScene()
SceneChange.enter_main_street()
SceneChange.Current_Scene = "Main Street"

感谢您的帮助!

【问题讨论】:

    标签: string variables null var godot


    【解决方案1】:

    我没有你的场景加载代码(RemoveScene+enter_main_sceneimplementation),所以我只使用了get_tree().change_scene(...。我无法以这种方式重现问题,所以它可能在您的场景加载/更改代码中。请提供您对这些方法的实现以进一步详细说明或尝试将其更改为get_tree().change_scene() 并查看问题是否已解决。

    我的假设是我们的案例之间的区别在于您的实现在执行 SceneChange.Current_Scene = "Main Street" 行之前在第二个场景调用 _ready() 回调。如果我使用get_parent().add_child(secondScene.instance()) 而不是get_tree().change_scene(),对我来说就是这种情况。修复该问题,交换执行字符串分配的代码行并将打包的第二个场景添加为当前场景的子节点。

    我的实现:

    # Autoload named 'Global'
    extends Node
    
    var global_string = "cat"
    

    # Script attached to the root node of "MainStreet.tscn"
    extends Node2D
    
    func _ready():
        if Global.global_string != "Main Street":
            print(Global.global_string)
    

    # Script attached to the button on the first scene:
    extends Button
    
    func _on_Button_pressed():
        get_tree().change_scene("res://MainStreet.tscn")
        Global.global_string = "Main Street"
    

    修复第二个场景添加add_child:

    var secondScene = load("res://MainStreet.tscn")
    
    func _on_Button_pressed():
        Global.global_string = "Main Street" # should go first
        get_parent().add_child(secondScene.instance()) # calls _ready() on second scene
    

    按照this Godot tutorial的建议,你也可以通过call_deffered("your_method_that_changes_scene")推迟换景。

    我的 Godot 版本是3.2.3

    【讨论】: