cocos编辑器里自动执行代码创建节点无法删除

  • Creator 版本:3.8.4

  • 重现方式:我在AdMgr脚本里写了一个如果当前场景没有AdMgr节点,则自动创建一个,但我在场景里是有AdMgr节点的,而且没有任何预览和运行,只是在编辑器里,也会自动创建,而且我只要保存一次脚本,哪怕没有修改任何东西,也会自动执行创建一个AdMgr节点,直到我写了在编辑器状态下,不允许自动创建节点,才阻止了这个行为,但之前创建的AdMgr节点删不掉,怎么都删不掉

代码如下:
public static getInstance(): AdMgr {
console.warn(’[AdMgr.getInstance] 被调用,EDITOR=’, EDITOR);
console.trace(’[AdMgr.getInstance] 调用栈’);
// 1) 先返回已缓存单例
if (AdMgr.instance && isValid(AdMgr.instance) && isValid(AdMgr.instance.node)) {
AdMgr.instance.ensurePersistAndInit();
return AdMgr.instance;
}
// 2) 再去场景里找
const scene = director.getScene();
const nodeInScene = find(‘AdMgr’);
const comp = nodeInScene?.getComponent(AdMgr);

    if (comp && isValid(comp) && isValid(comp.node)) {
        AdMgr.instance = comp;
        comp.ensurePersistAndInit();
        return comp;
    }
    // 编辑器状态下,绝对不允许自动创建节点
    if (EDITOR) {
        console.warn('[AdMgr.getInstance] 当前是编辑器状态,不自动创建 AdMgr 节点');
        return {
            PLATFORM: PlatType.PC,
        } as AdMgr;
    }
    // 3) 场景里确实没有才创建(兜底)
    const node = new Node('AdMgr');
    scene?.addChild(node);
    const created = node.addComponent(AdMgr);
    AdMgr.instance = created;
    created.ensurePersistAndInit();
    return created;
}

编辑器里自动运行了这个脚本

多余的节点怎么都删不掉
image

我有几个问题,
1:为什么编辑器会自动执行我的代码,我都没有运行
2:为什么被代码创建出来的节点删不掉?

是不是在类上加了executeInEditModeimage

没有
image

这种问题,我建议你把代码贴给AI,让他帮你排查

可以在getInstance函数那里打印下上级的调用路径 console.trace("调用路径:")

查了,没用,GPT说在编辑器状态下也会执行模块代码,不知道怎么回事,之前都没有这种情况

我知道什么地方会调用,关键是我根本没有运行游戏啊,还是在编辑器状态下,就自动调用了,我根本没有运行

你把调用getInstance的位置注释掉就好了,导出、静态,会直接js导入的时候就执行。

建议补一下js基础吧。建议getInstance和init分开就没这屁事了

注释掉那我该怎么调用获取呢?

getInstance只返回new的单例。详细逻辑初始化手动控制init

我研究研究看看

建议 AdMgr 单例不要继承 Component ,只是一个简单对象, 挂载 JsonAsset 用一个简单的组件即可,然后在这个组件 onLoad 的时候去初始化 AdMgr, 你主要通过该组件获得一个配置 json 数据,一般情况下别把 Component 搞成单例

已经改造完了,已经取消了组件化,把单例化和初始化完全分开了