我是叙事游戏的技术人员,游戏中包含大量手绘美术资源。最近我在深入学习精灵图集(Sprite Atlases)的相关知识,发现它的实际作用远超我最初的预期,因此想分享一些心得,或许能帮到其他人。虽然可能有些地方我了解得不够全面或存在误解,但还是希望这篇内容能为需要的人提供参考。如果有错误或补充,欢迎指正!

简单来说,精灵图集能将游戏中的精灵整合成紧凑且优化过的纹理贴图。网上多数教程主要强调它能减少绘制调用(draw calls)——因为多个精灵可共享同一纹理,并在特定条件下合并渲染。此外,它还能有效降低构建包体积!这其实正是我们使用它的主要原因,因为绘制调用对我们来说并非瓶颈。只需设定最大纹理尺寸,并提供需要打包的精灵列表,系统就会尽可能高效地排列它们;若空间不足,则会自动生成额外的"页面"。

允许旋转(Allow Rotation):可使精灵在90度倍数角度内旋转以优化排列。紧密打包(Tight Packing):根据精灵轮廓而非完整矩形边界进行打包。重要提示:UI画布图像也可以放入图集,但务必确保它们被打包进未启用以上两个设置的图集中,否则会出现这种情况:

(此处插入GIF示例)

现在来看构建包体积的问题。由于使用了大量手绘美术,我们一直处理着众多高分辨率资源。近期出于多方考量,我们将角色从ToonBoom动画插件切换为完整精灵表,导致文件体积急剧膨胀——仅一小时的Demo就超过了6GB。经过研究,我发现精灵图集对此大有帮助。当精灵被打包进图集后,Unity的压缩算法能更高效地运作,因为它是对单一整合纹理(而非多个独立纹理)进行压缩。有趣的是,我甚至发现即便将单个大型精灵放入独立图集页面,即使压缩格式相同,也能起到效果。

(此处插入对比图)

关于这点背后的具体原理,我尚未完全参透,期待有更了解Unity纹理压缩的朋友能指点迷津。

就我们的项目而言,几乎找不到理由不将大多数精灵打包进图集,但确实存在例外:某个角色的精灵因使用了与图集不兼容的着色器而未被纳入。此外,我曾尝试将上一款游戏的所有精灵放入图集,结果文件体积反而增大了,但当时有更紧迫的任务待处理,未深究原因。

如我所说,关于如何最优使用精灵图集、Unity底层如何处理它们,我必然还有很多未知。期待更懂行的朋友分享见解。但如果你正在制作一款包含海量精灵的2D游戏,那么花一个下午研究图集绝对值得。