CocosCreator3D插件教程(18):插件之间交互

在上篇教程,我们已经完美实现一个插件的多个面板之间交互,但是这还远不够,有时我们还希望插件能和插件之间交互。

根据之前的插件教程,也可以实现插件之间的交互,本篇教程带有总结性的同时,再介绍下广播消息

这里我举例说明业务场景,希望透过小栗子,对你以后编写插件有所帮助。

栗子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插件。

这种情况就稍微麻烦了一点,我们需要用到广播消息,大致思路可总结为:

  1. 小王子的B插件发起调用A插件:

    Editor.Message.send("pluginA", "message-A", "data");
    
  2. 小明的A插件需要在下载完成后,广播一个消息:

    // 广播消息名字没有强制使用 pluginName:messageName 的格式,不过为了方便识别,建议使用。
    Editor.Message.broadcast("pluginNameB:broadcastB", "data");
    
  3. 小王子的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个栗子,几乎覆盖到常见的交互需求,如果要开发一些稍微复杂的插件,肯定有类似的需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xu_yanfeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值