【发布时间】: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,最小的项目将帮助引擎开发人员追踪它。