2

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

屏幕截图 - Godot 获取持续时间计时器

我已经尝试了 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 行都会导致突出显示的错误消息

“无效的设置索引'wait_time'(基于:'Nil'),值为'int'类型。

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

duration_timer.wait_time = 1

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

4

1 回答 1

0

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

我不认为get_node("DurationTimer")$DurationTimer错。但如果这是问题所在,我们可以使用 a 来解决它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对我们没有帮助。所以我们可以在没有和没有初始化的情况下duration_timer定义。onready并始终使用获取计时器的方法。

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

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

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

于 2022-02-09T06:12:11.223 回答