CocosCreator-微信小游戏中Protobuffjs的使用及proto文件加载问题

    在跑了微信小游戏的发布流程后,紧急着要处理的问题就是protobuffjs的使用,protobuff的使用呢其实大家都很熟悉了,唯一的痛点就是加载、加载、加载问题,不同平台读取文件的方式有所差异的。之前的的一篇已经对原生平台和web平台的加载和使用做了记录,还不了解的可以看下我的另一篇笔记(【CocosCreator-简单玩转ProtobuffJS之“跑起来”(一)】)哦。接下来就是解决微信小游戏的proto加载问题了。

一、加载方式

    1、单个proto加载

        如果我们在定义proto的时候把所有结构都定义到一个proto文件里面那么微信小游戏或者其他平台的话加载就很简单了用ccc的异步加载方式就可以了,单个proto不存在proto之间的引用问题,所以很简单的就加载了。用CCC的和cc.loader.loadRes 和protobuffjs的ProtoBuf.loadProto(proto, builder, fileName)可以了。

其中buider就是用来build一个message的全局对象了(我定义的是全局对象)

  2、多个proto加载

        如果我们还是用以前的ProtoBuf.loadProtoFile(fullPath, builder)的方式的话,加载结果就是这样:WAGame.js:4 request:fail invalid url "res/raw-assets/resources/Proto/Guide.proto",很明显是路径问题,这里我没有进去深究为何路径不能读取的问题,反正:微信小游戏就是读取不了就是了,所以我们增加了微信小游戏的加载判断,这里需要用到平台的判断:

cc.sys.platform === cc.sys.WECHAT_GAME

加载还是用的是cc.loader.loadRes 和protobuffjs的ProtoBuf.loadProto(proto, builder, fileName)。

修改protobuf.Util.fetch函数的:

protobuf.Util.fetch = function myfetch(path, callbcak) { 

    //检查是否为原生环境 

    if (cc.sys.isNative) {   

      //原生环境直接使用jsb提供的文件操作函数加载proto内容   

      let str = jsb.fileUtils.getStringFromFile(path);   

      //如果是异步回调方式,使用callback参数返回数据   

      if (callbcak) {

          callbcak(str);       

          return null;

      }   

      //同步方式用返回值返回数据   

      return str;

    }


    if(cc.sys.platform === cc.sys.WECHAT_GAME){

        cc.log("微信小游戏直接跳过")

        return ""

    } else {

        //为web环境使用,protobufjs原来的处理函数 

        return fetch.call(this, path, callbcak); 

    }

};

你可能感兴趣的:(CocosCreator-微信小游戏中Protobuffjs的使用及proto文件加载问题)