setting.js中的那些uuid的生成机制是什么

如下图,cocos creator构建出来的setting.js中的assets的uuid、packedAssets的packUuid的生成机制是什么,跟文件名有关系吗。

因为我想在子游戏中使用大厅的prefab,就需要把整个项目的packedAssets的映射一直保存着,这样就有一个潜在的问题:大厅和子游戏的某些packedAssets的packUuid相同的话,存储时,后存入的就会将先存入的覆盖掉。

如何能避免大厅和子游戏之间uuid或者packUuid的重复

1赞

@panda @jare @wangzhe

我就想知道,如果文件名不同,是不是setting.js中生成的uuid和packUuid就会不一样?

顶一下,希望有人能帮忙解答

官方有人出来解释一下吗:6:

uuid 是随机生成的,不会重复
packUuid 是根据 uuid 哈希出来的

假设有两个项目A和B,A和B里都有一个hello.png的资源,他们的uuid也不会重复吗

不会重复,除非你手动把 hello.png.meta 复制过去

.meta中的uuid是32位的,setting.js中的uuid是22位,两者有什么关联

后者是由前者压缩而来的

好的,谢谢您的解答

请问具体是怎么压缩,或者说换算的呢,我想自己写个插件,从setting.js中把相关的UUID解析出来,自己实现分包热更新

Editor.Utils.UuidUtils.decompressUuid(uuid)

2赞

代码拆分不知道怎么搞 现在都在一个里面 不能完全分离

麻烦问下 生成settings.js的逻辑的代码在哪里哈?
我们这边升级到到2.0, 因为移除了RawAssets, 导致加载zip文件时类型是cc.Asset,但是cc.Assets没有"zip" 这个属性,所以加载的zip文件内容没有办法获取到。
_nativeAsset: {
get () {},
set (obj) {}
},
set没有任何具体的实现,直接把内容丢了,这样导致加载完成后,回调中的cc.Asset没有zip文件的内容。我们这边自定义zip文件的downloader和loader,但是creator没有个自定义Asset类型的接口。所以是不是提供自定义Asset接口的地方?我是做后端开发的,小白,有描述不清楚的地方还请见谅。

这边想到的方案是自定义一个ZipAsset,通过代码修改cc.loader._resoures 把文件对应的类型改成cc.ZipAsset。但是加载zip文件时好像又加载了import里面的一个json,这个json返回的内容指定zip的类型又是cc.Asset,目前不知道怎么绕过这个。
想到的解决问题的方法完成以下两步
1)settings.js的生成逻辑在哪里? 把cc.ZipAsset加入到assetTypes里。
2) 生成import下的json文件的逻辑在哪里? 把zip文件对应的类型改成cc.ZipAsset

抱歉这块没有开源,里面非常复杂,梳理得不够完美的话不太方便开放

请通过 asset.nativeUrl 获得 zip 的 url,然后自己做进一步处理。比如通过 loader 进一步下载 zip 文件。

这一块有点复杂,其实按照上面的方法应该就行了。实在要这么做的话,你可以参考下这个插件https://github.com/DragonBones/DragonBonesJS/blob/master/Cocos/Demos/packages/dragonbones

官方能先增加一个ZipAsset吗?对于游戏配置文件如果放在多个json文件,加载过程会很麻烦

你好,最近发现一个问题是meta文件中uuid有重复的,这样子的,两个人同时开发一个项目,A可能新建了一个文件,另外B修改了其他东西,然后当B想要从git上更新远程服务器的代码下来的时候,重新打开IDE发现会报uuid重复,存在冲突的,可以告知下uuid生成规则吗,或者生成的uuid可以自己定制修改不?

meta 及时上传就没事了,详见 http://docs.cocos.com/creator/manual/zh/advanced-topics/meta.html

暂时的解决方案是在zip文件的loader函数中直接修改Asset

function zipLoader(item, callback) {
      const bytes = item.content;
      const zipFile = someFunction(bytes);

      const fakeZipAsset = item._owner; // fakeZipAsset is cc.Asset
      fakeZipAsset.zip = zipFile;
      callback(null, null);
}

然后在加载的回调函数中就会拿到这个cc.Assets

function someCallback(err, resource) {
   const fakeZipAsset = resource;
   const zipFile = fakeZipAsset.zip
   // then do some things with zipFile
}
2赞

packUuid 怎么还原成之前的uuid?