工作笔记:protobufjs使用教程,支持proto文件打包成typescript或javascript脚本

protobufjs使用教程,支持proto文件打包成typescript或javascript脚本

准备工具:
1.nodejs:如果您的电脑未安装nodejs,请安装nodejs
安装教程可参考 https://www.runoob.com/nodejs/nodejs-install-setup.html
2.pbjs:用于将proto文件打包成typescript或javascript脚本

一.使用nodejs包管理器npm安装pbjs工具
成功安装nodejs后,使用Win+R快捷键打开window运行程序

在这里插入图片描述
然后输入cmd,打开命令行工具,输入: npm install -g pbjs

在这里插入图片描述
pbjs安装成功提示如图
在这里插入图片描述
二.开始使用pbjs打包proto文件
1.先新建一个proto文件,内容如下,命名为test.proto

package proto;


// 获取排行榜
message cs_player_by_rank_opt
{
    required    uint32   rank_id 	= 1; 
    required    uint32   page 	    = 2; 
}

2.打包为typescript指令:pbjs test.proto --ts test.ts
3.打包为javascirpt指令:pbjs test.proto --es6 test.js
4.其他指令可以查看pbjs官方文档:pbjs地址:https://www.npmjs.com/package/pbjs
在这里插入图片描述
打包完成后:
在这里插入图片描述
三.最后,我们在代码中测试一下打包出来的typescript脚本

我这边测试使用的是一个CocosCreator工程,以下是打包test.proto后的部分代码,因为pbjs打包后protobufjs代码是直接集合在test.ts文件中的,因此不需要我们再去引用protobufjs库

export interface cs_player_by_rank_opt {
  rank_id: number;
  page: number;
}

export function encodecs_player_by_rank_opt(message: cs_player_by_rank_opt): Uint8Array {
  let bb = popByteBuffer();
  _encodecs_player_by_rank_opt(message, bb);
  return toUint8Array(bb);
}

function _encodecs_player_by_rank_opt(message: cs_player_by_rank_opt, bb: ByteBuffer): void {
  // required uint32 rank_id = 1;
  let $rank_id = message.rank_id;
  if ($rank_id !== undefined) {
    writeVarint32(bb, 8);
    writeVarint32(bb, $rank_id);
  }

  // required uint32 page = 2;
  let $page = message.page;
  if ($page !== undefined) {
    writeVarint32(bb, 16);
    writeVarint32(bb, $page);
  }
}

export function decodecs_player_by_rank_opt(binary: Uint8Array): cs_player_by_rank_opt {
  return _decodecs_player_by_rank_opt(wrapByteBuffer(binary));
}

function _decodecs_player_by_rank_opt(bb: ByteBuffer): cs_player_by_rank_opt {
  let message: cs_player_by_rank_opt = {} as any;

  end_of_message: while (!isAtEnd(bb)) {
    let tag = readVarint32(bb);

    switch (tag >>> 3) {
      case 0:
        break end_of_message;

      // required uint32 rank_id = 1;
      case 1: {
        message.rank_id = readVarint32(bb) >>> 0;
        break;
      }

      // required uint32 page = 2;
      case 2: {
        message.page = readVarint32(bb) >>> 0;
        break;
      }

      default:
        skipUnknownField(bb, tag & 7);
    }
  }

  if (message.rank_id === undefined)
    throw new Error("Missing required field: rank_id");

  if (message.page === undefined)
    throw new Error("Missing required field: page");

  return message;
}

以下是测试代码:

/****************************
fileName: Main.js
time: 2021:04:15  17:39
author: DNK
explain: 游戏入口
*****************************/

import { log, _decorator, Component, Node } from 'cc';
const { ccclass, property } = _decorator;
import { cs_player_by_rank_opt, encodecs_player_by_rank_opt, decodecs_player_by_rank_opt} from '../protobuf/test';

@ccclass('Main')
export class Main extends Component {
    start () {

        // 这是要发送的数据
        let rankInfo: cs_player_by_rank_opt = {
            rank_id: 1,
            page: 1,
        }

        // 客户端将需要发送的数据转换成字节Buf
        let rankByteVec = encodecs_player_by_rank_opt(rankInfo);
        log("========rankByteVec = ", rankByteVec);

        // 服务端接收到数据字节Buf后,将数据转换回cs_player_by_rank_opt格式
        let reviceRankData = decodecs_player_by_rank_opt(rankByteVec);
        log("========reviceRankData = ", reviceRankData);
    }
}

运行游戏,得到打印结果如下
在这里插入图片描述
搞定!!!

好的,关于protobufjs的使用,proto文件打包成typescript或javascript脚本的教程到此就结束了。谢谢大家,如果觉得我的博文帮到了您,您的赞或打赏是对我最大的支持。如遇到什么问题,可评论区留言。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DNK666666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值