Cocos如何动态新增远程包?

现在各个平台打包产物中都有一个“bundle-scripts”这个文件夹,比如OPPO,VIVO,微信。这个文件中会有当前项目的远程包名字的文件夹。


如果这个文件夹中没有的远程包,是没法远程加载的,加载的时候会报错。

那cocos这边如何动态新增远程包呢?不能新增一个关卡远程包,主包就要打包然后重新发布吧。

游戏的关卡非常复杂,虽然不依赖JS,但是依赖预制体和资源。

1赞

这种需求,在功能实现的时候,开发者就要支持关卡可配置化,
然后以更新配置的形式新增关卡

如果这个配置就是一个预制体呢?

  1. 配置是预制体,就说明配置的还不彻底
  2. 小游戏不支持动态加载js,所以一般而言做不到

预制体本身就是一个json格式内容喔

这题我会,心有多大胆,地有多大产。bundle的羁绊在于js脚本,但是看一眼bundle对应的js文件,如果是纯资源包(包内不含任何代码),那个js都是一毛一样的。所以大胆尝试了一波,重定向bundle加载的接口,直接使用loadRemote接口加载bundle的config.json文件,然后自己创建AssetManager.Bundle对象,完美略过没有对应js的问题。此处要注意下载bundle中的一些特殊处理(如zip等),具体可对照源码中对应平台engine-adapter.js中的下载逻辑

现在bundle中不管有没有js,就算只有一个图片,都会在 bundle-scripts 创建一个 index.js,所以目前是没法动态新增bundle的是吧~

明白,现在就是bundle中没有js也会在 bundle-scripts 中创建一个index.js,导致没法动态新增,目前看来只能改引擎代码了是吧。

嗯,关卡比较复杂,要依赖预制体。

我的配置和资源都是放在cdn上,根据版本号加载的,
bundle里面的.json, .js , 和你说的什么 bundle-scripts我都不太了解,
但是我知道bundle是可以加md5的,
假设你的东西都在 sub_bundle里,
带md5可以构建出带md5的bundle包: sub_bundle.f13ea;
你有内容要更新的时候, 直接放弃之前的bundle包, 重新构建一个,如 sub_bundle.d33eb
上传新的bundle包, 在代码里利用 bunderVersion = ‘d33eb’, 去加载新的bundle包;

重定向就行,不用重新去编译引擎代码。

oldLoadBundle = assetManager.loadBundle;
assetManager.loadBundle = function (name, options, onCompleted) {
    // 如果是普通包,走 oldLoadBundle.call(assetManager, name, options, onCompleted);
    // 如果是新增包,走新逻辑
}

这样就能重定向掉了,在业务逻辑之前找个地方塞入这段代码就行。

明白,感谢 :grinning:

补充一下
构建的时候勾选 MD5 Cache,
构建后assets/sub_bundle/下
就会有 config.d33ee.json, index.d33eeb.js

image

感谢解答,不是版本问题,是无法动态加载新增的远程包~

噢,是我理解错了

这里是加载bundle-scripts对应bundle里js的地方,这里把拼接bundle名字的concat干掉,在bundle-scripts新建一个index.js,统一用这个js

这个不错,学习了~感谢 :kissing_heart: