Godot:获取节点结果为零值

Godot: Getting a node results in Nil Value

我正在尝试进入 Godot。在我的项目中,我想在附加到 Dash 节点的 Dash 脚本中访问一个名为 Duration Timer 的计时器。

Screenshot - Godot get Duration Timer

我已经尝试了 3 种访问节点的方法,如屏幕截图的第 4,5 和 6 行所示。

onready var duration_timer = $DurationTimer
#onready var duration_timer = get_node("DurationTimer")
#onready var duration_timer = get_node("Movement/Dash/DurationTimer")

所有 3 行都会导致突出显示的错误消息

"Invalid set index 'wait_time' (on base: 'Nil') with value of type 'int'.

错误出现在第 14 行,试图将 wait_time 设置为 Timer 元素。

duration_timer.wait_time = 1

有人知道为什么我无法获取 Timer 元素吗?

我不知道是什么导致了这个问题。

我认为 get_node("DurationTimer")$DurationTimer 没有错。但如果这是问题所在,我们可以使用 NodePath:

来解决它
export var duration_timer_path:NodePath
onready var duration_timer = get_node(duration_timer_path)

然后在检查面板中设置NodePath


如果路径没有错。可能是 _ready 之前的代码是 运行。或者有什么东西(我不知道是什么)删除了计时器或将其设置为空。 当游戏从编辑器运行开始时,您可以添加一个断点并在场景树面板的远程选项卡上检查,以查看计时器是否存在。

如果我们没有定时器,我们可以通过制作一个新定时器来回避这个问题。例如:

if not is_instance_valid(duration_timer):
    duration_timer = Timer.new()
    duration_timer.name = "DurationTimer"
    add_child(duration_timer)

# use duration_timer here

然而,如果计时器存在但我们未能获得它,我们将在场景树中有两个计时器。 如果这导致两个计时器,您还可以检查场景树面板的远程选项卡。

所以,让我们再次尝试获取节点,以防我们第一次失败。让我们把它全部放在一个方法中。像这样:

func get_duration_timer() -> Timer:
    if is_instance_valid(duration_timer):
        return duration_timer

    duration_timer = get_node("DurationTimer") # or use a NodePath
    if is_instance_valid(duration_timer):
        return duration_timer

    duration_timer = Timer.new()
    duration_timer.name = "DurationTimer"
    add_child(duration_timer)
    return duration_timer

事实上,如果我们处于这种情况,那么 onready 对我们没有帮助。所以我们可以在没有 onready 和没有初始化的情况下定义 duration_timer 。并且总是使用获取定时器的方法。

如果我们要一直使用该方法,为什么不让该方法添加计时器而不是将其添加到场景树中呢?然后我们可以删除尝试获取它的步骤:

func get_duration_timer() -> Timer:
    if is_instance_valid(duration_timer):
        return duration_timer

    duration_timer = Timer.new()
    duration_timer.name = "DurationTimer"
    add_child(duration_timer)
    return duration_timer

我们这里有一个惰性初始化模式:计时器是在我们第一次需要它时创建的,按需创建,而不是之前。