如何将proto文件转换成js及声明文件(laya、egret、cocos)

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自己看),例如:
在这里插入图片描述

安装并复制

  1. 输入 npm install protobufjs@6.8.4 -g, 最新的是6.9.0,请自行配置尝试
    在这里插入图片描述

  2. 输入npm install @egret/protobuf -g

  3. 输入pb-egret add复制文件夹,如果不是白鹭的项目,会有个输入的文件夹不是白鹭引擎项目,这个不用管,然后就会生成一个protobuf文件夹,由于我之前配置过个人设置,所以正常
    在这里插入图片描述

  4. 如果有以下提示,就输入Set-ExecutionPolicy Unrestricted,接下来选择 Y,再pb-egret add,不行就就检查一下是不是以管理员身份运行的命令行工具 在这里插入图片描述

  5. 将.proto文件放到protofile文件夹中,没有就手写一个,文件后缀.proto

    package msg;
    
    message ReqAccountLogin{
        required int64 accountId = 1;
        required string password = 2;
    }
    
  6. 然后修改protobuf下的pbconfig.json,修改options(这个等你看了生成的protobuf-bundles.d.ts声明文件就知道是什么意思了,先改),soureRoot和outputFile看情况,如果想改也可以,一个是根目录,另一个是生成文件的位置和文件名,如下:
    在这里插入图片描述

  7. 运行命令 pb-egret generate,会在bundles下生成三个文件,protobuf-bundles.d.ts protobuf-bundles.js protobuf-bundles.min.js

  8. 接下来复制文件, (白鹭项目就把整个都搞进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
    
  9. 然后打开laya编辑器,F9打开项目配置,我看laya文档好像把F9当成了神键?然后勾选这两个(白鹭项目配置egretProperties.json文件)(因为我之前把bundle和library.min直接放在bin/libs下面了,按我写得这种顺序应该是不带.min
    在这里插入图片描述

  10. 修改library和bundles加载顺序,顺序不能错,js文件引入顺序的重要性应该都知道吧(因为我之前把bundle和library.min直接放在bin/libs下面了,按我写得这种顺序应该是不带.min
    在这里插入图片描述

用法

在这里插入图片描述
在laya中,数据返回写入用readUint8ArraygetUint8Array,注意偏移值和长度,decode完就可以用


后面通过websocket发送和接收我已测了,是可以的


维尼聚合工具

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
proto文件换为数据流需要使用protocol buffer编译器。protocol buffer是一种序列化数据结构的协议,可以将结构化数据序列化为二进制格式,从而方便传输和存储。下面是将proto文件换为数据流的步骤: 1. 定义proto文件,描述数据结构和消息格式。 2. 使用protocol buffer编译器将proto文件编译成目标语言的代码。 3. 在代码中使用protocol buffer提供的API,将数据结构换为消息对象。 4. 调用消息对象的序列化方法,将消息对象换为二进制格式的数据流。 以下是一个简单的Java代码示例,演示将proto文件换为数据流: ```java // 导入protocol buffer库 import com.google.protobuf.ByteString; import com.google.protobuf.InvalidProtocolBufferException; import com.example.proto.MyMessageProto.MyMessage; // 读取proto文件 InputStream input = new FileInputStream("my_message.proto"); // 编译proto文件 Descriptors.FileDescriptor fileDescriptor = Descriptors.FileDescriptor.buildFrom(input, new Descriptors.FileDescriptor[0]); Descriptors.Descriptor messageDescriptor = fileDescriptor.findMessageTypeByName("MyMessage"); DynamicMessage.Builder messageBuilder = DynamicMessage.newBuilder(messageDescriptor); // 构造消息对象 messageBuilder.setField(messageDescriptor.findFieldByName("id"), 123); messageBuilder.setField(messageDescriptor.findFieldByName("name"), "John"); messageBuilder.setField(messageDescriptor.findFieldByName("email"), "[email protected]"); DynamicMessage message = messageBuilder.build(); // 序列化消息对象 ByteString bytes = message.toByteString(); // 输出二进制数据流 System.out.println(Arrays.toString(bytes.toByteArray())); ``` 在上面的代码中,我们使用了Google提供的protocol buffer库,读取了一个名为my_message.proto的proto文件,并编译成Java代码。然后,我们构造了一个消息对象,并调用其toByteString()方法将消息对象序列化为二进制数据流。最后,我们输出了二进制数据流的字节数组。 需要注意的是,在使用protocol buffer进行数据传输时,发送方和接收方必须使用相同的proto文件和消息格式,否则无法正确解析数据流。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值