cocos creator图集到构建后真实文件的转换求疑

如上图,我在此文件夹加了自动图集文件

实际构建成功后此图集的描述文件及资源文件命名却是如下图:


自动图集meta uuid:a390210c-7317-453f-b0a2-824c33003eca
求答疑:
图集Json命名:0dccb1cb0
资源命名:1dccb1cb0

这两个命名,是如何生成的

1赞

自动图集,由于一个 pac 配置有可能生成多张图,所以不是用的原始 uuid,而是采用包含的碎图的 uuid 哈希而来。要获取到对应的 png,你可以参考这个范例,写个插件,通过 getNativeAssetPaths API 获取 https://github.com/cocos-creator/demo-process-build-textures

1赞

赋一下插件实现,实现采集游戏内所有自动图集对应的图片真实路径,最终生成AutoAtlasRealPath.txt到build目录

const path = require('path');
const fs = require('fs');
const fsTool = require('../libs/fsTool');

function calculateAutoAtlasURLList(fpath,autoAtltasURLList,fileTypes){
    var files = fs.readdirSync(fpath);

    var autoAtltasUrl = ""
    for(var i=0;i<files.length;i++){
        fname = files[i]
        var fg = fpath + "/" + fname;
        var stats = fs.statSync(fg)
        if(!stats.isDirectory()){
            if(fsTool.isFileType(fname, fileTypes)){
                autoAtltasUrl = fpath
                break
            }
        }
    }
    if(autoAtltasUrl){
        autoAtltasURLList.push(autoAtltasUrl)
    }
    else{
        for(var i=0;i<files.length;i++){
            fname = files[i]
            var fg = fpath + "/" + fname;
            var stats = fs.statSync(fg)
            if(stats.isDirectory()){
                calculateAutoAtlasURLList(fg,autoAtltasURLList,fileTypes)
            }
        }
    }
}

function onBeforeBuildFinish (options, callback) {
    // Editor.log(options);
    // callback();

    let buildResults = options.buildResults;
    if(options.buildScriptsOnly){
        callback();
        return
    }

    var autoAtltasURLList = [];
    fileTypes = [".pac"];
    var fpath = path.join(options.project,'assets');
    calculateAutoAtlasURLList(fpath,autoAtltasURLList,fileTypes)

    var str = ""
    var loadNext = () => {
        if (autoAtltasURLList.length > 0) {
            var autoAtltasURL = autoAtltasURLList.pop()
            var urlFix = autoAtltasURL.split(options.project)[1]
            urlFix = urlFix.slice(1)
            // Editor.log("autoAtltasURL:"+ autoAtltasURL);
            // Editor.log("urlFix:"+ urlFix);
            Editor.assetdb.queryAssets('db://' + urlFix + '/**/*', 'sprite-frame', (err, assetInfos) => {
                let textures = _getTextureFromSpriteFrames(buildResults, assetInfos);
                let urlFixTmp = urlFix.slice('assets'.length + 1)
                for (let i = 0; i < textures.length; ++i) {
                    let path = buildResults.getNativeAssetPath(textures[i]);
                    let pathFix = path
                    pathFix = pathFix.replace(/\\/g,"/")
                    Editor.log(`${pathFix}`);
                    pathFix = pathFix.split("/jsb-link/")[1]
                    // Editor.log(`Texture of ${urlFixTmp}: ${pathFix}`);
                    str += `${urlFixTmp}|${pathFix}\n`
                }
                loadNext();
            });
        } else {
            var fp = path.join(options.project, 'build/AutoAtlasRealPath.txt');
            fs.writeFileSync(fp, str, {flag: 'w'});
            callback();
        }
    };
    loadNext();
}

function _getTextureFromSpriteFrames (buildResults, assetInfos) {
    let textures = {};
    for (let i = 0; i < assetInfos.length; ++i) {
        let info = assetInfos[i];
        if (buildResults.containsAsset(info.uuid)) {
            let depends = buildResults.getDependencies(info.uuid);
            if (depends.length > 0) {
                // sprite frame should have only one texture
                textures[depends[0]] = true;
            }
        }
    }
    return Object.keys(textures);
}

module.exports = {
    load () {
        Editor.Builder.on('before-change-files', onBeforeBuildFinish);
    },

    unload () {
        Editor.Builder.removeListener('before-change-files', onBeforeBuildFinish);
    }
};

以“|”分隔,左边是图集路径 右边是图集生成的图片实际路径

2赞

我想在构建之前就知道生成合图的uuid,想请问下能不能做到?

目前不行,为什么构建前就要知道?

我们想选择性的压缩合图

如果构建之后才知道的话,每次修改的话都必须构建一次,不是特别方便

我想对构建成功之后的包的合图选择性的进行压缩。我是通过一份需要压缩的合图命名配置表,然后遍历包里面的图片,来确定该图片是否需要压缩。所以每一次有增删资源的话,又得重新构建,然后修改配置表。这就很不方便。

用万能的python写个命令行build然后建立目标文件缓存列表,筛选差异文件,再集成压缩纹理命令到python吧 :rofl:

我试过命令行build,但是没试过集成压缩纹理命令,能展开说说吗?或者有没有事例 :rofl:

编辑器内部实现纹理压缩也是通过命令行,我记得在编辑器的文件夹里有,去找找。另外不同压缩命令的参数都不一样,得去度娘或者谷歌去查查。

cocosDashboard\resources.editors\Creator\2.4.6\resources\static\tools

我记得,cocos的压缩纹理使对一种类型的图片都进行压缩的吧

是的,所以要么去下个缓存插件,要么自己动手写 :rofl:

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。