背景
cocos是一个轻量级的3d引擎,对于3d模型的处理方式大概是这样的,用编辑器里的fbx2gltf工具(看起来是闭源的),转换成glb的二进制文件。模型放在resources里,打包会生成对应的一堆.bin文件,这样一个fbx在cocos的概念里更像是一个包含了模型、骨骼、材质、贴图的文件夹。在项目中可以通过loadResDir的方式将模型内所有的相关元素加载(mesh)。
在实际项目中,模型文件可能会很多,甚至需要动态加载以及动态扩充,有些东西我们不太希望每次都要重新打包才能完成,更希望生成配置一类的东西,根据服务器下发的数据进行动态加载,动态展示。
基于这些情况,我在本地实现了一套可以动态加载打包好的模型机制。简单介绍一下,抛砖引玉吧,简单给大家提供一个思路。
我的方案
- 两个工程分别打包放在http://x.x.x.x/web/和http://x.x.x.x/model/。
- 在自己的加载类里分别加载web和model中的settings.js,web加载可以用相对地址(src/settings),model加载用绝对地址(http://x.x.x.x/model/src/settings)。
- 记录model中uuid以及对应的远程地址(也就是http://x.x.x.x/model/)。
- 把这两个settings合并成一个settings。
- web/main.js中有settings加载的逻辑,把这个逻辑拷到自己的加载类,用组合好的settings加载。
- hook引擎里的AssetLibrary.getLibUrlNoExt。在发现uuid对应资源是model中的时候,拼接远程地址。
已知的问题:
- 不支持打包的时候选择md5,因为看起来md5是用数组的索引做标记的,合并成一个大数组以后,需要对应处理,没有做,按说可以加上。
- uuid因为在两个项目里,不能保证不会冲突(但是觉得几率不大,就没有处理
示例
https://lsybblll.github.io/cocos3d_load_model_package/preview/index.html
https://lsybblll.github.io/cocos3d_load_model_package/preview/index.html?model=cube
https://lsybblll.github.io/cocos3d_load_model_package/preview/index.html?model=cone
cone资源路径:https://github.com/lsybblll/cocos3d_load_model_package/tree/master/model1
cube资源路径:https://github.com/lsybblll/cocos3d_load_model_package/tree/master/model2
其他
把项目中的文件删的只剩相关代码放在了上边,有兴趣可以看一下,有更好的方法欢迎交流。
https://github.com/lsybblll/cocos3d_load_model_package