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
我们这里有一个惰性初始化模式:计时器是在我们第一次需要它时创建的,按需创建,而不是之前。
我正在尝试进入 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
我们这里有一个惰性初始化模式:计时器是在我们第一次需要它时创建的,按需创建,而不是之前。