使用cocos creator的过程中碰到的问题记录

时间:2022-06-08 10:19:07

1>编辑器不能识别脚本里面@property类型,显示为null,脚本拖不上去

是@property的类循环引用导致的,可以改变组件类型到cc.Node解决

2> Cannot read property '_assembler' of null ,切换场景时出现。

在这个案例中,场景某一个子节点 onload方法里抛出了一个错误,导致后面所有的onload不能顺利执行,导致render组件未能初始化

3>使用NodePool创建对象池,第一次使用放进去再取出 触摸事件不见了,再次添加也加不上。

 这个问题花了我三个小时查出来,在此公布答案希望大家不要犯。我把node节点从父节点remove了,然后put进对象池,再取出来就没了点击事件。
解决方法有2 不要remove, 在remove里clearup置位false
4>使用代码添加animation不显示 
还需要添加sprite,切记切记
5>跨多层节点转换坐标. 需要先将目标节点转化为世界坐标,然后在转换成对应节点的坐标.使用api:
convertToWorldSpaceAR
convertToNodeSpaceAR
6>碰到了带物理的节点与回收池异常的问题.从回收池出来的第二次利用的节点对implus调用反应动作的异常. 一开始以为是引擎bug.然而论坛反馈问题刚写到一半,忽然想到,
会不会事情倒过来了.第一次是异常的,第二次的表现才是正确的.为了验证这个猜想,将编辑器上的相关数据改动,一看,果然,第一次使用的是编辑器上的默认值.那么,为什么在代码中改动会不生效呢.
这要怪罪于我对物理系统并不怎么熟悉的缘故.须知改动任何的collider的属性,都要apply一下.这样引擎内部会重新生成box2d碰撞盒子.
7>removeFromParent方法并不会调用节点脚本上的onDestory方法.  会调用onDisable
8>设置sprite的spriteFram需要使用texture2d new一个对象出来.直接赋值可能导致多个sprite使用一个texture2d对象,造成意料之外的行为.
9>put进对象池的操作会自动将其从父节点脱离,.所以在onDisable里面进行put操作会导致重复脱离. 并且导致后面的引擎disable操作空指针错误.
10>target.getComponent is not a function   button所依赖的节点从某个方法上发生了属性改变。变成非cc.Node属性。浏览器调试排查出错误。
11>js几乎同一时间,同一帧里面调用同一个方法2次。碰撞检测会出现这个情况,在同一帧里面调用2次碰撞回调。这时候 依赖碰撞检测执行的代码会调用2次或以上,这与我的逻辑相违背。一开始我在代码里面设置了标志位,遗憾的是行不通。想来js是单线程运行。虽然是在一帧里面执行代码2次,但也有先后。而设置标志位,是建立在一些语言可以多线程运行的情况,跑的快的先占这个方法,在他没执行完的时候其他调用返回。既然如此,最后我用了什么方法呢,读取了引擎目前为止所有的帧数,使用变量存储,等待js在同一帧第二次跑这个方法,用帧数判断是否重复执行。其实现在看起来是很基础的常识,然而我搞了半天才理解这个概念。
12>loadRes加载的资源会保留在cc.loader的cache中,你的this.list只是引用,因此改变this.list的元素,也就是改变了cache中这个数组的元素。

再次进行cc.loader.loadRes时,由于这个资源已经被load过了,就会直接取cache中的给到你。因此你会发现再加载得到的内容中有新增的元素。

解决办法:

方案1、json加载后进行深拷贝后再使用
方案2、再次加载前使用cc.loader.releaseRes("level"),释放掉之前的资源,然后再进行重新加载