Node.js使用TexturePacker批量打包Plist文件

216 阅读1分钟

起因

策划丢过来了一批特效,需要打包成Plist

解决

使用Node.js调用TexturePacker的命令进行打包

源码

把代码中的TexturePacker,需要打包的路径,以及输出路径替换成自己的就可以直接使用了

import fs from 'fs';
import path from 'path';
import { exec } from 'child_process';

// 你的 TexturePacker 安装路径
const texturePackerPath =
    'D:\\Program Files (x86)\\CodeAndWeb\\TexturePacker\\bin\\TexturePacker.exe'; // 替换为你实际安装的路径

// 图片文件夹路径,替换成你需要打包的路径
const inputDir = path.resolve(
    `/pathtoPackage/`,
    'effect'
); // 输入目录
const outputDir = path.resolve('output', 'effect'); // 输出目录

let createdArr = [];

function readDirSync(dir) {
    try {
        const files = fs.readdirSync(dir); // 获取文件夹中的所有文件和子目录
        files.forEach((file) => {
            const filePath = path.join(dir, file);
            const stats = fs.statSync(filePath); // 获取文件的详细信息
            dir = dir.replace(/\\/g, '/');
            let arr = dir.split('/');
            let name = arr[arr.length - 1];
            if (stats.isDirectory()) {
                //console.log(`目录: ${filePath}`);
                readDirSync(filePath); // 递归遍历子目录
            } else {
                //console.log(`文件: ${filePath}`);
                if (!createdArr.includes(name)) {
                    createdArr.push(name);
                    packageTexture(dir, name);
                }
            }
        });
    } catch (error) {
        console.error('读取目录出错:', error);
    }
}

function packageTexture(inputDir, name) {
    // 执行 TexturePacker 命令,打包图集

    let filePath = path.join(outputDir, name);

    const cmd = `"${texturePackerPath}" --format cocos2d --max-size 1024 --size-constraints AnySize --sheet "${filePath}.png" --data "${filePath}.plist" "${inputDir}"`;
    // 上面的不行,可以试试下面的版本,不知道为什么我下面这个不行,但是官方例子是用下面的
    //const cmd = `"${texturePackerPath}" --format cocos2d --max-size 1024 --size-constraints AnySize --sheet "${filePath}.png" --data "${filePath}.plist" "${inputDir}/*.png"`;
    console.log(cmd);
    exec(cmd, { cwd: inputDir }, (err, stdout, stderr) => {
        if (err) {
            console.error(`执行命令失败: ${err}`);
            return;
        }
        if (stderr) {
            console.error(`错误信息: ${stderr}`);
            return;
        }
        console.log(`处理成功: ${stdout}`);
    });
}

readDirSync(inputDir);