太多人问Protobuf的问题了,我只好把这个重新搬出来!

Posted Creator星球游戏开发社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了太多人问Protobuf的问题了,我只好把这个重新搬出来!相关的知识,希望对你有一定的参考价值。


pb杀手

我先让 pbkiller 做个自我介绍

pbkiller:我是一位专业的争对 protobuf 问题训练有素的杀手,我可以为您轻松搞定 protobuf 在 Cocos Creaotr 开发中的诸多问题,并且可以让你随意折磨曾经折磨过你的 protbuf 问题。

一、臣服


我 pbkiller 最厉害的技能是可以快速逮捕 proto 文件,让他们臣服在主人脚下,不论是在浏览器、手机、桌面环境上。

1. 呼唤

只需要低声轻吟我的名字“pbkiller”我就会出现在你的身边,对于我的主人我是非常温柔的。

let pbkiller = require('pbkiller');


2. 让 proto 文件跪在主人面前

太多人问Protobuf的问题了,我只好把这个重新搬出来!

对于 proto 文件我是残忍的,但请主人预先将所有 proto 文件放在 assets/resources/pb 目录,召唤一声 preload,我立马就到,您再使用 loadAll() 指令,我会将 proto 文件一网打尽,让它们全部跪在您的面前。

//所有proto对象都集中在返回的pb对象上
pbkiller.preload(() => {
let pb = pbkiller.loadAll();
});


3. 让 JSON 格式同样下跪

如果主人喜欢json格式的proto文件,目前需要麻烦主人先使用 protobufjs 附带的pbjs工具将 proto 文件转换成 json 格式存放在 assets/resources/pb 目录,有我在让它同样跪下。

//所有proto对象都集中在返回的pb对象上
let pb = pbkiller.loadAll('json');


4. 逮捕指定proto文件

太多人问Protobuf的问题了,我只好把这个重新搬出来!

如果主人只需逮捕某一个或多个proto文件,可以使用loadFromFile。

let pb = pbkiller.loadFromFile('xxx.proto');
let pb = pbkiller.loadFromFile(['xxx.proto', 'yyy.proto']);
let pb = pbkiller.loadFromFile(['xxx.json', 'yyy.json']);


5. 逮捕不同地域的 proto 文件

主人,我默认逮捕的路径是 assets/resources/pb,可以通过下面属性修改路径。

//使用root属性修改路径
pbkiller.root = 'my-pb-path';
//此时逮捕路径为:assets/resources/my-pb-path

pbkiller.preload(() => {

pb = pbkiller.loadAll();

)};

二、折磨

太多人问Protobuf的问题了,我只好把这个重新搬出来!

虽然我们名字中带有killer,但是最高兴的不是一下子把敌人杀掉,而是折磨它!因为他曾经可能折磨过我的主人,所以不能让它死的太简单了,哈哈哈。

1. 揪出一个 proto 给主人扭打(实例化)

主人,我把 proto 给你抓来了,你可以使用 new 关键字,随意扭打 proto 了。

//逮捕所有proto文件,并指定编译grace.proto.msg包路径下的所有对象
let pb = pbkiller.loadAll('proto', 'grace.proto.msg');

let player = new pb.Player(); //扭打Player
player.name = 'ShawnZhang'; //再踹一脚

2. 挨一轮巴掌与低声哭(序列化与反序列化)

主人,让 proto 挨一轮巴掌使用 toArrayBuffer,如果你觉得有点累可以使用 toBuffer 他们的效果完全是一样的。

let player = new pb.Player();  //先扭打
let data = player.toBuffer(); //再来一巴掌

上面我们把player打成了呆傻(data),现在把它打回来,让他哭一下就好了,但是只准小声的哭,请下答 decode 指令。

 //主人允许你小声哭,给我回来
let player = pb.Player.decode(data);

三、内讧

shawn:“pbkiller没想到你的话这么多,让你自己我介绍一下下,讲这么大一堆。对待proto 这么残忍,又主人主人的,特别肉麻,好恶心”

pbkiller:“这年头,你以为杀手是那么容易当的么,杀手也要学会自我营销,注重用户体验,你那套介绍方式已经 out 了”。

shawn:“你居然敢说我 out 了,小心我把你给卖了送人”。

pbkiller:“你这个人,怕是求之不得,把我多买几份! 我就看你说话的方式有几个人会喜欢?” pbkiller一脸鄙夷的神情。

四、正式说明

pbkiller 插件库可以帮助你在 Cocos Creator 中简化 protobufjs 的使用,并兼容所有平台和 Creator 版本!

1. 安装

pbkiller插件有两种安装模式:

  • install-src:源码模式,此模式会将protobufjs原码导入项目中,不依赖任何外部文件。对npm不熟悉的用户推荐使用此模式安装。

  • install-lite:简化模式,此模式需要提前安装protobufjs npm模块,安装命令:npm install protobufjs@5


安装完成后,会导入如下文件:

  1. protobufjs源码(简化模式无此目录)

  2. pbkiller源码、及fs/path伪装模块

  3. 简单的测试场景和代码

  4. 测试proto文件


下面是导入文件和目录结构:

pbkiller
├── protobuf protobufjs源码
│ ├── bytebuffer.js
│ ├── long.js
│ └── protobufjs.js
├── src pbkiller源码
│ ├── fs.js fs伪装
│ ├── path.js path伪装
│ └── pbkiller.js pbkillers核心代码
└── test
├── test-pbkiller.fire 测试场景
└── test-pbkiller.js 测试组件代码
resources resource/pb是默认的proto文件存放的根目录
└── pb 以下文件为测试用proto文件,可以自行删除
├── ActionCode.proto
├── ChatMsg.proto
├── Player.json

└── Player.proto

2. 快速使用

导入模块

let pbkiller = require('pbkiller');

加载resources/pb目录下所有proto文件

//加载所有proto文件
let pb = pbkiller.loadAll();

//实例化proto中的Player对象
let player = new pb.grace.proto.msg.Player();

指定文件格式:[proto|json] 默认为proto

//注意json文件是由protobufjs提供的pbjs工个生成
let pb = pbkiller.loadAll('json');

指定编译的对象路径

let pb = pbkiller.loadAll('proto', 'grace.proto.msg');
cc.log(new pb.Player());

3. 特别注意

在加载proto时可以使用扩展名为.proto.json的文件,pbkiller支持两种混用,但需要特别注意的如果有proto之间有依赖关系,请保证依赖文件之间是相同的文件格式。

五、结束

太多人问Protobuf的问题了,我只好把这个重新搬出来!


最新版本 pbkiller 1.2.0 支持 Cocos Creator 2.1.2,但是暂时无法在 Cocos 插件商店下载,

太多人问Protobuf的问题了,我只好把这个重新搬出来!
Cocos 商店是怎么了?审核快有半年了吧

请已购买的伙伴,发送你在 Cocos 商店上的订单号给我,我为你免费升级!同时 Shawn 已经启动应急预案,需要购买的伙伴,可到我微店下单,点击下方【阅读原文】直达。


太多人问Protobuf的问题了,我只好把这个重新搬出来!



扫码关注

更多精彩在等你

以上是关于太多人问Protobuf的问题了,我只好把这个重新搬出来!的主要内容,如果未能解决你的问题,请参考以下文章

数据库优化该怎么回答这个问题?

bazel 重新编译 protobuf 超出了必要的范围

在 java 和 scala 中使用 protobuf 的问题

寒假作业 03

随笔之思想新生

如何正确拆除多人连接会话?