我不知道是什么导致了问题。
我不认为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
我们这里有一个惰性初始化模式:计时器是在我们第一次需要它时创建的,按需而不是之前。