代码放Bundle,怎么动态加载?

image 还有种方式就是注册事件去处理这个流程,你就能获取到这个对应的脚本了,但是一个Bundle只有一个脚本,还是后于json加载的,所以其实理解你的想法,但是真没必要 。下面这个函数可以处理在加载过程中的每一个文件,你要是真想弄,试下这个吧 cc.assetManager.downloader.register(type: string, handler: (url: string, options: Record<string, any>, onComplete: (err: Error, content: any) => void) => void): void;

但是这样的代价就是代码不好维护,还不好处理

cc.assetManager.downloader.register(type: string, handler: (url: string, options: Record<string, any>, onComplete: (err: Error, content: any) => void) => void): void;
嗯嗯,这个没用过,我去试试再说

懂了,但是想法可能太怪了 :rofl:
加载bundle的本质我想别人解释的很清楚了,不赘述了,至于你的目的吧也明白,不过呢,还是怪怪的。直接贴图看效果,监听脚本录入+运行效果
image
image
脚本注入的地方在“index.js”加载中执行,bundle的加载流程是config.json、index.js、创建Bundle对象;故脚本注入和bundle完成两者之间时间差很小,主要看index.js代码量和Bundle生成的计算量;
注:其实你可以在bundle加载完就做你想做的事,没必要脚本录入时就挂上脚本那么迫切

需求确实有点特殊,我这个bundle主要是管理员模块,加载完需要点时间,但是我要让管理员先处理bundle里入口脚本的一些事件

大佬,我想问下,脚本确实可以放bundle里,但是已经加载过的bundle,app运行过程中再次更新bundle时,代码就无法更新。除非重新启动APP,你们有好的方案吗?

完全卸载bundle再试下呢,原生是可以完全卸载的, bundle.releaseAll(); cc.assetmanager.removebundle(),然后再重新加载,但是这种方式只适合可写路径下的bundle,只有可写路径下的bundle才能修改,还有就是要在main.js里设置一下这个bundle的搜索路径,但是要注意bundle应该在assets目录下,也就是说,你的bundle实际路径应该是:可写路径/热更目录/assets/bundle_dir

如果是web,建议加入md5,这样的话就可以通过md5来下载对应的文件,避免缓存问题

满满的干货啊 :laughing:

做的多了就知道了,不是啥 麻烦事儿

永远有做不完的需求,加油:rofl:

是啊,除非被裁了……

各位大佬,我想跟帖问个问题:如果有很多个子游戏,然后通用的bundle包有A包和B包,子游戏想根据情况调用对应的通用bundle包的内容,关于文件引用的问题要怎么处理?动态import A包和B包的类吗?

已知的情况除了预览,其他环境import没用。下面是跨bundle访问代码方式,都需要bundle先加载后调用——

1、访问脚本可以单独用cc.js.getClassByName(“类名”),所有环境下通用,但局限于只能拿到脚本;

2、访问代码文件可以用

  • 2.x版本用__require(‘文件名’),仅限打包环境,兼容预览环境可以在入口类加image

  • 3.x用System,每个小版本差异挺大,3.6以上用System[Object.getOwnPropertySymbols(System)[0]][‘chunks:///_virtual/{文件名}’](没具体看过其他版本),不限环境image

附注:如果一定要把通用的代码放子bundle,那最好只放脚本,其他文件获取方式太恶心了;然后是import的问题,代码不要直接引用类对象,而是只做类型说明,否则预览好好的,打包就挂了:
this.node.addComponent(ChildBundleComp)——错误方式;
this.node.addComponent(‘ChildBundleComp’) as ChildBundleComp——正确方式;

谢谢大佬!

你说的index.js 在哪里,我配置远程包remote文件夹里,怎么没有index.js?

打包,是指远程包么?我打的远程包中,怎么没有index.js文件,而且用loadBundle加载的话就报错,找不到index.js文件

我目前解决远程包里脚本组件报错的做法是,把脚本挂到全局,不要用import就可以了。

已经实现一个新建的空工程,加一个5行代码的自运行脚本,就可以跑任何游戏,而且不限平台,H5、Android、Ios只要loadBundle能读远程包的平台都有效。

但是3.8.4之前的版本,导出远程包AnimationClip会丢失,3.8.5修复了。

1赞

过来支持

image native构建完后bundle应该文件夹目录下面index.js或者index.xxx.js