消息系统
编辑器里的”消息系统”是 IPC(进程间通信)的功能扩展封装。这个系统承担起了整个编辑器内通讯交互的重担。
更多关于多进程构架和跨进程通信的介绍请参考文档 基础结构.
Cocos Creator 系统内的消息有两种类型:
- 普通消息:主动发送某条消息到某个功能(扩展)
可以理解成一种对外的接口,例如引擎的 场景编辑器 模块已经定义好了一个用于查询节点的 消息,如下所示:
关于如何自定义消息以及消息各字段的含义,请参考文档 。
当我们在自己编写的扩展中想要查询场景节点时,就可以使用这个消息来完成,如下所示:
const info = await Editor.Message.request('scene', 'query-node', uuid);
这种消息类似一种远程调用 (RPC), 拿到的 info
对象就是实际查询的节点上的部分数据。
普通消息的命名规范
请使用 小写 单词,并且不能包含特殊字符,单词间以 - 连接。如 open-panel
、text-changed
。
广播消息
广播消息是某一个功能内的操作完成后,对外进行的一种通知。
接收广播消息
比如,场景编辑器 在启动一个场景后,需要通知所有人 “场景” 已经启动完毕,场景编辑器 发送广播消息使用的是如下代码:
Editor.Message.broadcast('scene:ready', sceneUUID);
若一个扩展想要接收 scene:ready
消息,则需要在 package.json
里先定义,如下所示:
每当场景准备就绪后,广播的 scene:ready
消息就会触发 “hello-world” 扩展里的 initData
方法。
发送广播消息
若一个扩展想要发送广播消息,也需要在 里先定义。
比如,”hello-world” 在准备好数据后,会向外广播一条消息,以方便其他扩展与之配合。如下所示:
{
"name": "hello-world",
"contributions": {
"messages": {
"scene:ready": {
"methods": ["initData"]
},
"hello-world:ready": {
"description": "hello-world ready notification."
}
}
}
Editor.Message.broadcast('hello-world:ready');
注意:广播消息可以没有
methods
,表示不监听。如上面的定义所示,表示 “hello-world” 不需要监听自己的初始化完成的消息。
广播消息的命名规范
格式为 packageName:actionName
,以下命名都是合法的:
- scene:ready
- scene:query-node
- hello-world:ready
- hello-world:data-loaded
加上 packageName
可以防止命名出现冲突,在 package.json
中定义消息的时候也能够更加直观的看到监听的是哪一个扩展的哪个广播消息(动作)。
编辑器内的功能以及扩展对外开放的消息列表,可以通过 开发者 -> 消息管理 面板查看。详细定义规则请参考文档 。
send
方法只发送消息,并不会等待返回。如果不需要返回数据,且不关心是否执行完成,请使用这个方法。
request
方法返回一个 promise 对象,这个 promise 会接收消息处理后返回的数据。
broadcast
方法只发送,并且发送给所有监听对应消息的功能扩展。