在上篇教程,我们已经完美实现一个插件的多个面板之间交互,但是这还远不够,有时我们还希望插件能和插件之间交互。
根据之前的插件教程,也可以实现插件之间的交互,本篇教程带有总结性的同时,再介绍下广播消息
。
这里我举例说明业务场景,希望透过小栗子,对你以后编写插件有所帮助。
栗子1(喂!我摔倒了!):
小明同学编写了A插件,提供了下载文件的功能。
小王子同学编写了B插件,部分功能需要调用A插件完成,但是并不关心插件A何时完成处理。
小王子的B插件需要这样进行交互:
Editor.Message.send("pluginA", "message-A", "data");
栗子2(喂!我摔倒了,快扶我一把!):
小明同学编写了A插件,提供了大量常用的算法。
小王子同学编写了B插件,部分功能需要调用A插件完成,并且需要等待A插件处理完毕后,才继续后续处理。
小王子的B插件需要这样进行交互:
let ret = await Editor.Message.request("pluginA", "message-A", "data");
一般这种方式适合耗时较短的同步逻辑,否则,会导致B插件有卡顿的体验。
栗子3(喂!我摔倒了!同志们注意了,这里有人碰瓷!):
小明同学编写了A插件,提供了下载文件的功能。
小王子同学编写了B插件,调用A插件的功能后,希望下载成功后,能够通知到自己的B插件。
这种情况就稍微麻烦了一点,我们需要用到广播消息
,大致思路可总结为:
-
小王子的B插件发起调用A插件:
Editor.Message.send("pluginA", "message-A", "data");
-
小明的A插件需要在下载完成后,广播一个消息:
// 广播消息名字没有强制使用 pluginName:messageName 的格式,不过为了方便识别,建议使用。 Editor.Message.broadcast("pluginNameB:broadcastB", "data");
-
小王子的B插件需要监听捕获广播消息:
package.json
{ "main": "./main.js", "contributions": { "messages": { // ... "pluginNameB:broadcastB":{ "methods":["onBroadcastB"] } } } }
main.js
exports.methods={ // ... onBroadcastB(){ // 接受到广播消息 } }
栗子3的整个过程稍微有点复杂,不过贴心的小王子,已经写了个DEMO,需要的自取:
https://gitee.com/tidys/creator3d_plugin_case/tree/master/plugin-a
https://gitee.com/tidys/creator3d_plugin_case/tree/master/plugin-b
当然你也可以使用栗子1的方式,不过不是非常的推荐。
上述的3个栗子,几乎覆盖到常见的交互需求,如果要开发一些稍微复杂的插件,肯定有类似的需求。