Toolkitly

如何在 Unity 中导入并切割精灵图

Unity 内置的切图器是所有引擎里最好的——不用告诉它网格, 它能靠透明度自己找出帧。它不做的事是: 当某个导入默认值正在悄悄毁掉你的美术时,它不会提醒你。 而这样的默认值,在 Sprite Editor 按钮上方的那块面板里有四个。

1. Sprite Mode 选 Multiple,别的都在这之后

把 PNG 放进 Assets/ 并选中它。在 Inspector 里,Texture Type 必须是 Sprite (2D and UI)。 用 2D 模板建的项目会替你设好;用 3D 模板建的项目会把 PNG 当普通贴图导入, 这就是为什么那张图拖不进场景,而且教程从某一步开始全对不上了。

然后 Sprite ModeMultiple。 这就是「一个碰巧长得像一格格角色的精灵」和「一个装着子精灵的容器」之间的全部区别。 留在 Single 上,Sprite Editor 能打开,但没有东西可切, 那些帧也永远不会作为独立资源出现。

Apply。你不按,导入面板什么都不会提交, 而「改了五个设置、打开 Sprite Editor、纳闷为什么一个都没生效」是很容易发生的事。

如果连 Sprite Editor 按钮都没有,那是 2D Sprite 包没装——Window → Package Manager → Unity Registry。 它随 2D 模板一起提供,但不总是随其他模板提供。

2. 决定像素画生死的四个设置

Unity 的默认值是为 3D 游戏里的照片类贴图调的。 对一个 32×32 的精灵来说,它们每一个都是错的,而且没有一个会自己吭声。

Filter Mode

Bilinear Point (no filter)

模糊的来源。只要精灵不是按 1:1 绘制,Bilinear 就会把相邻的纹素平均起来, 而对像素画来说「不是 1:1」是常态。Point 采最近的那个纹素,不碰你的美术。

Compression

Normal Quality None

块压缩(DXT / ETC / ASTC)会以 4×4 为单位量化颜色。 在照片上你看不出来。在带硬边界的平涂色块上——像素画、UI、线稿—— 它会沿着每一条边产生斑驳的杂色。

Max Size

2048 高于这张图最长的一边

最阴的一个。一张 4096px 的图在导入时会被悄悄重采样到 2048。 一切照常工作,只是美术分辨率只剩一半、发虚,而控制台里一个字都没提。 只要一张图在 Unity 里看着比在美术软件里差,就先查这个。

Pixels Per Unit

100 你精灵的原始尺寸

这不是质量设置,是比例设置。100 意味着 100 个纹素等于一个世界单位, 于是一个 16px 的地块是六分之一单位,你游戏里的每个数字都别扭。 把它设成地块尺寸(16、32、48),一个单位就是一个地块。 具体取多少,远不如「到处都用同一个值」重要。

还有两个值得知道。Mesh Type 默认是 Tight, 它会生成一个贴着不透明像素的网格;这能省 overdraw, 偶尔也会切掉一个杂散像素,而且用了 sliced 或 filled 模式的 UI Image 反正要求 Full RectGenerate Physics Shape 默认开着, 它会在每一张图的每一帧上都花掉导入时间—— 除非你真的在用精灵生成碰撞体,否则关掉它。

3. 在 Sprite Editor 里切开它

Sprite EditorSlice 下拉在左上角, 它的 Type 字段提供三种描述这张图的方式:

Automatic

帧大小不一,或者你不知道网格是多少

找出不透明像素连成的独立区域,给每一块套一个框。 确实好用,而且少见——Godot 没有对应的东西。它同时也是一种猜测:见下面的注意点。

Grid by Cell Size

你知道每帧是 32×32

填一个格子的像素尺寸,再加上 Offset 和 Padding, 给那些带外边距或者帧间有空隙的图用。

Grid by Cell Count

你知道它是 8 列 4 行

填列数和行数,Unity 来除。 只有整图尺寸能整除时才正确—— 多出一列杂散像素的图会让每一帧都偏那么一点。

在网格模式下,Keep Empty Rects 决定行尾没用到的格子会不会变成空精灵。 除非你要按绝对位置索引帧,否则关着。

Slice,然后按 Sprite Editor 自己右上角的 Apply。不按就关窗口,一切都会丢掉。

对一张已经有矩形的图重新切图,会多出一个 Method 下拉:Delete Existing 清空重来,Smart 尽量保留仍然说得通的矩形并调整其余的,Safe 只添加新的、绝不碰已有的。 默认选 Smart 或 Safe—— Delete Existing 正是动画片段最后指向一堆已经不存在的精灵的原因。

4. 现在就把轴心点设好,别等做完十段动画

轴心点是精灵的原点:落在 transform 位置上的那个点。 它默认是 Center,而对角色来说那几乎从来不是你想要的——Bottom 把原点放在脚下, 于是「把角色放到地面上」就等于把 y 设成地面的 y, 而攻击动画里更高的那一帧会往上长,而不是陷进地板里。

在 Slice 下拉里设它,这样每一帧都一次设好。 单独的帧可以在 Sprite Editor 里选中后覆盖, 自定义轴心点用归一化坐标指定——0,0 是左下,1,1 是右上。

轴心点不一致,正是那个经典的「角色走路时抖」的成因。 动画本身没有任何问题;只是第 3 帧的原点偏了一个像素, 于是整个精灵跳了一下。自动切图通常是元凶, 因为它给每一个矩形贴合的是那一帧自己的像素, 手臂甩得更开的那一帧就会得到一个更宽的框。

5. 把帧变成一段动画

在 Project 窗口里点开这张贴图的折叠箭头——子精灵就在里面。按顺序选中某一段动画的帧,拖进 Scene 视图, Unity 会一口气建出一个 GameObject、一个 Animator Controller 和一个动画片段,并提示你起个文件名。

拖到一个已经有 Animator 的 GameObject 上, 则是加一个片段,而不是把整套再建一遍—— 这正是你为同一个角色做第二段、第三段动画时想要的。

然后把速度改对。生成出来的片段带着一个和你的美术毫无关系的采样率, 而像素画动画通常想要 8–12 fps。这个字段是 Animation 窗口里的 Samples——而在当前的 Unity 版本里, 它默认是藏起来的,要先在那个窗口的齿轮菜单里打开 Show Sample Rate。 这就是为什么不少人断定这个字段被删了, 转而去 Animator 状态上找速度倍率。

在进编辑器之前先把帧率定下来,能省掉这一趟来回。精灵动画预览器能在浏览器里以任意 FPS 播放这张图, 你可以先找到那个读起来对的数字,然后只填一次。

6. 用 Pixel Perfect Camera 止住抖动

Point 过滤保住的是贴图的锐利。 它对「摄像机以小数倍渲染世界」这件事毫无办法, 而那会让有些像素占两个屏幕像素宽、旁边的占三个—— 精灵一动就爬、就闪,而且动起来比任何静态截图看上去都糟。

给你的摄像机加上 Pixel Perfect Camera 组件 (属于 2D Pixel Perfect 包,随 URP 的 2D 渲染器一起提供)。 把 Assets Pixels Per Unit 设成和导入设置里一样的数——这里对不上,前面做的一切就白费了—— 再设一个和你预期的内部分辨率相符的 Reference Resolution, 比如 320×180 或 640×360。

Upscale Render Texture 会把游戏渲染到一个参考分辨率的离屏目标上,再整块放大, 这能彻底消除亚像素移动; 它同时也意味着平滑的摄像机运动会变成一格一格的, 有的游戏想要这个,有的不想。Pixel Snapping 是更轻的选项: 精灵吸附到网格上,摄像机自由移动。

如果你接手的美术本来就被放大过——一个 16×16 的精灵存成了 64×64—— 在把它还原回原始分辨率之前,上面这些都帮不上忙, 因为 Unity 现在缩放的是一张已经被缩放过的图。像素画缩放工具能识别出倍数并把它撤销。

7. 什么时候还是该在 Unity 外面切

Unity 的切图器足够好,所以这份清单比其他引擎的要短。 但它仍然有三个真实的限制。

自动切图是在猜,而且在边界上猜得不好。两个像素挨在一起的帧会变成一个矩形。 带分离元素的帧——一道剑光、一团尘、一顶飘起来的帽子——会变成两个。 这两种情况都不会被报告;你是在动画不对的时候才发现的。 图上有这些东西时,精灵图切割工具能给你同样的识别,外加一个由你控制的合并距离、一个网格模式, 以及在你定下来之前逐帧可见的结果。

子精灵不是文件。它们存在于贴图资源内部。 一旦 Unity 之外的什么东西需要其中一帧——商店页、一个图标、 一份 UI 草稿、一份 bug 报告、另一个引擎上的第二个项目—— 你手上没有东西可以交出去。 单张 PNG 的可移植性,是切好的矩形没有的。

重新切图会弄坏动画片段。Delete Existing 切图会重建那些子资源, 引用旧资源的动画片段可能就指向了空—— 美术发来一张更新过的图之后,原本好好的动画突然渲染成空白。 原地替换的单张 PNG 文件永远不会有这种失败模式, 这也是为什么有些团队即便 Unity 能切,也仍然把帧当文件保存。

至于最常见的情况——你自己美术软件导出的一张干净网格—— 在 Unity 里切就好了,上面这些统统不用管。

常见故障

Game 视图里像素画是糊的

Filter Mode 还是 Bilinear。设成 Point (no filter) 并按 Apply—— 你不按,Inspector 就不提交。

这张图在 Unity 里比在美术软件里更虚

Max Size。超过 2048px 的图会在导入时被缩小,而且没有任何警告。

精灵边缘有彩色斑点

压缩开着。设成 None。这一条常被误当成过滤问题, 因为它看上去也像轮廓上的毛边。

Sprite Editor 里没有东西可切

Sprite Mode 是 Single。打开编辑器之前先切到 Multiple 并 Apply。

根本没有 Sprite Editor 按钮

2D Sprite 包没装。Package Manager → Unity Registry → 2D Sprite。

角色走路时抖或者跳

帧之间轴心点不一致——通常是自动切图把每个矩形贴合到了各自的像素上。 在 Slice 下拉里设一个统一的轴心点,或者改用网格切。

动画播得太快了

是片段的采样率。在 Animation 窗口里改 Samples; 如果看不到这个字段,先在它的齿轮菜单里打开 Show Sample Rate。

原本正常的动画渲染成了空白

这张图被用 Delete Existing 重新切过,片段指向的精灵已经不存在了。 用 Smart 或 Safe 重切,或者在片段里重新指定那些帧。

摄像机一动精灵就闪

渲染比例是小数。加一个 Pixel Perfect Camera, 并让它的 Assets Pixels Per Unit 和导入设置对上。

这里用到的工具