分享ccc使用protobufjs的正确姿势

git仓库在这里

https://github.com/laomoi/ccc-protobufjs

一. 背景介绍

为了支持在ccc中使用protobufjs, 需要下载以下3个JS,进行合并。

https://github.com/protobufjs/protobuf.js

https://github.com/protobufjs/bytebuffer.js

https://travis-ci.org/dcodeIO/long.js

合并完成为一个protobuf_all.js

(目前使用的protobufjs版本为6.8.8)

二. 安装说明:

1). 把protobuf_all.js 放入ccc工程的asset/Script 某个目录
2). ccc会自动识别并提示是否导入为插件脚本,勾选上是即可

三. 使用说明:

1). 使用protobuf.js提供的命令行工具pbjs.js把我们的协议文件proto转换成json

node_modules.bin\pbjs -t json data.proto >data.json

2). 把data.json文件放入ccc工程的asset/resources/目录下

3). 加载协议文件并编译之的代码示例:

cc.loader.loadRes("data", function(err, jsonAsset) {
    var root = protobuf.Root.fromJSON(jsonAsset.json);
    //把这个root保存起来后面用来进行对协议解码和编码
}

4). 编码示例:

var AwesomeMessage = root.lookupType("awesomepackage.AwesomeMessage");

var payload = { awesomeField: "AwesomeString", longnum: l};

var errMsg = AwesomeMessage.verify(payload);
if (errMsg)
throw Error(errMsg);

// Create a new message
var message = AwesomeMessage.create(payload); // or use .fromObject if conversion is necessary

// Encode a message to an Uint8Array (browser) or Buffer (node)
var buffer = AwesomeMessage.encode(message).finish();

//buffer可以用来发送出去

5). 解码示例:

var AwesomeMessage = root.lookupType("awesomepackage.AwesomeMessage");

var message = AwesomeMessage.decode(buffer);

// Maybe convert the message back to a plain object
var object = AwesomeMessage.toObject(message, {
                longs: String,
                enums: String,
                bytes: String,
                // see ConversionOptions
});

四. 关于uint64:

js跟lua一样是使用double保存数字的,也就是js本身是不支持uint64的,probobuf在编码转码过程中使用了long.js的自定义类型Long来处理大数字, 为了方便使用, 项目里统一使用字符串来表示uint64数字,

在编码成Message的时候,使用Long.fromString()把字符串转成long,

在解码Message的时候, toObject(message, {longs:String}) 会把long转回来string

2赞

在我的项目中
1、直接生成js而不是json
2、不做成插件(其实我们是尽量减少插件代码脚本,因为一个插件脚本就多一次http request,在移动端一次http request开销可大了,首屏加载要尽力控制request数量)
3、留意–no-verify --no-convert --no-delimited --no-beautify --no-comments这几个开关,能减少生成的文件大小(在我的项目中全加上减少了2/3)
4、留意–keep-case开关,要不大小写转换会坑死人哦。

1赞

了解一下 => 脚本-protobufjs转ts.7z

1赞

使用JS或者TS得话,这个脚本会巨大无比,普通网络游戏有300条以上得协议, 导出TS 至少有5MB大吧。

这样是不是就没有pb的代码提示了?

您好,不做成插件,怎么引用呢

协议用txt就行了,没这么麻烦,转js不好

mark

mark

mark一下