1 前言
最近研究了下kafka、mqtt、webocket插件在Unity网络通信中的应用,做下小总结吧。(不想写笔记,但不写又会忘,痛苦)
2 Kafka
先说结果:Kafka实现失败。
我会使用的方法是在VS里安装了Confluent.Kafka和librdkafka.redist包,然后实现了相关方法,但发现在Unity中是缺少对包中内容的引用的。
在VS解决方案的引用中,找到引用这两个包的.dll其所处位置,然后复制到Unity的Assets/Plugins文件夹中,Unity便可以识别了,但运行时依旧会报缺失引用的错误,后来将librdkafka.redist的的.dll文件(好几个)的Inspector面板中的Load on startup属性勾选后便解决了此问题。
但运行后依旧有问题,在消费者执行消费方法时直接无法获取消息,一直阻塞,目前原因不知。与后端的地址什么的都正确,但就是一直阻塞,也不知道是包的原因还是我与后端的原因。懒得搞了就放在这里了。
3 Mqtt
结果:Window平台成功,WebGL平台失败。
3.1 Window
和上面Kafka一样,先在VS下载相关包,再把相关.dll文件复制到Unity的Assets/Plugins目录下。
然后就能正常用了。
3.2 WebGL
首先是用的3.1的方法,打包后就连接失败,TNND(拍桌。
然后参考了这篇文章,Unity与JS通信,让JS去进行mqtt通信。结果是不行的,还是连接失败,修改js文件中的地址细节也不行。后来查了半天发现了一些端倪,似乎要服务器那边安装一些相关的jar包才可以。但懒得搞了,就放这了。
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 后记
这可是我端午假期加班写的笔记,给我满怀感恩之情好好看啊。