SpriteAtlas 是一种精灵集合资源,通过将多个精灵纹理打包成一张精灵图集从而在绘制时合并绘制指令,它拥有以下优势:
下图精灵图集例子里每帧只调用了一次绘制指令:
在 资产面板 内右键,选择功能列表
中的创建
,并选中精灵图集
,此时,一个空白的精灵图集资产就创建成功了。
选中精灵图集
资产,可以在 检查器面板 查看资产的详细信息。
在确定精灵图集
与精灵
之间的包含关系后,需要将精灵
添加至对应的精灵图集
,此步骤即可通过操作精灵
资产实现,也可通过操作精灵图集
资产实现,接下来就分别实践两种方式。
左键选中需要添加的精灵
资产,可以在 检查器面板 找到精灵的从属关系
,选择打包进图集
就可以选取希望打包进的精灵图集
资产了。
左键选中目标精灵图集
资产,可以在 检查器面板 找到图集打包的精灵列表,选择添加精灵
就可以选取希望打包的精灵
资产了。(若选取文件夹,则会添加文件夹目录下的所有精灵)
左键选中需要从图集中移除的的精灵
资产,可以在 检查器面板 找到精灵的从属关系
(注意需确认目标图集的路径是否匹配),点击移除按钮就可以从目标图集中移除该精灵。
左键选中需要操作的精灵图集
资产,可以在 检查器面板 找到图集的精灵列表,找到要移除的精灵对象并点击移除按钮即可。
精灵
资产被加入精灵图集
后,可以在精灵图集
的 检查器面板 中快速操作精灵,他的属性会同步修改到精灵
资产中
设置名称 | 释义 |
---|---|
纹理最大宽度 | 打包得到纹理的最大限制宽度(1,2048] |
纹理最大高度 | 打包得到纹理的最大限制高度(1,2048] |
边缘填充 | 打包精灵的边缘填充宽度 |
允许旋转(未启用) | 是否通过旋转提高图集打包的空间利用率 |
空白裁减(未启用) | 是否通过空白裁减提高图集打包的空间利用率 |
若打包遇到如下警告,说明图集结果的尺寸超过了纹理最大宽度和最大高度,此时可通过调整纹理最大宽度
与纹理最大高度
或重新编排打包的散图解决。
属性 | 值 |
---|---|
循环模式 U(wrapModeU) | 截取模式(Clamp)、 重复模式(Repeat)、镜像重复模式(Mirror) |
循环模式 V(wrapModeV) | 截取模式(Clamp)、重复模式(Repeat)、 镜像重复模式(Mirror) |
过滤模式(filterMode) | 点过滤(Point)、双线性过滤(Bilinear)、 三线性过滤(Trilinear) |
各向异性过滤等级(anisoLevel) | 向向异性等级,1 ~ 16 |
纹理映射(Mipmap) | true , false |
点击精灵图集
资产,通过调整打包设置
的纹理最大宽度
与纹理最大高度
,同时调用打包对象
中的打包并预览
,可以保证图集利用率在一个较高的水平。
预览图中左侧表示导出图片的大小信息,右侧表示图集利用率信息(代表所有散图面积的和占用最终大图的面积百分比),可依据此值调整打包设置以达到较佳的结果。
Galacean 为精灵图集提供了命令行工具,开发者可以按照以下步骤生成图集:
npm i @galacean/tools-atlas -g
galacean-tool-atlas p inputPath -o outputName
其中 inputPath
表示需要打包的文件夹路径,而 outputName
则表示打包输出的精灵图集文件名,如果你得到下图所示结果,那么说明打包成功了。
属性 | 解释 |
---|---|
f/format | 打包输出的精灵图集格式 (默认: "galacean") |
o/output | 打包输出的精灵图集文件名 (默认: "galacean") |
a/algorithm | 打包精灵图集的算法 (默认: "maxrects") |
ar/allowRotate | 打包精灵图集是否支持旋转 (默认: false) |
p/padding | 图集中每个精灵和这个精灵边框的距离 (默认: 1) |
mw/maxWidth | 最后打包出的精灵图集的最大宽度 (默认: 1024) |
mh/maxHeight | 最后打包出的精灵图集的最大高度 (默认: 1024) |
s/square | 强制打包成正方形 (默认: false) |
pot | 宽高强制打包成 2 的幂 (默认: false) |
更多请参照图集打包工具。
上传图集图片和图集文件至 CDN 同一目录下,例如文件和图片的地址应分别为 https://*cdnDir*/*atlasName*.atlas
和 https://*cdnDir*/*atlasName*.png
。
加载与使用
engine.resourceManager
.load<SpriteAtlas>({
url: "https://*cdnDir*/*atlasName*.atlas",
type: AssetType.SpriteAtlas
})
.then((atlas) => {
// Get all sprites.
const allSprites = atlas.sprites;
// Get sprite by spriteName.
atlas.getSprite("spriteName");
// If multiple sprites have the same name, we can get all like this.
const allSpritesWithSameName = atlas.getSprites("spriteName", []);
});