本文へスキップ

オートタイルシートからLDtkのオートレイヤールール

LDtkのオートレイヤールールは強力ですが準備が大変です。Studioは認識した地形ビットからタイルごとにルールを書きます。LDtkのJSONスキーマ・公式ローダー・独立したルールの再実行で確認しましたが、LDtkエディターでは開いていません。

LDtkのオートタイルは、タイルセットとオートレイヤールールを持つIntGridレイヤーです。ルールごとにIntGrid値のパターン(1 × 1〜7 × 7)があり、合った場所にタイルを塗ります。ルールは上から実行され、「break on match」が有効ならそのセルでは以降のルールが止まります。Nerulioはオートタイルシートのタイル1枚ごとに3 × 3のルールを1つ作り(ブロブセットなら47個)、サンプルレベル付きのLDtk 1.5.3プロジェクトとして書き出します。ファイルはLDtkのJSONスキーマと公式ローダーを通り、ルールを再実行すると同じタイルになりますが、LDtkアプリでは開いていません。

タイルセットやオートタイルのシート(PNG)をドロップ
空のStudioを開く
ブラウザ内で処理し、ファイルはアップロードされません。
Studio のタイル作業画面:GameMaker配置と認識した47タイルのシート、地形ビット、完了したチェック
CC0アセット(OpenGameArt)を開いた実際のStudio画面です。
書き出し先
  • LDtk一部検証· LDtk 1.5.3 schema + loader
  • 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

IntGrid値、ルール、そしてその順序

LDtkのマニュアルはオートレイヤーを「ひと工夫したIntGridレイヤー」と説明しています。タイルセットがリンクされ、ルールが自動でタイルを塗ります。ユーザーは整数値を塗り(JSONリファレンス:0は空セル、値は1から)、ルールがそれをタイルに変えます。純粋なオートレイヤーは別のIntGridレイヤーから値を読むこともできます。

ルールは、セルと隣を覆う正方形のパターンと、塗るタイルからなります。Nerulioが書くファイルでは、パターンのセルはv(隣が値vであること)、−v(vでないこと)、0(何でもよい)のいずれかで、左上から行ごとに並び、タイルは中央のセルに置かれます。開いた辺の後ろの角は0なので、ブロブのルールは5〜9セルを確認します。JSONリファレンスはbreakOnMatchを「合った場合、同じセルに他のルールを適用させない」と定義しているので、Nerulioは最も具体的なルールから並べ、この設定を有効にしています。

角(デュアルグリッド)セットはLDtkのタイルオフセットを使います。ルールはセルとその右・下・右下、つまり1つの格子点で接する4セルを読み、タイルを半タイル右下のその点の上に描きます。

IntGrid値
セルごとに塗る整数。地形ごとに1つ(地形1 = 値1 …)。
オートレイヤールール
必要な値と禁止する値のパターンと、合ったときに塗るタイル。
Break on match
ルールが合うと、以降のルールはそのセルを飛ばす(LDtkの既定)。
タイルオフセット
ルールごとに塗ったタイルをピクセル単位でずらす値。デュアルグリッドでは半タイル。

例:ブロブタイル1枚の3 × 3ルール(地形 = IntGrid値1)

タイルマスク31:N、NE、E、SE、Sがつながり、Wが開いている
パターン(左上から行ごと):
   0   1   1        1 = 値1であること
  -1   1   1       -1 = 値1でないこと
   0   1   1        0 = 何でもよい(開いた西の辺の後ろの角)
JSON  "size":3, "pattern":[0,1,1,-1,1,1,0,1,1], "breakOnMatch":true
ルール数  ブロブ47 → 47、辺16 → 16、角16 → 15(すべて空の角タイルは何も描かない)

レベル外のセルは空として数えます(outOfBoundsValue 0)。そのためレベルの端に接する地形にも縁のタイルが付きます。

できること

  • 地形ごとのIntGrid値とタイルごとの3×3ルール入りの.ldtk(1.5.3)。
  • autoLayerTilesを埋めたサンプルレベルつきで、結果をすぐ確認できます。
  • 角・デュアルグリッドのセットは半タイルのオフセットで書き出し。
  • 一部検証:スキーマ+公式QuickTypeローダー+独立したルール再実行が、コーパス12セットで書き出したタイルと一致。

使い方

  1. タイルセットを入れて配置を適用(またはビットを塗る)。
  2. チェックパネルを読み、足りない組み合わせを埋める。
  3. 書き出して(Ctrl+E)ldtkフォルダーを使う。
  4. LDtkで.ldtkを開き、IntGridレイヤーを塗る。

出力されるファイル

cave.pngというシートを書き出したときの、ZIP内のldtkフォルダーです。

ファイル用途
cave.ldtkLDtk 1.5.3プロジェクト:タイルセット定義、地形ごとに値を持つIntGridレイヤーTerrain、ルールグループNerulio terrain、autoLayerTilesが埋まったレベルSample。
cave.pngタイルセット画像。ファイル名で参照されます。
README.txtプロジェクトの内容と、サンプルレベルに置かれるタイル数。

LDtkで開いて塗る

  1. ldtkフォルダーを展開し、PNGを.ldtkファイルの隣に置きます。
  2. LDtkで.ldtkを開きます。レベルSampleにはルールが置いたタイルがすでに表示されています。
  3. LAYERSパネルでIntGridレイヤーTerrainを選びます。値があなたの地形で、AUTO PAINTのタイルセットがあなたのPNGです。
  4. レイヤーのRULESボタンを押すと、タイルごとに1ルールを持つグループNerulio terrainが、調べられる順に表示されます。
  5. 左ボタンで値を塗り、右ボタンで消し、Shift + ドラッグで矩形、Shift + クリックで塗りつぶしです。塗るたびにLDtkがルールを再実行します。RulesパネルでShift+Rを押すと元のIntGridが見えます。
  6. ゲームでは、レベルのautoLayerTiles(LDtkが表示順に並べて保存)を読むか、自分でルールを回すならintGridCsvを読みます。

結果の確認

  • 何も塗る前から、Sampleレベルに完成した地形が表示されるはずです。
  • ルールグループには、ブロブセットならルール47個(辺のセットは16個、角のセットは15個)があるはずです。
  • 孤立した1セルと3 × 3の四角を塗ると、孤立タイルと異なるタイル9枚が出るはずです。LDtkアプリ内では私たちが実際に確認できていない部分なので、違いがあれば知らせてください。

トラブルシューティング

症状考えられる原因確認方法対処
タイルセット画像が見つからないPNGが.ldtkの隣にない、または名前が変わったタイルセット定義の画像パス書き出したときの名前のままPNGをプロジェクトの隣に置く
塗っても値だけでタイルが出ない別のレイヤーに塗っている、またはレイヤーのルールがオフLAYERSパネルの選択、RulesパネルのRenderオプションTerrainを選び、ルールグループを有効にしておく
専用タイルの位置に汎用のタイルが出る自作のルールがグループより上にある、またはBreak on matchを切ったRulesパネルのルールの順序自作ルールをグループの下へ移すか、Break on matchを戻す
デュアルグリッドのタイルがIntGridと半タイルずれる仕様:角のルールは半タイルのオフセットで格子点に塗るグループ内のルールのタイルオフセットそのままでよい。タイル同士はかみ合い、IntGridのセルとは半タイルずれるのが正常
ZIPにldtkフォルダーがないLDtkは正方形のタイルと、余白・間隔の値を1つずつしか持てないNOTES.txtに省いた理由がある縦横の余白と間隔が同じ正方形のグリッドを使う
2つの地形が遷移なしで接する両方の地形が見えるタイルがシートにないそのペアについてのStudioのチェックパネルジェネレーターでAからBのタイルを生成

ほかの方法

方法こんなときに向いています
LDtkのルールエディターで手作業で書くタイルが少なく、書き出しが使わないLDtkの機能が必要なとき:反転パターン、modulo、checker、確率、1ルールに複数タイル。
TiledのWangセット:TiledのWangセットマップをTiledで編集し、IntGridの代わりに地形ブラシを使いたいとき。
Godotの地形:Godot 4のオートタイルエンジンがGodotで、LDtkのレベルエディターが要らないとき。

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

「検証済み」は、実際の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はブロブ・辺セットの塗った全セルで一致。

制限

  • LDtkアプリでは開いていません(コマンドラインがないため)。チェックはスキーマ、公式ローダー、独立したルールの再実行です。
  • 1タイルに1ルール:反転、modulo、checker、Perlinのオプションは使いません。
  • タイルは正方形で、余白と間隔が縦横で同じである必要があります。
  • Tiledの地形ブラシ、LDtkアプリ、Godotエディターでの塗りは操作していません。検証はエンジンの読み込み機能とset_cells_terrain_connectで行いました。
  • Unityへはブロブ・辺タイルセットのみ。地形が複数あると、互いにつながらないRule Tileが複数になります。
  • アイソメトリック・六角タイル、アニメーションタイル、オクルージョン・ナビゲーションレイヤーは対象外です。
  • 既知の配置なしでビットを提案するには基準となる「塗りつぶし」タイルが必要です。辺だけの道テンプレートでは、そのタイルを選ぶまで推定を誤ることがあります。

バージョンと出典

コーパス12セットで確認:プロジェクトはLDtk 1.5.3のJSONスキーマを通り、LDtk公式のQuickTypeローダーで読み込め、ルールを独立に再実行すると書き出したタイルと完全に一致しました。タイルidを変えたりルールを反転させたりするとチェックは失敗します。上のUI名はLDtkの公式ドキュメントに基づき、アプリ自体は操作していません。

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

よくある質問

なぜ「一部検証」なの?

LDtkはコマンドラインのないElectronアプリなので、アプリでは開いていません。ファイルはLDtkのJSONスキーマと公式ローダーを通過し、ルールを再実行すると書き出したタイルと一致しました。

1枚のシートに複数の地形を入れられますか?

はい。地形ごとにIntGrid値とルールが別々にできます。

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

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

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

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

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

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