【必现bug】【creator3.5】一启动场景卡死!!!

今天打开项目,卡死在这个场景了,点其他任何场景 / 预制都没有用!!!

求救,这怎么干活。。!!!

通过顶部菜单,开发者选项,打开场景调试工具,看看是否有报错。把这个出问题的场景备份一下,发一份过来看看,然后删掉重启看看能不能进

那个场景确实有问题,我command+s保存了一下 Test2Scene,我看到上面有2个相同的 GameSocket 结点,上面都挂了一个脚本组建,我删了脚本组建,就果然能打开其他 场景 和 Prefab 了。

然后我发现这2个 TestScene 和 Test2Scene一摸一样,而且那2个 GameSocket 节点都删不掉,我就把2个 TestScene 和 Test2Scene 文件都给删掉了。现在看上去貌似恢复正常了。

好了,能恢复就好了!我也不去恢复刚刚删掉的那2个场景文件了!感谢。

不对啊。现在关闭编辑器,再每次打开,都会这样:

卧槽,怎么回事。2个cocos 项目文件怎么交叉再一块了??

image

我确定下面的文件夹,是另一个工程里的资源

新版本刚发布就敢用,腻害,,一般不都是等发布2个大版本以上才稳定的么

没办法,我们尝试了3.3 / 3.4 都有各种各样的问题,比如3D粒子、模型等一些功能都不好用,3.5 在 3D粒子方面还是比较完善一点的,但是其他问题也比较多。

选中场景,右键,在资源管理器中显示,看看目录在哪里

不对啊。现在关闭编辑器,再每次打开,都会这样:

你换个场景看还会不会有这个问题,这个提示应该是你场景里有异常才出现的

我昨晚就已经清除了,后面根据那个异常的节点,我好像找到原因了:

在一个单列的代码里,因为有一个全局的 new () 这个单列,通过代码添加的这个「常驻节点」会导致 Creator编辑器 产生各种卡死的问题。

现在即使没有在浏览器中运行,编辑器也会自动执行脚本吗?干嘛这么做啊?很容易产生诡异的问题!

装饰器使用 · Cocos Creator 脚本默认不会在编辑器里加载,需要加装饰器才会在编辑器里执行的

如果不会执行,为什么我每次启动编辑器,编辑器的控制台,会自动执行我的代码,比如console.log() 之类的?

需要加装饰器才会在编辑器里执行的

不是一定不会执行啊大哥。。。

需要加装饰器才会行执行,不是一定不会执行!!

????好吧,还是不懂:joy::joy::joy:

装饰器使用 · Cocos Creator 这个是文档链接

我不去纠结装饰器了,这个bug本身不是装饰器的问题。

我就姑且理解成: ccclass 标识的类,会在装饰器函数里 new 出来。

这个bug本身是:
那个「常驻节点」会导致编辑器卡死!

  1. 我知道为啥了,你的代码是加在组件外部的,所以被编辑器加载了。建议还是不要这样写,最好是在脚本生命周期里做这些事情。
// 写在组件外部会被加载,最好写在脚本生命周期方法里
const n = new Node('test');
game.addPersistRootNode(n);

@ccclass('NewComponent')
export class NewComponent extends Component {

  1. 你截图的报错,我们在处理了。但是我这边报错不会导致场景卡死,请看看你添加的常驻节点身上的组件是不是有问题哈~
  1. 对,是在 class 外面的,我上面也说了:

主要是单列的,而且有很多和节点声明周期无关的代码,所以目前我们项目里这种写法非常非常的多。

再比如,这种单例:

export class ABC {
private ddd = new DDD();
}

const abc = new ABC();
export default abc;

然后这里调用了另外的DDD代码,另外的代码里有 game.addPersistRootNode(n); 等等操作!


  1. 那个常驻节点,正如你上面代码一样,这边是 const node = new Node("");node.addCompoenet(GGG);这样出来的,然后game.addPersistRootNode(n);,每次重启编辑器,场景上莫名增加2个节点GGG,从而导致的编辑器卡死。

就目前的机制来看,请不要在全局执行addPersistRootNode操作,因为这个节点会被加到场景中,保存的时候也会跟着保存到文件里,刷新脚本时就会添加相同节点。最好是只在运行时才使用这个方法,还是建议你把这个操作放到某个很早加载的组件的生命周期内。

如果想添加常驻节点,同时在编辑器下不想保存的话,可以使用 node.hideFlags |= CCObject.Flags.DontSave;