遇上一个碰撞系统的BUG

Uncaught TypeError: Cannot read property ‘parent’ of null
at getWorldScale (load.js:119)
at cc_PhysicsCircleCollider.__init (downloader.js:328)
at CCClass.update (deprecated.js:68)
at 107.cc.Scheduler.update (particle-system-3d-renderer.ts:332)
at 102.cc.Director.mainLoop (shape-module.ts:366)
at callback (enum.ts:97)

即使我修改了引擎代码,加了parent非空判断,还是会报这个错,有谁知道怎么解决吗?

function getWorldScale (node) {

    var scaleX = node.scaleX;

    var scaleY = node.scaleY;

    if(node.parent){ //添加parent非空判断

        var parent = node.parent;

        while(parent.parent){

            scaleX *= parent.scaleX;

            scaleY *= parent.scaleY;

    

            parent = parent.parent;

        }

    }

    return cc.v2(scaleX, scaleY);

}

没有人吗?

修改了引擎代码后解决了。
这算引擎的BUG吗?

我也遇到了同样的问题。
感谢大佬,用你的方法解决了。

楼主方便分享下修改过程么,我这里出现了问题.我这里直接修改源码貌似不生效 :joy:

@jare 官方方便看下么

@BigBear

源码那边有个地方没有用非空判断

engine/cocos2d/core/physics/utils.js 的getWorldScale的代码

嗯嗯 重新编译源码解决了,但是不明白为啥官方不处理。。终究不太方便

不懂啊。。。

感谢你的反馈,这个是在什么的情况下,遇到的?可否告知复现的方式,或者提供简单的DEMO复现?

我做的一个游戏,用了碰撞系统,游戏玩法是两个碰撞物碰到一起会合并并变大,然后其中一个碰撞体会被销毁掉,变大的过程我是修改了scale参数。

这个bug出现的几率很偶然,只在当三个碰撞体【同时】碰撞到一起时才可能出现,三个碰撞体碰撞到一起时会销毁其中两个,剩下的那个会放大两倍,销毁方式是:先removeFromParent,再destroy。这种情况下会同时调用两次scale放大,以及两次销毁,被合成(销毁)的碰撞体在合成中和合成后都有添加状态确保不会被再次触发合成代码,所以不会调用scale放大代码,但不知道是因为异步的原因还是什么,引擎还是调用了那个已经被销毁的碰撞体的getWorldScale代码,但是该段代码未先判断节点的父节点是否为空,而是直接获取它的父节点,所以报错了。

修改前:
image

修改后:
image

1赞

确实是这个样子的