Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Build and script 2D tilemaps in Unity 6.3 LTS: the Grid + Tilemap components, the Tile Palette, tilemap colliders, rule tiles, and runtime SetTile/GetTile painting. Use when painting tile levels, adding a TilemapCollider2D, using rule or animated tiles, generating tilemaps from code, or when the user mentions Unity tilemap, tile palette, rule tile, or Grid.
.claude/skills/gamedev-skills-unity-tilemap-2d/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 28% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 46% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 54% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 41% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 43% | 0% |
Author and script tile-based 2D levels in Unity 6.3 LTS with the Grid/Tilemap system, the Tile Palette, colliders, and runtime painting. Targets Unity 6.3 LTS (6000.3).
> Package note: the core Tilemap (Grid, Tilemap, Tile, TilemapCollider2D) is > built in. Rule Tiles, Animated Tiles, and Tile Palette brushes live in the separate > "2D Tilemap Extras" package (com.unity.2d.tilemap.extras) — install it via Package > Manager before using RuleTile.
Grid + Tilemap, addingcollision to the map, using auto-tiling Rule Tiles, or generating/editing tiles from script.
Grid with Tilemap children, or *.asset tile/palette files.When _not_ to use: level _design_ practice (pacing, blockout, layout principles) → level-design. 3D tile/grid placement → Unity's own 3D tooling (ProBuilder / grid brushes; no dedicated skill here). The platformer character that moves over the tiles → platformer / unity-physics.
Gridwith a child Tilemap (+ TilemapRenderer). Use one Tilemap per layer (background, ground, foreground) and set each renderer's sorting.
create Tile assets, then paint with the brush tools.
TilemapCollider2D. For one merged collider (farcheaper and gap-free), also add CompositeCollider2D (+ a Rigidbody2D set to Static) and enable _Used By Composite_ on the tilemap collider.
automatically instead of hand-placing every variant.
Vector3Int): SetTile, GetTile,SetTilesBlock, converting world↔cell with the Grid/Tilemap.
RefreshAllTiles ran after bulk edits.
csharpusing UnityEngine; using UnityEngine.Tilemaps; public class TilePainter : MonoBehaviour { [SerializeField] private Tilemap tilemap; // assign the target Tilemap [SerializeField] private TileBase groundTile; // World position -> cell, then place a tile. public void PaintAt(Vector3 worldPos) { Vector3Int cell = tilemap.WorldToCell(worldPos); tilemap.SetTile(cell, groundTile); } public bool IsSolid(Vector3 worldPos) => tilemap.GetTile(tilemap.WorldToCell(worldPos)) != null; }
SetTile)csharp// SetTilesBlock writes a whole BoundsInt in one call — use it for procedural rooms/floors. public void FillFloor(Tilemap map, TileBase tile, int width, int height) { var bounds = new BoundsInt(0, 0, 0, width, height, 1); var tiles = new TileBase[width * height]; for (int i = 0; i < tiles.Length; i++) tiles[i] = tile; map.SetTilesBlock(bounds, tiles); }
csharptilemap.SetTile(cell, null); // null erases the tile at that cell tilemap.RefreshTile(cell); // re-evaluate just this cell's rule/animated neighbors (cheap) // RefreshAllTiles() re-evaluates the ENTIRE map — reserve it for full regenerations, not per-edit.
RuleTile type not found — it's not built in. Install the 2D Tilemap Extras package(com.unity.2d.tilemap.extras) via Package Manager.
CompositeCollider2D with astatic Rigidbody2D and _Used By Composite_ to merge the whole layer into one smooth shape.
SetTile/GetTile take a Vector3Int _cell_,not a world position. Always convert with WorldToCell / CellToWorld.
TilemapRenderer'sSorting Layer and Order in Layer; multiple tilemaps need explicit ordering.
the targeted RefreshTile(cell) for a few edits; RefreshAllTiles() re-evaluates every tile on the map and stalls large levels. Reserve the full refresh for whole-map regenerations.
where paint lands; check the "Active Tilemap" dropdown.
(https://docs.unity3d.com/Manual/tilemaps/work-with-tilemaps/tilemap-reference.html), ScriptReference/Tilemaps.Tilemap, and the 2D Tilemap Extras package manual (https://docs.unity3d.com/Packages/com.unity.2d.tilemap.extras@1.6/manual/index.html) for Rule Tiles.
level-design — engine-agnostic blockout, pacing, and tile layout practice.procedural-gen — generating the tile data (noise, RNG, dungeons) you feed to SetTilesBlock.platformer / roguelike — genres that compose this skill with movement and generation.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→pass | 23,299 | 21,960 | -6% | 1 | 1 | 0% | 2,866 | 4,039 | +41% | 0 | 0 | — |
case-02 | fail→pass | 13,004 | 13,273 | +2% | 1 | 1 | 0% | 2,181 | 2,792 | +28% | 0 | 0 | — |
case-03 | pass→pass | 19,015 | 29,663 | +56% | 1 | 1 | 0% | 2,864 | 4,093 | +43% | 0 | 0 | — |
case-04 | fail→pass | 15,107 | 11,142 | -26% | 1 | 1 | 0% | 1,840 | 2,681 | +46% | 0 | 0 | — |
case-05 | pass→pass | 17,011 | 10,161 | -40% | 1 | 1 | 0% | 2,081 | 3,153 | +52% | 0 | 0 | — |
case-06 | pass→pass | 13,340 | 5,378 | -60% | 1 | 1 | 0% | 1,614 | 2,538 | +57% | 0 | 0 | — |
case-07 | pass→pass | 11,998 | 11,170 | -7% | 1 | 1 | 0% | 1,332 | 2,647 | +99% | 0 | 0 | — |
case-08 | pass→pass | 12,512 | 15,714 | +26% | 1 | 1 | 0% | 2,120 | 3,392 | +60% | 0 | 0 | — |
case-09 | pass→pass | 3,364 | 7,508 | +123% | 1 | 1 | 0% | 639 | 1,902 | +198% | 0 | 0 | — |
case-10 | pass→pass | 12,368 | 8,128 | -34% | 1 | 1 | 0% | 2,180 | 3,011 | +38% | 0 | 0 | — |
case-11 | pass→pass | 14,713 | 11,112 | -24% | 1 | 1 | 0% | 1,526 | 2,579 | +69% | 0 | 0 | — |
case-12 | fail→fail | 7,423 | 9,255 | +25% | 1 | 1 | 0% | 1,482 | 2,387 | +61% | 0 | 0 | — |
case-13 | fail→fail | 7,309 | 9,688 | +33% | 1 | 1 | 0% | 1,338 | 2,359 | +76% | 0 | 0 | — |
case-14 | pass→pass | 16,429 | 13,824 | -16% | 1 | 1 | 0% | 2,977 | 3,912 | +31% | 0 | 0 | — |
case-15 | pass→pass | 4,643 | 3,731 | -20% | 1 | 1 | 0% | 861 | 2,090 | +143% | 0 | 0 | — |
case-16 | fail→pass | 6,809 | 1,661 | -76% | 1 | 1 | 0% | 1,092 | 1,682 | +54% | 0 | 0 | — |
case-17 | pass→pass | 11,868 | 8,288 | -30% | 1 | 1 | 0% | 2,017 | 2,840 | +41% | 0 | 0 | — |
case-18 | pass→pass | 9,690 | 7,138 | -26% | 1 | 1 | 0% | 1,895 | 2,775 | +46% | 0 | 0 | — |
case-19 | pass→pass | 13,778 | 8,052 | -42% | 1 | 1 | 0% | 2,204 | 2,813 | +28% | 0 | 0 | — |
case-20 | pass→pass | 11,849 | 3,186 | -73% | 1 | 1 | 0% | 1,888 | 2,024 | +7% | 0 | 0 | — |
case-21 | pass→pass | 8,763 | 5,178 | -41% | 1 | 1 | 0% | 1,692 | 2,477 | +46% | 0 | 0 | — |
case-22 | pass→pass | 7,671 | 6,761 | -12% | 1 | 1 | 0% | 1,298 | 2,620 | +102% | 0 | 0 | — |
case-23 | pass→pass | 2,020 | 2,510 | +24% | 1 | 1 | 0% | 291 | 1,838 | +532% | 0 | 0 | — |
case-24 | pass→pass | 12,171 | 8,740 | -28% | 1 | 1 | 0% | 1,791 | 2,910 | +62% | 0 | 0 | — |
case-25 | pass→pass | 4,049 | 2,648 | -35% | 1 | 1 | 0% | 603 | 1,910 | +217% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted. The headline lift of +12 percentage points is the difference between those two pass rates over the 25 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.