laya、egret、cocos引擎通过websocket发收数据使用protobuf进行编码解码
将proto文件转换成js及声明文件
准备做个3D的项目,先搭建网络这一块,使用websocket,数据发送需要用protobuf进行数据序列化
Protobuf是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于网络通信和数据存储。
protobufjs提供了多种使用方式,但是微信小游戏和qq小游戏不支持动态代码,所以得找个适合在微信小游戏和qq小游戏中运行的方法
如果想转请评论留个言并注明原博 @Sclifftop @13805064305 维尼 https://blog.csdn.net/S_clifftop/article/details/108670454
如果用ts,无论用什么框架,对于protobuf的用法是一模一样的,不同的就在于引入js文件的方式有差异
打开命令行工具
打开命令行工具,随便进入个文件夹(不知道怎么用,输入help cd
自己看),例如:
安装并复制
-
输入
npm install protobufjs@6.8.4 -g
, 最新的是6.9.0,请自行配置尝试
-
输入
npm install @egret/protobuf -g
-
输入
pb-egret add
复制文件夹,如果不是白鹭的项目,会有个输入的文件夹不是白鹭引擎项目
,这个不用管,然后就会生成一个protobuf文件夹,由于我之前配置过个人设置,所以正常
-
如果有以下提示,就输入
Set-ExecutionPolicy Unrestricted
,接下来选择Y
,再pb-egret add
,不行就就检查一下是不是以管理员身份运行的命令行工具 -
将.proto文件放到protofile文件夹中,没有就手写一个,文件后缀
.proto
package msg; message ReqAccountLogin{ required int64 accountId = 1; required string password = 2; }
-
然后修改
protobuf
下的pbconfig.json
,修改options(这个等你看了生成的protobuf-bundles.d.ts
声明文件就知道是什么意思了,先改),soureRoot和outputFile看情况,如果想改也可以,一个是根目录,另一个是生成文件的位置和文件名,如下:
-
运行命令
pb-egret generate
,会在bundles下生成三个文件,protobuf-bundles.d.ts
protobuf-bundles.js
protobuf-bundles.min.js
-
接下来复制文件, (白鹭项目就把整个都搞进libs,然后引入),每次改都要生成然后复制,我嫌麻烦写了个批处理文件
复制protobuf/library下的protobuf-library.min.js到项目bin/libs/min 复制protobuf/library下的protobuf-library.js到项目bin/libs 复制protobuf/library下的protobuf-library.d.ts到项目libs 复制protobuf/bundles下的protobuf-bundles.min.js到项目bin/libs/min 复制protobuf/library下的protobuf-bundles.js到项目bin/libs 复制protobuf/bundles下的protobuf-bundles.d.ts到项目libs
-
然后打开laya编辑器,F9打开项目配置,我看laya文档好像把F9当成了神键?然后勾选这两个(白鹭项目配置
egretProperties.json
文件)(因为我之前把bundle和library.min直接放在bin/libs
下面了,按我写得这种顺序应该是不带.min
)
-
修改library和bundles加载顺序,顺序不能错,js文件引入顺序的重要性应该都知道吧(因为我之前把bundle和library.min直接放在
bin/libs
下面了,按我写得这种顺序应该是不带.min
)
用法
在laya中,数据返回写入用readUint8Array
或getUint8Array
,注意偏移值和长度,decode完就可以用
后面通过websocket发送和接收我已测了,是可以的