预制件被关闭时是我可以知道的吗

在写一个插件。遇到一个问题。想在prefab被修改后关闭或者切换到其他prefab时。编辑器会做一些后处理。类似移动一个资源时会有asset-db:assets-moved,查遍了文档,没有找到,这个还是很常用的场景,多谢!

prefab 模式打开时,触发消息:
Editor.Ipc.sendToAll(‘scene:prefab-mode-changed’, true);
prefab 模式退出时,触发消息:
Editor.Ipc.sendToAll(‘scene:prefab-mode-changed’, false);

不过没开放当前编辑的 prefab 是什么,但是我们在打开 prefab 的时候会执行 Editor.Selection.select('node', prefabNodeUuid, true, true); 默认选择节点,所有你可以通过下列范例来获取当前的 prefab uuid


'scene:prefab-mode-changed' (event, state) {
  if (state) {
    const selectNodeId = Editor.Selection.curSelection('node')[0];
    // 该代码需要到场景进程上执行
    const node = cc.engine.getInstanceById(selectNodeId)
    // -------------
    console.log('当前编辑的 prefab uuid', node._prefab.asset._uuid);
  }
},

多谢,可以触发,但奇怪的是这段代码中cc.engine打印出来为undefined,导致后面的走不下去,在开发者工具中是可以执行的,版本为2.4.9

cc.engine 需要到 场景进程才能触发

那这样操作就很难了,正常操作就是随便打开一个prefab,编辑完然后有个后处理,有没有什么别的方法可以取到这个prefab呢,我用Editor.assetdb.uuidToUrl也获取不到

明白了,'node’取到的是prefab里面的节点id,我换成这样ok
const selectNodeId = Editor.Selection.curSelection(‘asset’)[0];
let path = Editor.assetdb.uuidToUrl(selectNodeId);

Editor.Selection.curSelection(‘asset’) 这个是资源面板选中的元素的 id,
你可以在插件的 package.json 中添加 “scene-script”: ‘scene-script.js’ 这个字段,这个字段里面运行的环境就是场景环境

// scene-script.js code 
module.exports = {
    'query-prefab-uuid-by-node-id' (event, nodeID) {
        const node = cc.engine.getInstanceById(nodeID);
        event.reply && event.reply(null, node._prefab.asset._uuid);
    }
}

在通过 callSceneScript 去调用请求场景的自定义的消息

Editor.Scene.callSceneScript('插件名', 'query-prefab-uuid-by-node-id', (err, prefabUuid) => {
    // TODO
});

嗯,基于我主要是针对单独prefab做后处理,所以直接记录prefab的uuid,然后读取json,对json做修改保存反而更直接,目前已经实现,多谢!