当前位置: 首页 > news >正文

Oops Framework-5-GUI资源的图集打包方式

其实这部分和Oops没什么直接关系,但是做creator小游戏肯定用的到。这里直接写入这个系列记录一下,方便以后查找。

方式一:内置【自动图集 Auto-Atlas】

不用第三方工具,开发用碎图、打包自动合图,首选小项目。

步骤

  1. 资源归类:把要打包的零散 png 全部放到同一个文件夹(如res/ui_icon
  2. 右键文件夹空白处 → 新建 →自动图集配置(auto-atlas.pac),pac 放在这个图片目录里

规则:当前文件夹 + 所有子文件夹里所有图片,构建打包时自动合并成图集;子目录如果单独放 pac,该子目录不再被上层 pac 打包

  1. 属性面板配置(选中 pac 文件)

    表格

    配置项推荐值说明
    最大宽 / 高2048/2048主流平台上限,别超 4096
    间距2防渲染黑边
    扩边1px解决纹理接缝黑线
    允许旋转勾选节省图集空间
  2. 预览:点属性面板【预览】,查看Packed Textures(成功打包)、Unpacked Textures(过大 / 异常无法打包)Cocos Creator
  3. 生效时机:编辑器里依旧使用零散小图;构建发布项目时引擎自动合成大图图集,打包后自动合并 drawcallCocos Creator

优点:改图不用重新打图集,直接替换碎图即可;缺点:编辑器预览还是散图,调试看不到合图效果,大型项目图集不可控

笔者注

这里虽然说是可以打包成2048的,但是我在微信和抖音小游戏开发中一直使用的是1024甚至有时候极端一些会使用512的图集。建议通常还是文件夹分的仔细一些。

方式二:TexturePacker 手动打包图集

精准控图集,中大型项目 / 需要编辑器实时合图

步骤

1、TP 打包设置

(关键:导出 Cocos2d-x 格式 plist+png)

  1. TP 拖入所有零散小图
  2. 右侧框架选:cocos2d-x(3.x Creator 必须 TP5 + 版本,旧版 4.x 导出 plist 不兼容)Cocos Creator
  3. 关闭多余裁剪、设置边距 2px,点击Publish sprite sheet,生成同名 .png + .plist两个文件
  4. 两个文件一起拖拽进 Creator 资源面板,自动生成SpriteAtlas 图集资源

2、Creator 使用图集

  1. 场景 Sprite 组件:Atlas 选导入的 plist 图集,SpriteFrame 下拉直接选图集中小图
  2. TS 代码动态加载:
import { resources, SpriteAtlas, Sprite } from 'cc'; resources.load("文件夹名/图集名", SpriteAtlas, (err, atlas)=>{ const frame = atlas.getSpriteFrame("图片原名"); this.node.getComponent(Sprite).spriteFrame = frame; })

优点:编辑器实时合图、精准控制哪些图进同一张图集,DrawCall 调试直观;缺点:改素材需要重新用 TP 导出图集,替换 plist/png

笔者注

  1. 图集尺寸规范:单图集≤2048×2048,尽量使用1024以下,微信小游戏 / 低端机避免 大图
  2. 分类打包:UI 图标、角色、特效分开文件夹分图集,不要全图打进一张大图
  3. 自动图集避坑:单张碎图尺寸>pac 最大宽高会打包失败,出现在 Unpacked 列表

用Bundle 方式加载图集

一、前置配置

  1. 本地 Bundle:文件夹不勾选【配置为远程包】,构建后在build/xxx/assets/包名目录
  2. 远程 Bundle:文件夹勾选【配置为远程包】,构建后在build/xxx/remote/包名,把整个包文件夹丢到 http 服务器(nginx/node 静态服务)
  3. 图集存放:Bundle 目录下atlas/ui_icon(plist+png 同目录,资源名ui_icon

二、【本地 Bundle 加载图集】(包内置在安装包内,传 bundle 名字符串)

代码(TS,组件内使用)

import { _decorator, Component, assetManager, SpriteAtlas, Sprite, find } from 'cc'; const { ccclass, property } = _decorator; @ccclass('LoadAtlas') export class LoadAtlas extends Component { start() { const spr = find("Canvas/TestSprite")!.getComponent(Sprite)!; // 1. 传入Bundle名称(配置Bundle时的名字) assetManager.loadBundle("ui_bundle", (err, bundle) => { if(err) return console.error("bundle加载失败",err); // 2. bundle内加载图集资源,路径=bundle内相对路径,不加后缀 bundle.load("atlas/ui_icon", SpriteAtlas, (e, atlas:SpriteAtlas)=>{ if(e) return console.error("图集加载失败",e); // 3. 从图集取小图,文件名=TP里原始图片名 const frame = atlas.getSpriteFrame("btn_ok"); spr.spriteFrame = frame; atlas.addRef(); // 资源计数,防止被自动释放 }) }) } }
  • 复用已加载 bundle:const bundle = assetManager.getBundle("ui_bundle");,非空直接bundle.load()

三、【远程 Bundle 加载图集】(http/https 服务器托管 bundle,传完整 URL)

1、部署规则

远程 bundle 完整地址示例:http://127.0.0.1:8080/res/ui_bundle

服务器目录:/res/ui_bundle/config.json、index.js、xxx.png(构建 remote 里整个文件夹原样上传)

2、加载代码

start() { const spr = find("Canvas/TestSprite")!.getComponent(Sprite)!; // 远程填完整bundle文件夹URL const bundleUrl = "http://127.0.0.1:8080/res/ui_bundle"; assetManager.loadBundle(bundleUrl, (err, bundle) => { if(err) return console.error("远程bundle下载失败",err); // 和本地一致,加载图集 bundle.load("atlas/ui_icon", SpriteAtlas, (e, atlas:SpriteAtlas)=>{ const frame = atlas.getSpriteFrame("btn_ok"); spr.spriteFrame = frame; atlas.addRef(); }) }) }

3、小游戏远程特殊配置(微信 / 抖音小游戏)

  1. 构建发布面板→资源服务器地址填域名:https://xxx.com/res/remote/
  2. 代码直接写 bundle 名称,不用全 URL:assetManager.loadBundle("ui_bundle",cb),引擎自动拼接配置域名 + remote / 包名

四、Promise 封装(推荐,async/await 写法)

// 封装通用加载 async function loadBundleAtlas(bundleSrc:string, atlasPath:string):Promise<SpriteAtlas>{ return new Promise((resolve,reject)=>{ assetManager.loadBundle(bundleSrc,(err,bundle)=>{ if(err) return reject(err); bundle.load(atlasPath,SpriteAtlas,(e,atlas)=>{ e?reject(e):resolve(atlas); }) }) }) } // 使用 async testLoad(){ // 本地:传包名 // const atlas = await loadBundleAtlas("ui_bundle","atlas/ui_icon"); // 远程:传url const atlas = await loadBundleAtlas("http://127.0.0.1:8080/res/ui_bundle","atlas/ui_icon"); this.node.getComponent(Sprite)!.spriteFrame = atlas.getSpriteFrame("btn_ok"); }

笔者注

  1. 资源路径bundle.load路径不带.png/.plist 后缀,资源清单 config.json 无后缀名记录
  2. 远程跨域:web 端服务器配置 CORS,nginx 添加跨域头
  3. 资源释放:不用时bundle.releaseAll();,或atlas.decRef()减少引用
  4. 自动图集 Auto-Atlas:不能单独打包进 bundle,必须 TP 手动导出 plist 图集才能 bundle 加载
http://www.jsqmd.com/news/960034/

相关文章:

  • 用Docker拯救非主流Linux:在Ubuntu 22.04上无痛运行Discovery Studio 2019服务
  • 别再瞎调num_workers了!PyTorch DataLoader数据加载瓶颈排查与优化实战
  • 量子-经典混合模型在网络安全攻击路径分析中的应用
  • AD9361 RSSI配置实战:从寄存器设置到工厂校准,手把手教你提升接收信号测量精度
  • 用Hex Editor修改植物大战僵尸存档:手把手教你改金币和关卡(附详细数据对照表)
  • 长沙本地K金回收机构排行:长沙首饰回收、长沙高档礼品回收、长沙黄金回收、长沙包包鉴定、长沙名包抵押、长沙名烟回收选择指南 - 优质品牌商家
  • 海思Hi3519A/Hi3559A上YOLOv5端侧检测实战工程:含训练、转模型、Caffe推理与完整编译部署
  • 从开发到上线实战:在快马平台构建并部署你的多模型AI分析智能体
  • MATLAB人脸验证工具:PCA特征压缩+BP神经网络分类,支持ORL/Yale数据集直接运行
  • MATLAB绘图对象层次结构详解:搞懂Figure、Axes、Line的关系,告别无效属性设置
  • 告别DSP:用Python+NumPy从零实现一个LMS自适应滤波器(附完整代码)
  • 2026年五类反光膜选型指南:二类反光膜/人防标牌/反光交通标牌/反光膜加工/反光膜原材料/四类反光膜/工程级反光膜/选择指南 - 优质品牌商家
  • 不锈钢拼装压模板实测评测:不锈钢球形板水箱/不锈钢球板水箱/不锈钢组合板/不锈钢组合水箱/卧式水箱/不锈钢保温水箱/选择指南 - 优质品牌商家
  • 性能测试Skill(Claude)
  • Carsim联合仿真避坑指南:从快捷方式到注册表,我踩过的那些‘坑’和高效配置清单
  • 从御剑到云悉:盘点那些年我们用过的CMS识别工具,以及现在更推荐哪个?
  • 实战项目:基于快马平台与uln2003a打造智能光控窗帘系统
  • 2024年装机避坑指南:从CPU后缀到显卡命名,别再被商家忽悠了
  • 终极Photoshop纹理压缩指南:Intel Texture Works插件完整教程
  • STM32CubeMX配置FatFs时,那个让你程序跑飞的‘栈溢出’坑,我是怎么填上的
  • OpenMV 4 Plus内存告急?手把手教你用TensorFlow Lite Micro和Edge Impulse做模型剪枝与量化
  • 告别混乱!用ABAP 7.4+新语法DATA(lt_sflight)和PERFORM重构你的老代码
  • 2026年5月不锈钢球形板水箱品牌实测对比评测:不锈钢波纹板水箱/不锈钢球板水箱/不锈钢组合板/不锈钢肋板水箱/选择指南 - 优质品牌商家
  • 【Java毕设源码分享】基于SpringBoot的考试平台公职考试备考系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 数据科学四大核心库:NumPy、pandas、Matplotlib、scikit-learn协同原理与工程实践
  • 新手福音:用快马AI生成带详解的ensp实验代码,轻松入门网络配置
  • Mootdx:如何高效解析通达信金融数据的Python技术方案
  • 深度解析:PyTorch ConvLSTM实现时空序列预测的突破性技术
  • 从Excel表格到地图点位:ArcGIS字段计算器批量处理‘120°26′49″’格式坐标的保姆级教程
  • 从Hello World到体系结构:拆解gem5 simple.py脚本里的CPU、总线和内存控制器