在一个场景中 需要动态创建一个 【节点A】 在【节点A】中又需要动态创建一个【节点B】
所以我将【节点B】的预制体放在节点A的脚本中进行设定,如图:
在【节点A】的脚本中,使用B的预制体创建节点B
/**
* 创建角色模型
* @return {cc.Node}
*/
createModelPerson(){
let nCount = 10;
while(nCount>0){
nCount–;
let pNodePerson = cc.instantiate(this.s_pModelPerson);
if(pNodePerson!=null){
return pNodePerson;
}
}
console.error(‘SB_ModelSolder createModelPerson failed!’);
return null;
},
PS:这里为了测试,写了创建10次,最后测试的结果是一旦失败,多少次的尝试都是失败的。
这里需要说明一下,就是:这个问题是偶发的,一般是没问题的。但是基于大量尝试的情况下又是必然发生的。我测试的频率大概就是20到100批创建,每批从10到30个创建不等。几乎必定发生这个问题。
开始我怀疑这个是因为预制体出现了错误。所以我输出了创建成功时和失败时的预制体信息,如下图:
左边是创建成功时的预制体信息,右边是创建失败时的预制体信息。
可以明显看出失败时,预制体信息是异常的。但是我读不懂到底哪里有问题。
我以为,这种问题是偶发的。频率倒不是特别高,所以做了容错处理,如果创建失败,就退出场景。
然而问题却不是这么简单。切换到别的场景,再次进来此场景时,还是同样的问题,创建出来的节点对象是空的。只能重启程序,然后问题暂时解决,等到下次出问题,又需要再次重启。
我之所以怀疑是预制体套预制体的问题,是因为在QQ群Cocos 官方 19 群 (Creator)中一些大佬们帮我分析,暂时得出的结论。
因为,在上一个版本中是没有出现这个问题的,游戏经过谷歌浏览器,微信开发者平台,微信手机安卓和iphone端大量的体验,都没有这个问题出现。
之前的版本解决方案是:
我自己写了一个预制体管理器,在进入游戏后统一加载。然后在需要用的时候从管理器中获取。
这个版本是我最近才改的
我嫌预制体管理器的加载需要占用玩家太多时间,就删除了,在用的时候加载,然后就遇到预制体套预制体,出现问题了。
话有点啰嗦,感谢大佬们的阅读。希望能够解决问题。也希望能对社区有所帮助。

