If you're making pixel art for Unity, Aseprite is almost certainly your tool. What's less obvious is that 90% of the friction in the pipeline isn't drawing or animating — it's getting frames from one program into the other without losing tag metadata, slice information, or your own sanity. Here's the setup we landed on at ArcadeOn after enough trial and error to fill a postmortem.
Use tags, not separate files
Aseprite's animation tags let you label frame ranges — idle, walk, attack, death — inside a single sprite file. The instinct of a Unity dev coming from older workflows is to make one file per animation and import each separately. Don't. Keep every animation for one character in one file, tagged. The tags survive export and Unity's Aseprite importer turns each tag into a separate animation clip with the right frame range, automatically.
The benefits compound. Palette changes propagate. Onion-skinning across animation boundaries works. And the character's "soul" — the small choices that make it feel cohesive — lives in one place instead of being scattered across twelve files.
Slices for hit-boxes and pivots
The bit nobody mentions in tutorials: Aseprite slices export as metadata Unity's importer can read. We use them for two things, both vital.
First, per-frame pivots. Default Unity pivots are static — the centre, or a corner. Anyone who's animated a side-on running character knows the pivot wants to shift slightly between contact frames so the sprite doesn't appear to slide. Add a one-pixel slice called pivot on each frame in Aseprite; the importer respects it. Free, lossless, far less hassle than scripting the offset in Unity.
Second, collision boxes. A slice named hitbox_swing on the three attack-active frames gives you a clean rectangle the gameplay code can read at runtime. We don't bother with per-pixel collision for indie 2D — slice rectangles are good enough and your designers can edit them inside the sprite, which is where they belong.
One import preset, version-controlled
The single biggest time-saver: an Aseprite Importer preset committed to the project. Settings we set once and forget:
- Pixels Per Unit: matched to the world grid (16 for tile-based, 32 if your character is larger than two tiles).
- Filter Mode: Point. Pixel art with bilinear filtering is a war crime.
- Compression: None. Pixel art compresses to nothing already, and DXT artefacts on a 32×32 sprite are visible.
- Generate Mip Maps: Off. You're not viewing the sprite at distance.
- Mesh Type: Tight, with a sane alpha cutoff. Reduces overdraw on big alpha-heavy sprites.
Save these as a preset (right-click the importer in the inspector), commit it to source control, and apply it on any new Aseprite asset. The team stops arguing about whether this sprite looks blurry because someone forgot Point filtering — because nobody forgets when the preset does it for you.
The Animator question
Once tags become clips, you have a choice: Unity's Animator state machine, or your own animation playback. We use the state machine for cutscenes and bosses (where transitions are choreographed) and a thirty-line custom SpriteAnimator for the player and rank-and-file enemies (where transitions are dictated by gameplay state and the Animator's editor is overkill).
The custom animator is mostly just SetCurrent(clipName), a frame index, a timer, and a flag for whether to loop. It plays the imported clips natively. No transition graph, no parameter triggers, no surprise frame jumps when you forget to set Exit Time. For a fast-paced 2D game you'll be glad you wrote it.
Two gotchas to know about
The Unity Aseprite importer rebuilds on save, which means saving an Aseprite file with the project open will trigger a re-import in the editor. On a large character (sixteen tags, eighty frames) this is a noticeable pause. Save sparingly while iterating; commit when you're happy.
And: Aseprite's "Export Sprite Sheet" is a separate flow from the file-based import. The importer wants the .aseprite source. If you've been exporting to PNG manually, stop — you're throwing away the metadata that makes this whole pipeline work.
That's it
Three choices, one preset, and the friction goes away. Most of the polish in your game's art will come from time spent inside Aseprite, not from time spent fighting Unity. This pipeline gets you back to that, fast.