You draw a grass tile. You draw a dirt tile. Then you try to put a dirt path on the grass and realize the two tiles do not meet: you also need every edge, every inner corner, every outer corner, the one-tile-wide path and the single island.
Counted properly, that is 47 tiles per terrain pair. Draw them by hand once and you will not want to do it for the second pair.
So I built a tool that generates the full set from the two source tiles: 47-Tile Terrain Autotile Maker. Free, no sign-up, and nothing is uploaded; it all runs in your browser.
Why 47 and not 256
A tile has 8 neighbors, so there are 256 possible neighbor combinations. Most of them cannot happen on a real map. A diagonal neighbor only matters when both adjacent sides are also connected; a tile that touches only its top-right corner has no visible corner to draw.
Remove those impossible diagonals and 256 collapses to 47. This is the "3x3 minimal" blob set that Godot's terrain system and Unity's Rule Tile both expect. The tool enumerates the 47 masks mechanically, so the narrow path and the island never go missing.
What you get
- Pick two ground types. Six pairs are built in (grass to dirt, grass to water, sand to water, snow to rock, cave floor to wall, cobblestone to grass), and A and B can be swapped.
- Choose a tile size: 16, 32, 48 or 64 px.
- Pick a boundary style: natural, shore (a light and dark rim against water) or cliff (top face, cliff edge, shadow below).
- Adjust corner roundness, edge roughness and border width.
The set is placed on a sample map with an island, a winding path and inside corners, so you can see whether the edges actually connect before you download anything. You can also paint on the map yourself.
Exports:
- the 47 tiles as an 8 x 6 PNG sheet at 1x, 2x, 4x or 8x (nearest-neighbor, no blur)
- the sample map as PNG
- a JSON manifest with each tile's neighbor mask, Godot peering bits and Unity This / NotThis conditions
The rule that matters most: no new colors
The tempting shortcut is to anti-alias the boundary. It looks smooth in a preview and wrong in a real tilemap, because the in-between colors exist in neither source tile and they break the palette.
So the boundary only uses colors that already exist in tile A or tile B, including the shore rim and the cliff shadow. One of the automated checks counts unique RGB values in every output and fails if a color appears that was not in the inputs.
What it does not do
- It does not write Godot
.tresfiles or Unity RuleTile assets. The JSON is a mapping table; you still assign the tiles in the editor. - It does not produce RPG Maker MZ A2 sheets. MZ uses its own 6-part autotile layout, which is a separate converter I have not built yet.
Numbers
- 256 neighbor masks in, 47 tiles out
- generation of the full set takes about 10 ms at 32 px (engine only, Apple M2 Pro, measured in Node 26)
- 57 automated assertions, including "same seed gives byte-identical output"
Try it here: https://holometer.net/autotile-maker/en/?utm_source=devto&utm_medium=article&utm_campaign=tools
It is one of a set of small pixel-art tools I keep on the same site (sprite sheet fixer, GB Studio converter, palette tools). If the boundaries come out wrong for your tiles, a screenshot in the comments helps me more than a description.
Top comments (0)