Import a pixel art JSON sprite sheet into Unreal Engine 5 Paper2D, with flipbooks

To import a JSON sprite sheet (name.png with a TexturePacker-style name.atlas.json) into Unreal Engine 5 Paper2D, import the JSON with Paper2D's own sprite sheet importer, then give each Flipbook a frame rate of 1000 ÷ the largest step that divides every frame's milliseconds, with each key frame running its time ÷ that step. On 7 November 2026 in Unreal Engine 5.8.4, our free 157-line script did both for seven Pixelbolt sheets (235 frames, 26 animations): each stored texture matched its sheet pixel for pixel, every sprite got its frame's rectangle, trim and pivot, and every flipbook kept its frame times (method, script and data below).

We make Pixelbolt, a free, MIT-licensed pixel art toolkit for game makers and AI agents. This guide is about getting its sprite sheets into Unreal; Paper2D's importer also reads JSON sheets from TexturePacker and Adobe Flash, but the script expects a Pixelbolt atlas.

Pixelbolt 0.12.1 · Unreal Engine 5.8.4 (Windows) · Published 7 November 2026 · Last checked 7 November 2026 · On this page: Five steps · What Paper2D did · Frame times · Without the script · When to use something else · How we tested

Pixel art hero walking, eight frames of 80 msThe hero's sprite sheet: 36 frames of 32 by 36 pixels
The hero preset from Pixelbolt, one of the seven test sheets: 36 frames of 32 × 36 pixels and six animations. Shown at 4× and 2×.

Five steps

  1. Make the sheet and its atlas. With Node.js 20 or newer:
    npx -y pixelbolt@0.12.1 compile --preset hero --out hero.json
    npx -y pixelbolt@0.12.1 render hero.json --out C:/pixelbolt/hero
    compile turns one of Pixelbolt's shipped presets (here the hero) into a recipe; skip it for a recipe of your own. render writes a new folder holding hero.png and hero.atlas.json, among other files. In the browser instead, the playground's Atlas PNG + JSON button saves the same two files; it renders on Pixelbolt 0.9.2, and a 0.9.2 campfire, rendered from the command line, passed the same test.
  2. Download pixelbolt_paper2d.py into C:/pixelbolt, or any folder whose path has no spaces.
  3. Turn on two plugins. In Unreal, Edit → Plugins: Paper2D (on by default) and Python Editor Script Plugin (off by default, marked Beta). Restart the editor when it asks.
  4. Run the script. Open Window → Output Log, choose Cmd beside its command box, and type:
    py C:/pixelbolt/pixelbolt_paper2d.py C:/pixelbolt/hero/hero.atlas.json /Game/Sprites/Hero
    The last part is the Content Browser folder (default /Game/Pixelbolt/<name>); give each import a folder of its own, since the script stops, changing nothing, if the folder already holds assets. For the hero it took under a second in our test and left Textures/hero, the Sprite Sheet hero_atlas, one Sprite per frame in Frames/ and one Flipbook per animation in Flipbooks/, such as hero_walk, all saved. It also sets the texture's Mip Gen Settings to NoMipmaps (see below).
  5. Use the flipbooks. Drag one into the level, which places it as a Paper Flipbook Actor (the editor's "Animated Sprite"), or set it on a Paper Flipbook Component. The component loops by default and has no looping checkbox, so for an animation Pixelbolt marks as playing once (the hero's jump, attack and hurt, which the script lists), call Set Looping with it unticked in a Blueprint, then Play From Start. (From Paper2D's 5.8.4 source; we did not place or play a flipbook.)

The Output Log shows two warnings per import: AssetTools' Two factories registered with same priority (Paper2D's import and re-import factories) and Paper2D's Unexpected 'app' named 'Pixelbolt' … Parsing will continue. By Paper2D's source, the second appears for a sheet whose meta.app doesn't start with Adobe Flash's or TexturePacker's name (one with no meta.app or meta.image is refused). In our test every field Paper2D reads (rectangle, trim, untrimmed size, pivot) came through right. It ignores Pixelbolt's frame times and animations, which is what the script is for.

What Paper2D did with the seven sheets

We ran the test twice, in a project with Unreal's default plugins and in one with every engine plugin off but Paper2D and Python. Both gave these results.

SheetFramesFlipbooksTexture pixelsPivotMaterial
Forest spirit, 24 × 24, frames of 100 to 240 ms63identicalcanvas centre (no anchor)translucent
Forest spirit, trimmed, at 2×63identicalcanvas centre, trims kepttranslucent
Campfire, 32 × 48, frames of 70 ms241identicalcanvas centremasked
Hero, 32 × 36, frames of 80 and 200 ms366identicaleach frame's anchormasked
Fire spells, 64 × 64, frames of 40 to 100 ms10711identicalthe anchor, (32, 40)masked
Explosion, 64 × 64 on a 512 × 256 sheet, frames of 60 ms321identicalcanvas centremasked
Campfire rendered by Pixelbolt 0.9.2241identicalcanvas centremasked

Our test ran without a GPU, so we checked these settings, not a frame drawn on screen.

Frame times

Pixelbolt gives every frame its own time in whole milliseconds. A Paper2D Flipbook has one Frames Per Second and shows each key frame for a whole number of frames, its frame run (Epic's Paper 2D Flipbooks page). So the script picks, for each animation, the largest step that divides every frame time: the frame rate is 1000 ÷ that step, and each key frame runs its time ÷ the step. All 26 flipbooks came out at their animations' lengths (to within 0.01 ms, our check's tolerance, since Unreal stores the length as a float), and asked for the sprite at the middle of each frame, every flipbook returned that frame's sprite.

AnimationFrame times (ms)Frames per secondFrame runs
Hero walk8 × 8012.51 each
Campfire24 × 7014.28571 each
Explosion (plays once)32 × 6016.66671 each
Forest spirit idle240, 140, 220, 100, 220, 140, 1605012, 7, 11, 5, 11, 7, 8
Fire spells impact12 frames from 40 to 100 (676 in all)100040 to 100

Paper2D's 5.8.4 source clamps Frames Per Second to 1000, its highest value, so even a 41 ms frame keeps its exact time. Paper2D's own Create Flipbooks (right-click a Sprite Sheet) gives every frame a run of 1 at one frame rate, by the same source: fine for an evenly timed loop like the campfire once you set 14.2857 frames per second, but it flattens the forest spirit's or the spell's mixed times. It also groups sprites by the last number in their names (sprites with none go into one flipbook, in name order) and never reads the atlas's animations, so it can't rebuild the hero's or the forest spirit's.

Without the script

Drag hero.atlas.json (with hero.png beside it) into the Content Browser: Epic's Import sprites page describes the same import for TexturePacker's files, which makes a Sprite Sheet asset with Frames and Textures folders. The script imports through the editor's own import call with no importer named, so Unreal picks Paper2D's sprite sheet importer by the file's type and content; we tested that scripted import, not a drag. On a sheet whose sides are both powers of two, set the texture's Mip Gen Settings to NoMipmaps.

Then build each flipbook: select its sprites, right-click, Create Flipbook. It adds the sprites in alphabetical order (Epic's Paper 2D Flipbooks page), so in the Flipbook editor reorder the key frames to match the animation's frames list in the atlas, add any frame the animation repeats (the forest spirit's idle shows float twice), and set the frames per second and each frame run from the frame times, the atlas's duration in milliseconds.

When to use something else

How we tested

To repeat it: data/README.txt has the commands. The searches this page answers, and what ranked for them on 7 November 2026, are in searches-2026-11-07.txt.

Licence

Pixelbolt and pixelbolt_paper2d.py are free and open source under the MIT licence. The example recipes ship in Pixelbolt's MIT-licensed npm package, and its README says the included artwork is original and covered by the same licence. Unreal Engine and Paper2D are Epic Games' and come under Unreal Engine's own licence.

Pixel art to import

All guides · The playground · The gallery · All comparisons · Pixelbolt home