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脚本的教程到此就结束了。谢谢大家,如果觉得我的博文帮到了您,您的赞或打赏是对我最大的支持。如遇到什么问题,可评论区留言。