cocos3d 远程加载模型文件方案

背景

cocos是一个轻量级的3d引擎,对于3d模型的处理方式大概是这样的,用编辑器里的fbx2gltf工具(看起来是闭源的),转换成glb的二进制文件。模型放在resources里,打包会生成对应的一堆.bin文件,这样一个fbx在cocos的概念里更像是一个包含了模型、骨骼、材质、贴图的文件夹。在项目中可以通过loadResDir的方式将模型内所有的相关元素加载(mesh)。

在实际项目中,模型文件可能会很多,甚至需要动态加载以及动态扩充,有些东西我们不太希望每次都要重新打包才能完成,更希望生成配置一类的东西,根据服务器下发的数据进行动态加载,动态展示。

基于这些情况,我在本地实现了一套可以动态加载打包好的模型机制。简单介绍一下,抛砖引玉吧,简单给大家提供一个思路。

我的方案

  1. 两个工程分别打包放在http://x.x.x.x/web/和http://x.x.x.x/model/。
  2. 在自己的加载类里分别加载web和model中的settings.js,web加载可以用相对地址(src/settings),model加载用绝对地址(http://x.x.x.x/model/src/settings)。
  3. 记录model中uuid以及对应的远程地址(也就是http://x.x.x.x/model/)。
  4. 把这两个settings合并成一个settings。
  5. web/main.js中有settings加载的逻辑,把这个逻辑拷到自己的加载类,用组合好的settings加载。
  6. 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

4赞

你把构建后的 res 文件夹放服务器可行吗?

可行,咱们cocos本来就是uuid会对应一个下载地址,只要能保证uuid找到对应的地址就没什么问题,稍后我把对应案例也扔到github上吧。
ps:这个方案其实也不用弄个prefab出来。模型扔到cocos里就大概类似是个prefab了吧

需要res整体和src的settings,settings里可以只保留这几项

,

da’la大佬没看懂你的意思 这个demo我看没有任何东西走的服务器啊 都是localhost项目里的资源 你这种效果能做到 玩家进入游戏 玩哪个内容下载哪个fbx吗

你看下边的那两个网址,第一个是什么都不加载的,只是为了做个对比

哦哦看到了 大佬 您这个是不是也得从服务器上下载全资源才能进入游戏呢

不用,我的这个实现思路是这样的,cocos整体机制就是根据resource地址获得uuid,根据uuid去找对应的文件,这个文件正常是在包里的res文件夹下的。
那这样我只要知道当前uuid对应的文件是不是需要走远程路径下载就完事了,如果当前uuid的文件不在包内,就会拼接一个uuid对应的地址,这个地址怎么填都行,我们现在内部用的是file协议加载的地址。

如果需要动态换包,就动态整理settings就行了。我现在settings是全局的,每多一个包就把settings更新一下重新init,这个其实比较浪费,但是这是不改引擎的情况下我能想到的最好状况了。

感谢大佬的分享

有木有更好方案,我也想实现这个功能,动态加载远程服务器的模型文件FBX、GLB,你这边的方案没法搞,那些链接都打不开

这様搞, 想搞ai 自动3d建模后在游戏引擎套用的方案无法落地