在设计sprite图形时,每个角色一个单独的纹理文件比较方便。然而,通常认为,sprite纹理中图形元素间的空白空间,会浪费运行时显示内存。为了优化性能,最好把多个sprite纹理紧密的打包到一起至一个地图集(atlas)。Unity提供了一个 Sprite Packer 工具从分散的sprite纹理里去自动化生成地图集。
Unity 处理生成工程并且在场景背后使用sprite地图集,这样用户不需要手动调整。地图集可以被选择性的打包在进入Play模式时,或者构建期间,并且一个sprite对象的图形可以从地图集一建立的时候就获得。
用户需要在Texture Importer里面指定一个Packing Tag,启动用此Sprite纹理的打包。
Sprite Paker默认是关闭的,但你可以从Editor设定里配置(菜单: Edit->Project Settings -> Editor)。sprite packing mode可选择 Disabled 或 Enable for Builds (比如打包只在构建而不是Play mode进行)或者 Alwas Enable (如在Play mode和构建的时候都启用)。
如果你打开Sprite Packer窗口(菜单:Windows->Sprite Pakcer)然后点击左上角的 Pack 按钮,你会看到打包到地图集里的纹理的布置。
如果你在Project面板选择一个sprite,它也会在地图集里被高亮显示。其轮廓正好是渲染网格的轮廓,并且它也定义了紧密打包所用的区域。
Sprite Pakcer窗口顶部的工具栏有一批控件影响打包和显示。 Pack 按钮初始化打包操作,但如果地图集从建立起都没有改变就不强制更新。(当你实现了一个自定义的打包策略,下面 Customizing the Sprite Packer 解释,一个相关的 Repack 按钮会显示)。 View Atlas 和 Page # 菜单支持选择哪一个地图集的哪一页显示在窗口里(单一的地图集会被切分到多个“page”,如果最大的纹理吃春里无法显示下所有的sprite)。页号码旁边的菜单选择哪个“打包策略”用于此atlas(参看下面)。在工具栏右边有两个控件放大缩小视图,并且在彩色和透明度显示之间切换。
Sprite Paker使用一个 pcaking policy 去决定如何在地图集中分配sprites。你可以建立自己的打包策略(下面说到),但Defalut Packer Policy, Tight Packer Policy 和 Tight Rotate Enabled Sprite Packer Policy 选项常常是可以用的。在这些策略以内,在 Texture Importer 的 Packing Tag 直接选择sprite要打包进的地图集的名字,并且所有带同一个packing Tag的sprite都被被打包到同一个地图集中。地图集之后会根据纹理导入配置排序,以便他们为源纹理配合用户设置的东西。如果可能,带有同样纹理压缩配置的Sprite会被分组到同一个地图集。
虽然 DefaultPackerPolicy 选项能满足大多数的需求,但你还是可以在需要的时候实现自定义的打包策略。要做到这点,你需要在一个编辑器脚本里,实现UnityEditor.Sprites.IPackerPolicy接口。这个接口需要实现以下方法:
DefaultPackerPolicy默认使用矩形打包(参看SpritePackingMode)。如果你在用纹理空间效果或者想使用一个不同的网格去渲染Sprite,那么会非常有用。自定义策略可以覆盖这个并且代替使用紧密打包。