引擎文件 instantiate-jit.ts 遇到的坑

3.3.2版本的 instantiateObj方法

obj.node.isChildOf(this.parent)
我碰到了obj.node为空的时候,导致程序异常
增加空判断就解决了。

源代码

        if (legacyCC.Class._isCCClass(ctor)) {
            if (this.parent) {
                if (this.parent instanceof legacyCC.Component) {
                    if (obj instanceof legacyCC._BaseNode || obj instanceof legacyCC.Component) {
                        return this.getObjRef(obj);
                    }
                } else if (this.parent instanceof legacyCC._BaseNode) {
                    if (obj instanceof legacyCC._BaseNode) {
                        if (!obj.isChildOf(this.parent)) {
                            // should not clone other nodes if not descendant
                            return this.getObjRef(obj);
                        }
                    } else if (obj instanceof legacyCC.Component) {
                        if (!obj.node.isChildOf(this.parent)) {
                            // should not clone other component if not descendant
                            return this.getObjRef(obj);
                        }
                    }
                }
            }
            createCode = new Declaration(LOCAL_OBJ, `new ${this.getFuncModule(ctor, true)}()`);
        }

修改后代码

        if (legacyCC.Class._isCCClass(ctor)) {
            if (this.parent) {
                if (this.parent instanceof legacyCC.Component) {
                    if (obj instanceof legacyCC._BaseNode || obj instanceof legacyCC.Component) {
                        return this.getObjRef(obj);
                    }
                } else if (this.parent instanceof legacyCC._BaseNode) {
                    if (obj instanceof legacyCC._BaseNode) {
                        if (!obj.isChildOf(this.parent)) {
                            // should not clone other nodes if not descendant
                            return this.getObjRef(obj);
                        }
                    } else if (obj instanceof legacyCC.Component) {
                        if (obj.node && !obj.node.isChildOf(this.parent)) {
                            // should not clone other component if not descendant
                            return this.getObjRef(obj);
                        }
                    }
                }
            }
            createCode = new Declaration(LOCAL_OBJ, `new ${this.getFuncModule(ctor, true)}()`);
        }

同踩到了,打包到手机上才发现这个错误,网页没有复现出来,处理完成,感谢感谢

一样的,他喵的,网页就复现不到,去年12月份提出来的问题,官方一直到3.4都没有改,真不知道你们在想啥,如果是我们使用api不当导致的问题,至少站出来解释一下把,就这样放着让大家踩坑,即使是真的bug,哪怕你们不解释,默默在新版本把这个问题解决也好,真的无力吐槽,哎。

这个问题确实还存在。这个问题通常发生在项目脚本(并非组件)丢失之后,我们 3.1 在 instantiate.ts 修复过一次,才一直以为已经彻底解决了就没再关注,非常抱歉。
已修复到 3.4.2! https://github.com/cocos-creator/engine/pull/10128

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。