【Unity】Kafka、Mqtt、Wesocket通信

1 前言

        最近研究了下kafka、mqtt、webocket插件在Unity网络通信中的应用,做下小总结吧。(不想写笔记,但不写又会忘,痛苦)

2 Kafka

        先说结果:Window平台成功。

方法一:

        我会使用的方法是在VS里安装了Confluent.Kafka和librdkafka.redist包,然后实现了相关方法,但发现在Unity中是缺少对包中内容的引用的。

         在VS解决方案的引用中,找到引用这两个包的.dll其所处位置,然后复制到Unity的Assets/Plugins文件夹中,Unity便可以识别了,但运行时依旧会报缺失引用的错误,后来将librdkafka.redist的的.dll文件(好几个)的Inspector面板中的Load on startup属性勾选后便解决了此问题。

        但运行后依旧有问题,在消费者执行消费方法时直接无法获取消息,一直阻塞,目前原因不知。与后端的地址什么的都正确,但就是一直阻塞,也不知道是包的原因还是我与后端的原因。懒得搞了就放在这里了。

        以上是第一版测试,我怀疑是没问题的,卡死是因为消费等待卡死了主线程,没消息应该是服务端没设置好的问题,所以大家可以试下。

方法二:

        首先下载Unity的NuGet插件,然后拖入到Unity中,后续借助插件安装Confluent.Kafka,安装会顺带自动的把其所依赖的librdkafka.redist安装了。但安装后还不行,会报librdkafka.redist缺少相关.dll文件,而是VS上也没有相关库能调用,需要按照方法一的流程,在VS中安装Confluent.Kafka、librdkafka.redist,之后找到librdkafka.redist的目录,把里面的.dll文件复制到unityy的librdkafka.redist目录中(目录就在项目中,自己找一找,从插件的操作面板也能看到相关路径,也可以修改的)。至此,就可以正常运行了。

        另外,我还遇到了VS报相关类在两个.dll中都存在,无法识别的错误,但Unity是可以正常运行的,我把VS关掉重新打开就好了。

3 Mqtt

        结果:Window平台成功,WebGL平台成功。

3.1 Window

        和上面Kafka的方法一一样,先在VS下载相关包,再把相关.dll文件复制到Unity的Assets/Plugins目录下。

        然后就能正常用了。

        PS:也可以在Unity中安装NuGetForUnity插件,然后再使用此插件下载MQTTnet。

3.2 WebGL

        方法一:

        首先是用的3.1的方法,打包后就连接失败,TNND(拍桌。

        然后参考了这篇文章,Unity与JS通信,让JS去进行mqtt通信。结果是不行的,还是连接失败,修改js文件中的地址细节也不行。后来查了半天发现了一些端倪,似乎要服务器那边安装一些相关的jar包才可以。但懒得搞了,就放这了。

        不过后来又研究了下,文章中使用的stomp.main.js吧,后来改成使用mqtt.js成功连接上了。本质还是js与mqtt服务器通信,然后js又与unity通信。

        方法二:

        后来又研究了下,使用Best Mqtt插件成功连接上了MQTT服务器,在WebGL平台没法直接连mqtt,这里实际上还是用Websocket去连的,不过插件都封装好了,我们直接用。

4 Websocket插件

        结果:Window、WebGL平台成功。

        Window没啥说的,安装后就能用,只说WebGL的情况。两个插件:BestHttp、NativeWebSocket。

4.1 BestHttp

        网上都在说这插件好厉害,但其因版本造成的问题也很厉害。我用的是Unity2022.3.0,首先找个一个v2.0.5版本的插件,然后运行报错。寻找了相关解决方案:地址,发现没用。那应该就是版本问题了,更换了一个v3.11.0版本,运行依旧报错,按上面的解决方案再次调整,运行成功。总之,换了高版本,并添加了一些内容才成功运行,但你以为到这里就结束了吗?

        运行是成功,但运行时发现绑定的监听函数,如OnMessage这些全都执行报错。在运行WebGL打包项目时,在Web端按F12就可以从控制台看到相关报错信息了。最后在这里找到了解决方案:地址

        根据其所说,是有些方法不支持的原因,按照图中所示进行替换即可将。我们可以在打包文件的Build目录下找到 项目名.framework.js 文件(同目录还有个 项目名.loader.js,报错代码基本就在这两个文件里,根据报错内容在这两个文件里找,我是在framework那个文件中找到了。),在里进行替换,直接Ctrl+F搜索找,所有Runtime.dynCall(xxxxx)都要替换,但修改此文件只能解一时的问题,以后每次打包就要重新修改,所以我们也可以在编辑器项目中修改。具体为“导入的插件文件夹/Plugins/WebGL/”下的BestHTTP_WebSocket.jslib文件(同样的,同目录也有其他文件,如果报错内容是在其他文件内,则应修改其他文件,通常需要自己打开文件然后Ctrl+F自己去搜索报错内容是否在此文件内。),对文件中的函数进行替换,然后重新打包即可。运行成功,函数执行成功,可喜可贺。

        另外,我这边还报了一个转String函数过时的错误,并告诉了我应该改用什么函数,与上面同理,找到原函数进行替换即可。

4.2 NativeWebSocket

        插件:地址

        在Unity包管理那里输入网页里提供的URL就可以下载了,下载完,实例代码一粘,一运行,WebGL成功通信。真好。

5 后记

        这可是我端午假期加班写的笔记,给我满怀感恩之情好好看啊。

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值