自定义消息

在 Cocos Creator 编辑器架构中,所有的交互都是通过消息通信实现的,本文将讲解如何自定义一条消息,并调用这条消息。

定义一条消息(监听消息)

只有在 package.json 文件的 contributions.messages 字段里定义过的消息才能被使用。消息的定义如下所示:

  1. {
  2. "name": "hello-world",
  3. "contributions": {
  4. "messages": {
  5. "test-messasge": {
  6. "public": false,
  7. "description": "",
  8. "doc": "",
  9. "methods": []
  10. }
  11. }
  12. }
  13. }

test-messasge 为消息名称,下面我们逐一讲解每个属性的含义。

public

类型 {string} 可选

是否对外显示这条消息,如果为 true,则会在 开发者->消息列表 面板显示这条消息的基本信息。

description

类型 {string} 可选

消息摘要信息,如果 public 为 true,则会在消息管理面板显示,支持 i18n:key 语法。

doc

类型 {string} 可选

消息文档说明,如果 public 为 true,则会在消息管理面板显示,支持 i18n:key 语法。

这个文档使用 markdown 格式撰写并渲染。

methods

类型 {string[]} 可选

消息触发的方法队列。

这是一个字符串数组,字符串为扩展或者面板上的方法(methods)。 如果是触发扩展主程序的方法,则直接定义 methodName,如果要触发扩展里定义的面板上的方法,则要填写 panelName.methodName

下面的示例中,package-message 将触发扩展主程序中的 receiveMessage 方法,panel-message 将触发 test-panel 面板中的 receiveMessage 方法。

  1. {
  2. "name": "hello-world",
  3. "panels": {
  4. "test-panel": {
  5. "title": "HelloWorld",
  6. "main": "./dist/panel/index.js"
  7. }
  8. },
  9. "contributions": {
  10. "messages": {
  11. "package-message": {
  12. "public": true,
  13. "description": "Test Message: send to extension main.js",
  14. "doc": "Unable to find inheritance data. Please check the specified source for any missing or incorrect information.\nLine breaks are also supported.\n- options {any}",
  15. "methods": [
  16. "receiveMessage"
  17. ]
  18. },
  19. "panel-message": {
  20. "methods": [
  21. "test-panel.receiveMessage"
  22. ]
  23. },
  24. "hello-world:ready": {
  25. "public": true,
  26. "description": "Test Broadcast Message"
  27. }
  28. }
  29. }
  30. }

Alt text

Alt text

定义完消息后,我们需要在扩展主入口和面板入口里,增加一个 sendMessage 方法:

  1. export const methods: { [key: string]: (...any: any) => any } = {
  2. receiveMessage() {
  3. console.log('Received a message');
  4. },
  5. };
  6. export function load() { }
  7. export function unload() { }

通过消息触发函数(执行消息)

刚刚我们定义了两个消息,package-messagepanel-message

我们可以通过消息系统的 API 触发这个消息监听器:

  1. // 不需要返回值
  2. Editor.Message.send('hello-world', 'panel-message');
  3. // Or 需要等待数据返回
  4. const result = await Editor.Message.request('hello-world', 'panel-message');

关于更多消息机制,请参考文档 消息系统