第一次数据交互

我们在前面两篇文档 第一个扩展包第一个面板 中介绍了怎么创建扩展,怎么在扩展中定义面板,接下来我们通过本篇文档来尝试一下它们之间的互相通讯。

在描述文件 package.json 内定义消息

首先我们需要在 contributions.messages 中增加一条消息 "increasing",交给 browser 处理。再增加一条 "hello-world:increasing" 消息,交给 default 面板处理:

  1. {
  2. "name": "hello-world",
  3. "version": "1.0.0",
  4. "main": "./browser.js",
  5. "description": "一份简单的扩展",
  6. "panels": {
  7. "default": {
  8. "title": "simple panel",
  9. "main": "./panels/default.js"
  10. }
  11. },
  12. "contributions": {
  13. "menu": [
  14. {
  15. "path": "Develop",
  16. "label": "test",
  17. "message": "log"
  18. }, {
  19. "path": "i18n:menu.panel/Custom",
  20. "label": "Open Hello World",
  21. "message": "open-panel"
  22. }
  23. ],
  24. "messages": {
  25. "log": {
  26. "methods": ["log"]
  27. },
  28. "open-panel": {
  29. "methods": ["openPanel"]
  30. },
  31. "increasing": {
  32. "methods": ["increasing"]
  33. },
  34. "query-num": {
  35. "methods": ["queryNum"]
  36. },
  37. "hello-world:increasing": {
  38. "methods": ["default.increasing"]
  39. }
  40. }
  41. }
  42. }

hello-world:increasing 是指我们监听了一个 hello-world 上的 increasing 消息。”default.increasing” 指的是交给 default 面板的 “increasing” 方法处理。

panel 字段含义可以参考 编写面板

在 browser.js 里增加 increasing

然后需要在 browser.jsmethods 中新增一个 increasing 方法,负责记录一个 num,并在每次触发的时候递增并广播出去:

  1. 'use strict';
  2. let num = 0;
  3. // 扩展内定义的方法
  4. exports.methods = {
  5. log() {
  6. console.log('Hello World');
  7. },
  8. openPanel() {
  9. Editor.Panel.open('hello-world');
  10. },
  11. queryNum() {
  12. return num;
  13. },
  14. increasing() {
  15. num++;
  16. Editor.Message.broadcast('hello-world:increasing', num);
  17. },
  18. };
  19. // 当扩展被启动的时候执行
  20. exports.load = function() {};
  21. // 当扩展被关闭的时候执行
  22. exports.unload = function() {};

在 panel 里增加 increasing 按钮以及广播处理

接下来在界面上增加一个 increasing 按钮,以及展示 num 的区域和接受 num 变化的广播消息:

  1. 'use strict';
  2. // 面板的内容
  3. exports.template = `
  4. <div>Hello</div>
  5. <div><ui-button>increasing</ui-button></div>
  6. <div><span>Num: </span><span class="num">-</span></div>
  7. `;
  8. // 面板上的样式
  9. exports.style = 'div { color: yellow; }';
  10. // 快捷选择器
  11. exports.$ = {
  12. elem: 'div',
  13. button: 'ui-button',
  14. num: '.num',
  15. };
  16. exports.methods = {
  17. increasing(num) {
  18. this.$.num.innerHTML = num;
  19. },
  20. };
  21. // 面板启动后触发的钩子函数
  22. exports.ready = async function() {
  23. this.$.elem.innerHTML = 'Hello World';
  24. this.$.button.addEventListener('confirm', () => {
  25. Editor.Message.send('hello-world', 'increasing');
  26. });
  27. this.$.num.innerHTML = await Editor.Message.request('hello-world', 'query-num');
  28. };
  29. // 面板关闭后的钩子函数
  30. exports.close = function() {};

刷新扩展

以上修改完成并保存后,再次打开 Cocos Creator,找到并打开顶部菜单栏中的 扩展 -> 扩展管理器,在面板上选择扩展位置(全局 或者 项目)。然后找到对应插件并点击刷新按钮,Creator 便会重新加载插件内容使之生效。

然后便可以在顶部菜单栏的 面板 -> Custom 中看到新增了 Open Hello World 选项,点击即可打开。