Toolkitly

How to import and slice a sprite sheet in Unity

Unity has the best built-in sheet slicer of any engine — it will find frames by transparency without being told a grid. What it does not do is warn you when an import default is quietly destroying the art, and there are four of those in the panel above the Sprite Editor button.

1. Sprite Mode: Multiple, before anything else

Drop the PNG into Assets/ and select it. In the Inspector, Texture Type has to be Sprite (2D and UI). A project made from the 2D template does this for you; one made from the 3D template imports PNGs as plain textures, which is why the sheet cannot be dragged into the scene and every tutorial step stops matching.

Then Sprite ModeMultiple. This is the whole difference between "one sprite that happens to be a grid of characters" and "a container of sub-sprites". Left on Single, the Sprite Editor opens but has nothing to slice, and the frames never appear as separate assets.

Press Apply. The import panel does not commit anything until you do, and it is easy to change five settings, open the Sprite Editor and wonder why none of them took.

If the Sprite Editor button is missing entirely, the 2D Sprite package is not installed — Window → Package Manager → Unity Registry. It ships with the 2D templates and not always with the others.

2. The four settings that decide whether pixel art survives

Unity's defaults are tuned for photographic textures in a 3D game. Every one of them is wrong for a 32×32 sprite, and none of them announce themselves.

Filter Mode

Bilinear Point (no filter)

The blur. Bilinear averages neighbouring texels whenever the sprite is drawn at anything other than 1:1, which for pixel art is always. Point samples the nearest texel and leaves the art alone.

Compression

Normal Quality None

Block compression (DXT / ETC / ASTC) quantises colours in 4×4 blocks. On a photograph you cannot see it. On flat colour with hard boundaries — pixel art, UI, line art — it produces speckled fringes along every edge.

Max Size

2048 Above the sheet's largest side

The sneakiest one. A 4096px sheet is silently resampled down to 2048 on import. Everything still works, the art is just half resolution and soft, and nothing in the console mentions it. Check this whenever a sheet looks worse in Unity than in your art tool.

Pixels Per Unit

100 Your sprite's native size

Not a quality setting — a scale one. 100 means 100 texels make one world unit, so a 16px tile is a sixth of a unit and every number in your game is awkward. Set it to the tile size (16, 32, 48) so one unit is one tile. The exact value matters far less than using the same one everywhere.

Two more worth knowing. Mesh Type defaults to Tight, which generates a mesh hugging the opaque pixels; it saves overdraw and occasionally clips a stray pixel, and UI Images that use sliced or filled modes require Full Rect anyway. Generate Physics Shape is on by default and costs import time on every frame of every sheet — turn it off unless you are actually generating colliders from sprites.

3. Slice it in the Sprite Editor

Click Sprite Editor. The Slice dropdown is top-left, and its Type field offers three ways to describe the sheet:

Automatic

Frames of different sizes, or you do not know the grid

Finds islands of non-transparent pixels and boxes each one. Genuinely good, and unusual — Godot has nothing equivalent. It is also a guess: see the caveats below.

Grid by Cell Size

You know the frame is 32×32

Pixel dimensions of one cell, plus Offset and Padding for sheets with margins or gaps between frames.

Grid by Cell Count

You know it is 8 columns by 4 rows

Column and row counts; Unity divides the sheet. Only correct if the sheet dimensions divide evenly — a sheet with a stray pixel column will put every frame slightly off.

In the grid modes, Keep Empty Rects decides whether unused cells at the end of a row become empty sprites. Leave it off unless you are indexing frames by absolute position.

Press Slice, then Apply in the Sprite Editor's own top-right corner. Closing the window without applying discards everything.

Re-slicing a sheet that already has rects adds a Method dropdown: Delete Existing wipes and redoes, Smart tries to keep rects that still make sense and adjust the rest, Safe only adds new ones and never touches what is there. Reach for Smart or Safe by default — Delete Existing is how animation clips end up pointing at sprites that no longer exist.

4. Set the pivot now, not after you have built ten animations

The pivot is the sprite's origin: the point that sits at the transform's position. It defaults to Center, and for a character that is almost never what you want — Bottom puts the origin at the feet, so placing the character on the ground is setting y to the ground's y, and a taller frame in the attack animation grows upward instead of sinking into the floor.

Set it in the Slice dropdown so every frame gets it at once. Individual frames can be overridden by selecting them in the Sprite Editor, and a Custom pivot is specified in normalised coordinates — 0,0 is bottom-left, 1,1 is top-right.

Inconsistent pivots are the cause of the classic "the character jitters while walking" bug. Nothing is wrong with the animation; frame 3 just has its origin a pixel off, so the whole sprite hops. Automatic slicing is the usual culprit, because it fits each rect to that frame's own pixels and a frame where the arm swings wider gets a wider box.

5. Turn the frames into an animation

Expand the texture's foldout arrow in the Project window — the sub-sprites are in there. Select the frames of one animation in order, drag them into the Scene view, and Unity creates a GameObject, an Animator Controller and an Animation Clip in one go, prompting for a filename.

Dragging onto an existing GameObject that already has an Animator adds a clip instead of creating everything again, which is what you want for the second and third animations of the same character.

Then fix the speed. The generated clip has a sample rate that has nothing to do with your art, and pixel art animation usually wants 8–12 fps. The field is Samples in the Animation window — and in current Unity versions it is hidden until you turn on Show Sample Rate in that window's gear menu, which is why plenty of people conclude the field was removed and go looking for a speed multiplier on the Animator state instead.

Deciding the rate before you are in the editor saves the round trip. The Sprite Animation Previewer plays a sheet back at any FPS in the browser, so you can find the number that reads right and then type it once.

6. Stop the shimmer with a Pixel Perfect Camera

Point filtering keeps the texture sharp. It does nothing about the camera rendering the world at a fractional scale, which makes some pixels two screen pixels wide and their neighbours three — the sprite crawls and shimmers as it moves, and it is worse in motion than any still screenshot suggests.

Add the Pixel Perfect Camera component to your camera (part of the 2D Pixel Perfect package, bundled with URP's 2D renderer). Set Assets Pixels Per Unit to the same number you used in the import settings — a mismatch here undoes the whole point — and a Reference Resolution matching your intended internal resolution, such as 320×180 or 640×360.

Upscale Render Texture renders the game to an offscreen target at the reference resolution and scales that up as a block, which removes sub-pixel movement entirely; it also means smooth camera motion becomes stepped, which some games want and some do not. Pixel Snapping is the lighter option: sprites snap to a grid, the camera moves freely.

If the art you inherited was already upscaled — a 16×16 sprite saved at 64×64 — none of this helps until it is back at native resolution, because Unity is now scaling an already-scaled image. The Pixel Art Resizer detects the factor and reverses it.

7. When to cut the sheet outside Unity anyway

Unity's slicer is good enough that this is a narrower list than for other engines. It still has three real limits.

Automatic slicing guesses, and guesses badly at the edges. Two frames whose pixels touch become one rect. A frame with a detached element — a sword glint, a dust puff, a floating hat — becomes two. Neither is reported; you find out when the animation is wrong. On a sheet with these, the Sprite Sheet Cutter gives you the same detection with a merge distance you control, plus a grid mode and a visible per-frame result before you commit.

Sub-sprites are not files. They exist inside the texture asset. The moment something outside Unity needs one frame — a store page, an icon, a UI mockup, a bug report, a second project on a different engine — there is nothing to hand over. Individual PNGs are portable in a way sliced rects are not.

Re-slicing can break clips. Slicing with Delete Existing recreates the sub-assets, and animation clips referencing the old ones can end up pointing at nothing — a working animation that suddenly renders blank after the artist sent an updated sheet. Individual PNG files replaced in place never have this failure mode, which is a reason some teams keep frames as files even though Unity could slice them.

For the common case — a clean grid from your own art tool — slice it in Unity and ignore all of this.

Common problems

Pixel art is blurry in the Game view

Filter Mode is still Bilinear. Set it to Point (no filter) and press Apply — the Inspector does not commit until you do.

The sheet looks softer in Unity than in the art tool

Max Size. A sheet larger than 2048px is downscaled on import without any warning.

Coloured speckles along sprite edges

Compression is on. Set it to None. This one is often mistaken for a filtering problem because it also looks like fuzz on the outline.

The Sprite Editor has nothing to slice

Sprite Mode is Single. Switch it to Multiple and Apply before opening the editor.

No Sprite Editor button at all

The 2D Sprite package is not installed. Package Manager → Unity Registry → 2D Sprite.

The character jitters or hops while walking

Inconsistent pivots between frames — usually automatic slicing fitting each rect to its own pixels. Set a uniform pivot in the Slice dropdown, or slice by grid.

The animation plays far too fast

The clip's sample rate. Change Samples in the Animation window; enable Show Sample Rate in its gear menu if the field is not visible.

A previously working animation renders blank

The sheet was re-sliced with Delete Existing and the clip points at sprites that no longer exist. Re-slice with Smart or Safe, or re-assign the frames in the clip.

Sprites shimmer while the camera moves

Fractional rendering scale. Add a Pixel Perfect Camera and match its Assets Pixels Per Unit to the import setting.

Tools used here