Engine support

One sheet.Every engine.

The export that fits your engine, and the exact settings on the other side. Pick yours, or read the full import guide.

Frame data included
Metadata export

These engines read a frame data file, so the export carries the exact rectangles and nothing depends on retyping a grid.

Slice in-engine
Grid workflow

These engines slice the image themselves. The export is a uniform PNG, and you hand the engine the cell size and gutter it asks for.

Side by side

What each engine reads, and what bites

The export on the left, the field you type into on the right, and the mistake that costs the most time in each one.

EngineYou exportImport pathWhere it goes wrong
UnityUniform PNG gridGrid By Cell SizeThe Padding field in the Sprite Editor is the gutter you exported, and leaving it at 0 drifts every column.
GodotSpriteFrames resourceAnimatedSprite2DThe .tres points at the PNG by name from res://, so moving one file without the other breaks the resource.
PhaserJSON atlasthis.load.atlas(key, png, json)The frame names in the atlas are zero-padded to three digits, so generateFrameNames needs zeroPad set to 3.
PixiJSJSON atlasawait Assets.load("sheet.json")animationSpeed is a fraction of the ticker rate, so 12 frames per second is 0.2 and not 12.
GameMakerUniform PNG strip or gridSprite editor > Import Strip ImageSeparation in the strip importer is the gap between cells, not the distance from one cell start to the next.
Construct 3Uniform PNG strip, zero gutterImport frames > From sprite stripThe strip importer has no padding field, so any exported gutter becomes a visible border on every frame.
DefoldUniform PNG gridTile Source (.tilesource)Inner Padding is the gutter around each tile, so a two pixel gap between frames is one pixel per side.
TiledJSON tilesetJSON tileset (.tsj)The .tsj records the image size and tile count, so re-exporting a sheet with different dimensions invalidates it.
FNF & SparrowSparrow TextureAtlasSparrow TextureAtlas (.xml)Sparrow groups frames by name prefix, and prefixes are case sensitive, so singLEFT and singleft are two animations.
Same thing, different name

The vocabulary engines disagree on

Ten terms that appear in almost every import dialog under a different label. Knowing which is which turns most import problems into a one-field fix.

Atlas

A data file listing every frame rectangle in a sheet by name. An engine that reads an atlas needs no grid, because each frame carries its own coordinates. TexturePacker JSON, Sparrow XML, Godot SpriteFrames, and a Tiled tileset are all atlases with different syntax around the same numbers.

Cell size and pitch

Cell size is one frame. Pitch is cell size plus the gutter, which is the distance from the start of one cell to the start of the next. Import dialogs disagree about which one they want, and typing the pitch where the cell size belongs is the most common cause of frames drifting across a row.

Gutter, margin, separation

Three names for the empty space between cells. Unity calls it Padding, GameMaker calls it separation, Defold calls it inner padding, Tiled calls it spacing. Whatever the label, the value has to match what the sheet was exported with, or every frame after the first is offset.

Bleeding and extrusion

When a sprite is drawn at a fractional size or position, the sampler reads slightly outside the frame and picks up the neighbour. Extrusion duplicates each frame edge pixel outward so the sampler finds more of the same colour. Some engines add it automatically at build time, which is why a zero gutter is safe in them.

Trimming

Cropping the transparent margin off a frame so the rectangle is only as large as the art. It saves texture space and destroys alignment unless the atlas also records the original size and the offset of the crop. Grid workflows cannot trim, because a grid needs every cell to be identical.

Pivot and origin

The point a sprite is positioned, rotated, and scaled around. Most engines default to the centre of the frame, which is wrong for a character that should stand on the ground and be placed by its feet. It is a per-sprite setting in every engine here, and it is worth setting at import rather than compensating in code.

Nearest versus linear filtering

Linear filtering blends neighbouring pixels, which suits photographs and destroys pixel art. Nearest, also called point, picks the closest pixel and keeps edges hard. Every engine on this page defaults to linear, so this is the single setting most likely to make a correct sheet look wrong.

Texture page and batching

GPUs draw fastest when many sprites share one bound texture. Engines therefore repack art onto large pages at build time. It means how tightly you pack matters less than you would think, and what matters instead is that related sprites end up on the same page.

Frame rate versus frame duration

A sheet has no timing in it. Some engines take one frame rate for a whole animation, others store a duration per frame, and a few take a total length. Uniform rates are easier to set and per-frame durations animate better, because good animation holds on its extremes.

Frame naming

Atlas formats address frames by name, so the naming scheme is part of the contract. Zero padded indices sort correctly as text, which is why frame_007 is safe and frame_7 is not. Sparrow goes further and derives the animation name from the frame name prefix.

True everywhere

Three settings, every engine

Filtering off

Point, nearest, or no filter. Every engine defaults to linear, which is right for photos and wrong for pixels.

Exact frame size

Cell width, cell height, and gutter. One pixel off and every frame after the first drifts sideways.

Pivot and padding

Set the origin once per sprite, and pad the sheet so neighbouring frames never bleed into each other.

Ship the sheet.

Pack it, preview it, export the format your engine reads.