我刚刚开始在Godot引擎中制作一个基本的fps,我目前正在制作一个基本的Raycast武器。我查阅了Coding With Tom、Gabaj YT和其他许多人的教程,但无论是哪一个,我最后总是写同样的代码:
如果Raycast.is_Colliding:
不管我怎么精确地复制它,我总是以同样的错误结束:
错误:试图在null实例上调用函数' is_collisions ' .
Raycast
是一个类。is_colliding
是其中一种方法。但它不是一个静态方法,你需要一个Raycast
的实例。
很有可能,您确实有一个实例。如果你一直在跟随教程,大概你在场景树中添加了一个Raycast
节点,它被称为……让我猜猜……Raycast
。是的,我也这样做。直到它开始成为一个问题,我将其重命名为更有意义的东西或采用不同的方法,但我离题了。
问题是你没有引用Raycast
实例。您可以从您的脚本参考节点使用$
,像这样:$Raycast
。它是使用get_node
方法的简写。请参阅节点和场景实例。要清楚,您放在$
之后的是场景树的相对路径,因此它可能不仅仅是节点的名称。这里我假设该节点是包含您正在编写的脚本的节点的直接子节点。
if $Raycast.is_colliding():
当然,你会看到这样的代码:
if raycast.is_colliding():
这是因为在脚本的某个地方,他们有一行看起来像这样:
onready var raycast := $Raycast
声明了一个变量raycast
,并且- ready -将其设置为对节点的引用,然后他们可以继续在那里使用该变量形式。有了视频教程,有些人可能会略过这些。我在Garbaj的视频中找到了它:Godot FPS Hitscan Weapons Tutorial at 1:52