【问题标题】:Getting this error "add_child: Parameter "p_child" is null" and can't seem to track it down收到此错误“add_child:参数“p_child”为空”并且似乎无法追踪它
【发布时间】:2021-06-21 21:12:13
【问题描述】:

add_child:参数“p_child”为空

我怀疑这是 Godot 编辑器错误,因为游戏运行良好。

这个很难描述,但基本上我有一个从网格运行的“记忆”纸牌游戏。您选择您的难度,然后按新游戏。第一次,没有错误,但如果你赢了或选择“新游戏”,错误就会开始堆积,而且似乎每次都翻倍,每次按下新游戏按钮时最多出现 100 个错误。

google 上唯一的东西似乎与 C++ 相关(p_child 的名字肯定暗示了这一点),但我没有使用 C++,我使用的是 GDScript……这就是为什么我在想也许它只是一个编辑器错误,Godot 只是对我没有以 C++ 方式添加_child 感到困惑。

有什么想法吗?

编辑 产生错误的代码是这样的:

func dealDeck():
    randomize()
    deck.shuffle()
    var c = 0
    while c < deck.size():
        Game.get_node('grid').add_child(deck[c])
        c += 1

Game 只是对主场景 (/root/Memory) 的引用,而 deck 是先前创建的包含所有卡片的数组。我 99% 确定问题不在于套牌创建。

需要明确的是,我在新游戏开始时清除网格,但我怀疑整个过程出现问题(即使游戏正在运行)

【问题讨论】:

  • 自动加载代码的错误?我猜这个错误是由场景变化引起的。这意味着尽管场景发生了变化,但仍有一些代码从场景中读取。自动加载代码可以做到这一点。
  • 有趣。我正在使用我的主脚本文件的自动加载(我怀疑这不是正确的做法,但我仍然在这里学习!)
  • 如果该代码是问题的根源,则意味着卡片无效。但如果是这样的话,它并不能解释为什么它会继续工作。你确定每次拿到卡片的顺序都不一样吗?还有其他 add_child 调用吗?我认为是其他事情搞砸了,这将是在新游戏中发生的事情。但我很难想象是什么。
  • 这就是为什么我怀疑它可能是编辑器错误/故障类型的事情。因为如果该项目为空,那么就没有套牌可以玩游戏(并且错误不会导致崩溃)。我不是说我没有做错什么。这可能是最有可能的答案。但我很擅长在我的代码中压缩错误/错误,而这个让我受阻。
  • 我想重申这些都是失败的断言。让 Godot 崩溃并不像在某处传递无效引用那么容易。我认为您应该尝试制作一个重现该问题的最小项目。要么在制作过程中找出问题的根源,要么在 Github 上打开一个 bug,最小的项目将帮助引擎开发人员追踪它。

标签: godot gdscript


【解决方案1】:

由于 Godot 是用 C++ 编写的,因此控制台中给出的错误来自编辑器的 C++ 端。这并不意味着您的 GDScript 代码不对错误负责。似乎您正在尝试将孩子添加到对象,但您尝试添加的孩子为空。这可能是由于许多原因。您应该首先查看在新游戏开始时如何将卡片添加到场景中。另外,如果您可以向我们展示一些代码,我们可能会为您提供进一步的帮助。

【讨论】:

  • 奇怪的是,尽管出现错误,游戏仍然运行良好。玩家永远不会知道有错误。在上面的评论中,有人提到它可能与使用 Autoload 有关,我正在使用我的主脚本文件。正在生成卡片,然后将其发送到主场景(脚本未附加到该场景)。这很令人困惑,因为如果是这样的话,为什么它仍然按照我的预期工作(当然减去奇怪的错误)?
  • @BuckRussell 这是一个失败的断言。有些东西用无效的引用调用add_child。那是白费力气。然而,它的发生表明您的代码有问题。大概您没有调用add_child(null),但必须调用add_child,并且无论传递什么,它都会以某种方式变得无效或为空。既然你说游戏可以正常运行,我认为调用 add_child 并传递空值或无效引用的代码在不应该运行的时候运行。
  • @BuckRussell 在这里,这是带有断言的行:github.com/godotengine/godot/blob/… - 什么叫它?我不知道。您可以搜索源中的每个 add_child。现在,为什么我建议自动加载?因为,在您的问题中,您说错误在游戏第一次完成后开始发生,并且尽管场景发生变化或重新加载,自动加载仍将保留在那里。所以这是我首先要看的地方。
  • 这是似乎引发错误的代码:func dealDeck():randomize()deck.shuffle()var c = 0while c &lt; deck.size():Game.get_node('grid').add_child(deck[c])c += 1Game 是对“/root/”的引用记忆”,这是主要的场景。我已经尝试将代码移动到 Memory.gd (主场景的脚本),但没有任何区别,错误仍然发生,但肯定是 add_child (即使卡组处理得很好)。我尝试编辑代码以使其看起来更好,但显然 SO 无法正确格式化代码...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2011-11-05
  • 2019-01-26
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
  • 2014-04-18
相关资源
最近更新 更多