本文へスキップ

タイルセット分割 · タイルサイズ・余白・間隔を自動検出

タイルセットを入れると、Studioがピクセルから候補グリッドを測り(既知のオートタイル配置がぴったり合うサイズも含む)、使うまでは最良のグリッドを点線でプレビューします。

タイルセットを切り分けるには、軸ごとに3つの数が必要です。タイルサイズ、余白(最初のタイルの前のピクセル)、間隔(タイル同士の間のピクセル)です。個数は列 = floor((幅 − 余白 + 間隔) ÷ (タイル + 間隔))で、行も同じです。Kenney Tiny Dungeonの203 × 186pxのシートは、16pxのタイルと1pxの間隔で12 × 11 = 132枚になります。Studioはこれらの数をピクセルから測り、「このグリッドを使う」を押すまで最良のグリッドを点線で示し、Godot 4・Tiled・Unity・LDtkへの書き出しにそのまま渡します。タイルごとのPNGのZIPは従来のタイルグリッド分割で作れます。

タイルセットやオートタイルのシート(PNG)をドロップ
空のStudioを開く
ブラウザ内で処理し、ファイルはアップロードされません。
Studio のタイル作業画面:GameMaker配置と認識した47タイルのシート、地形ビット、完了したチェック
CC0アセット(OpenGameArt)を開いた実際のStudio画面です。
書き出し先
  • Godot 4 TileSet検証済み· Godot 4.7.2
  • Tiled検証済み· Tiled 1.12.2
  • Unity 6 Rule Tile検証済み· Unity 6000.5.3f1 + 2D Tilemap Extras 8.0.3
  • LDtk一部検証· LDtk 1.5.3 schema + loader

グリッドのモデル、計算式、数の測り方

タイルはすべて同じ大きさです。余白は最初の列(と行)の前で一度だけ飛ばし、間隔は隣り合う2枚の間にあり、最後のタイルの後ろには何も仮定しません。したがってタイル(c, r)はx = 余白 + c × (タイル + 間隔)、y = 余白 + r × (タイル + 間隔)から始まります。Godotは同じ数をTexture Region Size、Margins、Separationと呼び、Tiledはタイルサイズ、Margin、Spacingと呼びます。

n枚のタイルには余白 + n × タイル + (n − 1) × 間隔のピクセルが要るので、入る最大数はfloor((W − 余白 + 間隔) ÷ (タイル + 間隔))です。両側の余白が同じなら、教科書どおりの(W − 2 × 余白 + 間隔) ÷ (タイル + 間隔)が割り切れます。Nerulioのfloorは、右側に残る帯がタイル1枚と間隔より狭ければ同じ個数になり、数ピクセル余ったシートでもきれいに切れるのはこのためです。

検出器は画像を1行ずつ読み、各行・各列が前の行とどれだけ違うかを見ます。その変化の並びを4pxから画像の半分までのあらゆる周期で折り重ね、変化を最もよく説明する周期を選び、位相を確かめ、余白や間隔と主張する行が本当に空か単色かを調べます。どのタイルも最初か最後の行が空なら「16px+1pxの間隔」が「17pxのタイル」に勝ち、本当のサイズの倍数は、約数のスコアが0.02以内なら負けます。Studioは公開オートタイル配置がぴったり収まるサイズも併せて試します。

最も苦手なのは区切りがまったくないシート、つまりタイルの中身が縁より複雑な詰めたシートです。軸ごとにタイルが1枚しかないと測れず、Studioが測るのは16メガピクセルまでの画像です。それより大きい場合はサイズを入力してください。

タイルサイズ
タイル1枚の幅と高さ(Godot:Texture Region Size)。
余白
左端と上端で、最初のタイルの前にあるピクセル。
間隔
隣り合うタイルの間のピクセル(Godot:Separation)。多くは1px、縁のピクセルを引き伸ばしたものもある。
詰めたシート
間隔なしでタイルを並べたシート。ほかのエディターには最も扱いやすく、測るのは最も難しい。

例:テストコーパスのKenneyシート2枚

CC0のファイルをNerulioのグリッド検出器で測った結果(2026-09-28):

Kenney Tiny Dungeon   tilemap.png          203 × 186 px   16pxタイル、間隔1px、余白0
列 = floor((203 − 0 + 1) / (16 + 1)) = floor(204 / 17) = 12
行 = floor((186 − 0 + 1) / (16 + 1)) = floor(187 / 17) = 11              → 132枚
タイル13 = 1列目・1行目  → x = 0 + 1 × 17 = 17、y = 17、サイズ16 × 16
検出:16 × 16、間隔1、12 × 11、スコア0.976(高)

tilemap_packed.png    192 × 176 px   同じタイル、間隔なし → 192 / 16 = 12、176 / 16 = 11
検出:16 × 16、12 × 11、ただしスコア0.514(低):タイル間に空の行がない

Kenney Pixel Platformer  tilemap.png  379 × 170 px → (379 + 1) / (18 + 1) = 20、(170 + 1) / 19 = 9
タイルは16pxではなく18px:検出18 × 18、間隔1、20 × 9、スコア0.946(高)

同じ絵でも間隔があれば0.976、なければ0.514です。空の区切り線は、シートが示せる最も強い手がかりです。詰めたシートでは「このグリッドを使う」を押す前に点線のグリッドを確かめるか、わかっているサイズを入力してください。

できること

  • タイルサイズ・余白・間隔を持つグリッド候補と信頼度、合致する公開オートタイル配置の名前。
  • 空タイルを数えて薄く表示。1プロジェクトに複数のタイルセット(シートごと)。
  • わかっているグリッドは直接入力できます。
  • タイルセットはグリッドと地形ビットごとGodot 4・Tiled・Unity・LDtkへ書き出し。

使い方

  1. タイルセットをドロップ。
  2. グリッド候補を確認し「このグリッドを使う」を押す。
  3. 必要ならオートタイル配置を認識するか地形ビットを塗る。
  4. エンジン向けに書き出し。

使う前にグリッドを確かめる

  • 点線が最後の列・最後の行まで間隔の上に乗っていること。左は合っているのに右がずれるなら、タイルサイズか間隔が違います。
  • 列 × 行が予想どおりで(Tiny Dungeonなら12 × 11 = 132)、空タイルとして数えたマスが本当に空であること。
  • 書き出し後、Godotのアトラスで Texture Region Size、Margins、Separationが同じ値であること。余白1・間隔2で書き出したNerulioのGodotファイルは、Godot 4.7.2でTileSetAtlasSourceにそのまま入りました。
  • タイルごとのPNGが要るなら、従来の分割ツールは領域をそのままコピーし再サンプリングしないので、各タイルが元の矩形とバイト単位で一致します。

トラブルシューティング

症状考えられる原因確認方法対処
列が進むほどタイルがずれていくタイルサイズの誤り:Pixel Platformerの18pxタイルを16px+1pxと読むと、c番目のタイルが19 × cではなく17 × cから始まり、1列ごとに2pxずつずれる最初の列は合うのに10列目では18px外れる18pxの候補を選ぶか、タイル18・間隔1を入力
すべてのタイルが上と左に1pxずれて切れる外周の枠を余白として指定していない画像の最初の行と列が空か単色余白を1にする。個数の式は余白を1回だけ引く
右端や下端に半端な列・行が残るタイルサイズがシートを割り切れない。floorはタイル1枚と間隔より狭い部分を捨てる(W − 余白 + 間隔) ÷ (タイル + 間隔)を計算:整数か、整数よりわずかに大きいはずタイルサイズを見直す。余りが大きいならシートではなく読み取りが間違っている
最初の候補が低か中しかない詰めたシート:タイル間に空の行がなく、中身が複雑各候補のスコアと信頼度点線のグリッドを確かめる、別の候補を選ぶ、またはサイズを入力
とても大きい画像で候補が1つも出ないStudioが測るのは16メガピクセルまで画像の幅 × 高さタイルサイズ・余白・間隔を手で入力
ほかのエディターがシートを受け付けない間隔を扱わないエディターがある:Sprite Fusionはタイルセットの幅と高さがタイルサイズのちょうど倍数であることを求めるW ÷ タイルが整数かシートの詰めた版を使うか、間隔なしで詰め直す

ほかの方法

方法こんなときに向いています
エンジンに数を直接入力:Godotのアトラス(Texture Region Size、Margins、Separation)やTiledの新規タイルセット画面(タイルサイズ、Margin、Spacing)素材パックの説明などでグリッドがもうわかっているとき。
従来のタイルグリッド分割タイルごとのPNG、完全一致と近似の重複検出、回転・反転の派生、にじみ対策の縁を拡張したアトラスが欲しいとき。
スプライト分割大きさの違うスプライトがグリッドなしで並んだシートのとき。タイルの分割には規則的なグリッドが必要です。

エンジン別の書き出しと検証方法

「検証済み」は、実際のCC0アセットから書き出したファイルを本物のエンジン・ツールで読み込み、元データと比較したという意味です。読み込んでいない形式はそのように表示します。

書き出し先ファイル検証
Godot 4 TileSetPNG · nerulio-tileset.json · nerulio_tileset_import.gd検証済み Godot 4.7.2同梱のインポートスクリプトが地形ピアリングビット付きのTileSetを作成。set_cells_terrain_connectで塗ったマップが、9つのコーパスシートの全セルでStudioのプレビューと一致。
Tiled.tsx Wang set · sample.tmx検証済み Tiled 1.12.2Tiled自身の読み込みで全Wang IDが記述どおりに読まれ、サンプルマップはピクセル単位で一致。地形ブラシ自体は操作していません。
Unity 6 Rule Tilenerulio-ruletile.json · Editor/NerulioRuleTileImporter.cs検証済み Unity 6000.5.3f1 + 2D Tilemap Extras 8.0.3ブロブ・辺タイルセット:塗ったTilemapの全セルが予測どおりのスプライト。角/デュアルグリッドはUnityへ書き出しません。
LDtk.ldtk (1.5.3) · rules · sample level一部検証 LDtk 1.5.3 schema + loaderLDtkのJSONスキーマと公式ローダーで受理され、ルールを再実行すると書き出したタイルと一致。LDtkアプリでは未確認。

検証の根拠

タイルコーパスでピクセルだけから配置を判定:ブロブ47テンプレート4つとWangテンプレート2つは高信頼度、実在の64px洞窟タイルセットは中信頼度で全タイルのビットが正解。Godot 4.7.2は全テストセルをStudioの予測どおりに塗りました(ブロブセットごとに485/485、4地形のデュアルグリッド251/251)。Tiled 1.12.2は全Wang IDを読み戻し、Unity 6000.5はブロブ・辺セットの塗った全セルで一致。

制限

  • 規則的なグリッドのみ扱います。アイソメトリック・六角形のシートはモデル化していません。
  • StudioはタイルごとのPNGを書き出しません。その機能は従来の分割ツールにあります。
  • 軸ごとにタイルが1枚しかないシートには、測る周期がありません。
  • Tiledの地形ブラシ、LDtkアプリ、Godotエディターでの塗りは操作していません。検証はエンジンの読み込み機能とset_cells_terrain_connectで行いました。
  • Unityへはブロブ・辺タイルセットのみ。地形が複数あると、互いにつながらないRule Tileが複数になります。
  • アイソメトリック・六角タイル、アニメーションタイル、オクルージョン・ナビゲーションレイヤーは対象外です。
  • 既知の配置なしでビットを提案するには基準となる「塗りつぶし」タイルが必要です。辺だけの道テンプレートでは、そのタイルを選ぶまで推定を誤ることがあります。

バージョンと出典

計算式と矩形はsrc/game/tile-grid.jsのtileRectsそのものです。検出は合成シート10枚で確認し(10枚すべてで本当のグリッドが1位)、上のKenneyの数値は2026-09-28にコーパスのファイルで測りました。2026-09-22のGodot 4.7.2の実行では、作成したTileSetから余白1と間隔2がそのまま読み戻せました。エンジンの項目名はリンク先の公式ドキュメントに基づきます。

参照した公式ドキュメント

従来のツール

タイルPNGのZIPと重複タイルの検出は従来のタイルセット工房にあります。

従来のツールを開く →

よくある質問

タイルを1枚ずつPNGで保存できますか?

Studioではできません。下のリンクの従来のタイルセット工房でタイルPNGのZIPを保存できます。

タイル間に1pxのすき間があるシートは?

余白と間隔はすべてのグリッド候補と書き出したタイルセットに含まれます。

無料ですか?アカウントは必要ですか?

このページの機能はすべて無料で、アカウントなしで使えます。透かしや制限された書き出しはありません。

スプライトはアップロードされますか?

いいえ。Studioはこのブラウザのタブ内でデコード・パック・書き出しを行います。プロジェクトはブラウザ(IndexedDB)に自動保存され、.nerulioファイルとして保存できます。

Asepriteやエンジンのプラグインは必要ですか?

いいえ。.asepriteファイルはブラウザで読み書きします。エンジン別のバンドルには必要なものが入っています(Godotはインポート設定とシーン、UnityとGodotのタイルセットは小さなエディタースクリプト)。