昨晚临近下班,本想准时下班,然后屁颠屁颠的浪,结果同事给我反馈了个bug(ORZ)
手机上表现是:页面卡死,任何操作都不响应;模拟器表现是:一样的,日志打印了一堆:“the child to add must be instance of not”,这是个什么错误????
添加的节点是实例化预制体而来,就是这样
![]()
添加预制体也就是:parent.addChild(node)这样。
整个论坛只有一个帖子:为什么NodePool.put()会出现问题
???????
最后是这样:node.parent = parent解决了问题。
很懵逼,是正常的实例化预制体和添加节点的操作,不知错从何来。。。。
你调用代码之前打印一下node和parent,看看是不是哪个为空
都看了,都不为空
所以就很迷
这个child就是一个实例化的预制体,原本我是怀疑没有成功实例化,
昨晚通过日志确定了实例化成功
![]()
这个tipPrefab就是这个child,money_tip是预制体。
你应该要确定tipPrefab是cc.Node类型才行,先看你的money_tip是不是cc.Node
你试看看,看看这 三个 log 的结果是什么
console.log(child instanceof Node);
console.log(child instanceof Node && child.constructor === Node);
console.log(child instanceof Node && !(child instanceof cc.Scene));
我遇到过这种情况,无非就是你instantiate的时候,在其它地方去addchild了,那时候addchild 可能是没克隆完,我不知道引擎怎么判断的
也不应该吧,我是在同一个方法里面instantiate和addchild的,在addchild之前还进行了数组合并等其他操作。实例化一个预制体需要很多时间吗?
![]()
在这里添加到数组
![]()
在这里addchild
![]()
moneytip是prefab,不是node,tipitem是实例化的moneytip,cc.instantiate(prefab)返回的是node啊
现在输入这 三个 log 就是要排查一下为什么返回的 node,但是 addChild 检测 isNode 是 false 的问题
console.log(tipPrefab instanceof Node);
console.log(tipPrefab instanceof Node && tipPrefab.constructor === Node);
console.log(tipPrefab instanceof Node && !(tipPrefab instanceof cc.Scene));
你什么都别管,想办法,输出上面这 三个 log 看看结果
大佬输出了,

还有这个Node应该是cc.Node吧?
拿奇怪了,都为 true 不应该会报错才对,如果你用 cc.Node.isNode(tipPrefab) 是 true 还是 false?
都是true

然后还是报 the child to add must be instance of not 这个错了?
是的,还是会报这个错。
但是我尝试了三种:
1.parent.addChild(tipPrefab)//会报错
2.tipPrefab.parent = parent;
3.if(tipPrefab.name!=“money_tip”)…
只有第一种,直接添加的时候报错,报错之后,短时间内编辑器卡死
反复测了多次,在真机上不是必现的bug,在模拟器上几乎必现。demo我试试能不能从项目中抽出来
按道理,如果三个 isNode 为 true 都话,就不应该会报错才对,你能不能给我一下简单的 demo,我这边测试看看?
大佬,我找到错误了
是我自己的代码原因:循环体越界了
(又是一个沙雕的问题)
那你总结一下然后结帖吧,感谢


