cocos creator protobuf 实现和遇到的坑

这个论坛创建主题真的事太简陋了,我只能码文字,跟大家说了

proto3
3.0和2.0不同,用之前网上找的那种三个js文件的protobufjs,解不出来,又看到一个介绍用node.js生成protobufjs的。
我就下载去了,发现安装好了以后(cd 到工程目录下,能看见asset文件夹…别去asset文件夹下,更别去asset下的什么scripts),发现没有一个loadproto方法,好像是叫这个吧。所以还是不行,下面介绍我的方法
1,安装node.js 的protobufjs
2,用cc.loader.load加载proto文件
3,再用protobufjs解析
上代码:
var url = cc.url.raw(“resources/proto/addressbook.proto”);
cc.loader.load(url,function(err,tex){
var protobuf = require(‘protobufjs’);
var pr = protobuf.parse(tex);
var Person = pr.root.lookup(“com.protobuf.Person”);
var PhoneNumber = pr.root.lookup(“com.blst.protobuf.Person.PhoneNumber”);
var phoneNum = PhoneNumber.create({number:“13811113369”});
var message = Person.create({
name: “names”,
id: 100001,
phones:[phoneNum]
});
var buffer = Person.encode(message).finish();

        var message1 = Person.decode(buffer);
        cc.log(" number = " + message1.phones[0].number);
    });

下面是proto 内容
syntax = “proto3”;
package com.protobuf;

message Person {
string name = 1;
int32 id = 2;
string email = 3;

enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}

message PhoneNumber {
string number = 1;
PhoneType type = 2;
}

repeated PhoneNumber phones = 4;
}

1赞

如果有多个proto文件怎么处理呢?

我们是创建一个map,指令码=>proto包名, 根据消息的指令码获取proto的包名, 包名就是文件名, 获取对应的proto文件

我发现.proto里的字段是全小写用下划线连接的话,会被protobuf处理掉,比如user_name会变成userName,我的代码如下:
protobuf.load(cdn_url + “msg.proto”, function(err, root)
{
if(err)
{
}
else
{
let MsgLoginReq = root.lookupType(“pb.MsgLoginReq”);
let message = MsgLoginReq.create();
for(let k in message)
{
cc.log(message[${k}]=${message[k]});
}
}
});

之后解决了吗

后面我改用了protobuf5,并且不用pbjs来转换了,自己写了一个工具把所有的.proto合并成一个.proto