我正在给我的游戏添加一个主菜单。我正在做的事情是将它们添加到场景中,然后将场景更改为游戏场景。然而,我的游戏有属于其他场景的错误,这些场景在现有场景中没有实例。我得到的错误信息如下:
Invalid get index 'HasEntered' (on base: 'null instance').
我的整个项目都在这里:https://github.com/Ripple-Studios/Godot-Wild-Jam-36-Game-Ripple-Studios
如果有人能帮我,我将不胜感激。
谢谢,
发布于 2021-08-21 18:22:11
我看了一下链接的代码。
正在发生的事情是,获取父节点的做法又回来咬你了。我说的代码看起来像这样:
get_parent().get_node(...)
您在主场景(MainMenu.tscn)中实例化了一个场景(HospitalScene.tscn),其代码类似于上图所示。
您提到的特定错误来自如下代码:
func _on_Area2D_body_entered(body):
var HospitalPosition = get_parent().get_node("Hospital")
if HospitalPosition.HasEntered == true:
HospitalPosition.isInHospital = false
此代码在开始时触发,因为Area2D
与StaticBody
__重叠。
代码正在尝试获取场景树中不存在的同级"Hospital"
。因此HospitalPosition
为空。当HospitalPosition
为null时,尝试访问HospitalPosition.HasEntered
会导致您提到的错误:
Invalid get index 'HasEntered' (on base: 'null instance').
场景正在尝试到达自身外部的节点。并且不能保证场景将在这样的节点可用的地方被实例化。因此,在get_parent().get_node(...)
的每一种情况下,都可能发生这种情况。
事实上,在运行游戏时,我得到了四个错误,看起来像这样(但路径不同):
E 0:00:01.494 get_node: (Node not found: "Hospital" (relative to "/root/CanvasLayer/ParentSprite/Control").)
<C++ Error> Condition "!node" is true. Returned: nullptr
<C++ Source> scene/main/node.cpp:1325 @ get_node()
<Stack Trace> HospitalScene.gd:28 @ _on_Area2D_body_entered()
您可以使用get_node_or_null
而不是get_node
,并检查null
。
您还可以导出NodePath
变量,而不是对路径进行硬编码。
与检查实例是否有效相比,更好的解耦策略包括:
https://stackoverflow.com/questions/68874274
复制相似问题