发现cocos切换项目时的一个BUG

  • Creator 版本:2.0.9

  • 目标平台:cocos自身

  • 详细报错信息,包含调用堆栈:

TypeError: target.getComponent is not a function
at cc_Button._getTargetSprite (D:\cocos\2.0.9\CocosCreator\resources\engine\bin.cache\dev\cocos2d\core\components\CCButton.js:380:37)
at cc_Button._applyTarget (D:\cocos\2.0.9\CocosCreator\resources\engine\bin.cache\dev\cocos2d\core\components\CCButton.js:386:37)
at cc_Button.notify (D:\cocos\2.0.9\CocosCreator\resources\engine\bin.cache\dev\cocos2d\core\components\CCButton.js:187:30)
at cc_Button.val.set (D:\cocos\2.0.9\CocosCreator\resources\engine\bin.cache\dev\cocos2d\core\platform\preprocess-class.js:44:28)
at cc_Button.n.set [as target] (D:\cocos\2.0.9\CocosCreator\resources\app.asar\editor\page\scene-utils\lib\asset-watcher.js:1:782)
at a (D:\cocos\2.0.9\CocosCreator\resources\app.asar\editor\page\scene-utils\lib\asset-watcher.js:1:1099)
at CallbacksInvoker.invoke (D:\cocos\2.0.9\CocosCreator\resources\engine\bin.cache\dev\cocos2d\core\platform\callbacks-invoker.js:167:29)
at D:\cocos\2.0.9\CocosCreator\resources\app.asar\editor\page\scene-utils\engine-extends\asset-library-extends.js:1:1357
at CCLoader. (D:\cocos\2.0.9\CocosCreator\resources\engine\bin.cache\dev\cocos2d\core\platform\CCAssetLibrary.js:64:25)
at D:\cocos\2.0.9\CocosCreator\resources\engine\bin.cache\dev\cocos2d\core\load-pipeline\CCLoader.js:139:46

  • 重现方式:

项目切换时100%出现

出现原因已经查明,当切换项目时(比如点开子域,再点开主域),就会直接出现这个报错。选择原因不明,但会抽取一个button(大概率为一个固定的button)的target会变为
。无论是让这个target本身就为空还是不为空,都会被这个东西所替换并且报错。测试时主要的替换对象是通过复制出来的button节点,偶尔会出现其他button的target也被替换的情况。且每次替换只会出现1次。同事做过demo测试没有这个问题,区别在于我在切换项目时,引擎会自动进行一次疑似刷新操作,而同事的引擎没有这个问题(同2.0.9)。这个问题会导致onload没法执行被跳过继而执行start,希望引擎组留一下看看是什么问题。

这个是否与你的项目缓存有关系。
你把两个项目的assets文件拷贝出来,然后再用creator打开试试。

Cocos Creator 2.1.0也有这个问题= =目前没有找到合适的解决方案。

该项目在重启过后当时没有这个问题了。但是现在新开的项目也会有这个问题,场景中只有3个button,只要打开另一个cocos(其他项目或者子域),保存,并且打开vscode(该项目)并保存,回到该项目的cocos上,就会出现这个问题。而且会非常固定的出现在一个按钮中(以现在的项目来说)。这次重启电脑或者cocos并没有效,试过你说的方法,可能是我理解有错?并不能打开只有assets文件夹的项目。试过删除Library,也没有笑。这个问题主要是很麻烦,不管不是管也不是,特别是需要大量主域子域一起修改测试时,要在一大堆按钮中逐一排查问题按钮,非常恶心

能录制一个复现视屏给我么

具体就是,当前按钮的Target为空或者是其他东西(反正是正常情况),取消对按钮的选中,进入第二个项目,保存,进入脚本(主域),修改,保存,回到第二个项目,再重新保存,回到主域项目,该按钮(该为第二个项目,第一个项目会在任意按钮中出现)的Target会变为
,并且报错,这个错误会导致所有脚本的Onload无法执行(但是任然可以执行start→_→)

并不会100%出现,但是概率在50%以上。而且通常会针对一个按钮,而且这个针对很特别,如果该按钮被删除,他会选择其他按钮去出现这个BUG,但是概率会变低(目测)。当你重新添加回这个按钮(新建),他又会重新针对这个按钮(新项目还没试过,之前的项目(也是2.0.9版本开发的)会出现这个问题)

我这边确实没复现出来,我会留意这个问题的。

坐等问题解决 版本也是2.09,前期跳转场景都没问题 现在干不了了

大兄弟 解决了没有 这个有毒 不能上厕所 0.0 回来一样了

找到原因了 基本认为 就是所有按钮必须带target绑定节点 为空就报错

这个我应该又说解决办法吧,你把场景里的所有button组件查找一次,如果有一个是
你就把这个Target删掉,就可以运行了

3赞

就是删了报错 必须要绑定才没事:grinning:

我是删了没有问题(atrget为空),但是上述操作有可能会给Target附上一个奇怪的东西(如图),然后就报错狗带了

总结了一下 不能开两个项目 和删除按钮上的Target-------

今天我也上厕所了,所以我也炸了

炸了

确实我们这边也有同事遭遇到这个bug,挨个去查找按钮要死了。。。

mark一下我也遇到这个问题,确实找到一个按钮存在上述问题


找到所有按钮,发现如下图存在target是default_btn_disabled属性的

把这个按钮改为按钮自身就好了!
不知道什么时候能解决一下!

这个有效!!!