Skip to content

CocosCreator 编辑器

模块之间的协作流程

cocos-creator

Inspector

Inspector 负责各种数据的显示和编辑功能,目前包括(node、asset)两种数据。它只是一个平台,数据和渲染组件都不是由它提供。

数据获取

通过配置 package.json/contribution.message

json
{
    "message": {
        "selection:select": {
            "methods": ["default.selected"]
        },
        "selection:unselect": {
            "methods": ["default.unselected"]
        }
    }
}

当 selected 和 unselected 被触发时,得到当前的数据

js
panel.type = Editor.Selection.getLastSelectedType();
panel.uuids = Editor.Selection.getSelected(panel.type);

通过 type 判断当前的数据类型,决定渲染哪个面板

js
panel.$.content.setAttribute('src', queryType(panel.type) || '');
panel.$.content.update(panel.uuids, queryRendererMap(panel.type), queryType(), queryRendererMap());

面板的注册

面板的代码放置在 engine 仓库,通过 Inspector 的 hooks.js 动态注册到 Inspector 上。

js
// hooks.js
exports.register = async function (info) {
    const engine = await Editor.Message.request('engine', 'query-info');

    info.contributions.inspector.type.asset = join(engine.path, 'editor/inspector/contributions/asset.js');
    info.contributions.inspector.type.node = join(engine.path, 'editor/inspector/contributions/node.js');
};

dump 解释

dump 有动词和名词两种场景。

  • 1、为什么要 dump(dump 的目的)?

因为程序在计算机中运行时,在内存、CPU、I/O 等设备上的数据都是动态的(或者说是易失的),也就是说数据使用完或者发生异常就会丢掉。如果我想得到某些时刻的数据(有可能是调试程序 Bug 或者收集某些信息),就要把他转储(dump)为静态(如文件)的形式。否则,这些数据你永远都拿不到。

  • 2、dump 转储的是什么内容(dump 的对象)?

其实上边已经提到了,就是将动态(易失)的数据,保存为静态的数据(持久数据)。像程序这种本来就保存在存储介质(如硬盘)中的数据,也就没有必要 dump。

现在,dump 作为名词也很好理解了,一般就是指 dump(动词)的结果文件。

回到我们的编辑器,场景资源是通过 xxx.scene 持久化的,但是在编辑场景的时候,没有将临时数据持久化下来,而 Inspector 需要对选中的节点进行编辑,就需要将该节点 dump(v) 出来,得到 dump(n),供 Inspector 编辑。

获取 dump

asset 和 node 都有 uuid,它们的格式如下:

  • asset: 738e82d9-bc62-4628-8bd2-8ebacb85fec0
  • node: c0y6F5f+pAvI805TdmxIjx

通过 uuid 获取 dump 数据

  • Editor.Message.request('scene', 'query-node', uuid);
  • Editor.Message.request('asset-db', 'query-asset-info', uuid);

渲染 dump

略。。。

更新 dump

通过 ui-prop 发送修改事件,对数据进行更新

js
Editor.Message.send('scene', 'set-property', {
    uuid,
    path,
    dump: {
        type,
        isArray,
        value,
    },
});

asset 数据格式总览

js
const dump = {
    name: 'background.js',
    displayName: '',
    source: 'db://assets/background.js',
    path: 'db://assets/background',
    url: 'db://assets/background.js',
    file: '/Users/alan/cocos/games/mind-your-step/assets/background.js',
    uuid: 'd775f63a-58ce-40f5-a92b-d8b314a70f7d',
    importer: 'javascript',
    imported: true,
    invalid: false,
    type: 'cc.Script',
    isDirectory: false,
    library: {},
    subAssets: {},
    visible: true,
    readonly: false,
};

node 数据格式总览

略...