本文へスキップ

Godot 4 オートタイル・地形セット生成 · ピアリングビット自動設定

47タイル×8つのピアリングビットを手で設定するところでGodot 4の地形はつまずきます。Studioはシートの配置を認識してビットを書き込み、足りない組み合わせを示し、set_cells_terrain_connectと同じようにテストマップを塗ります。

Godot 4には「オートタイル」というタイル種別はもうありません。自動接続は、TileSetの地形セット(マッチモードMatch Corners and Sides・Match Corners・Match Sides)とその中の地形、そしてタイルごとの地形とピアリングビット(隣のセルにどの地形が来るべきか)で決まります。47タイルのブロブシートなら、接続ビット188個を正しいタイルに設定しなければなりません。Nerulioはピクセルから配置を読み取ってビットを設定し、Godot内でTileSetを組み立てるGDScriptを添えます。あとはTerrainsタブで塗るかset_cells_terrain_connect()を呼ぶだけです。Godot 4.7.2で検証済みです。

タイルセットやオートタイルのシート(PNG)をドロップ
空のStudioを開く
ブラウザ内で処理し、ファイルはアップロードされません。
Studio のタイル作業画面:Godotの地形ルールで塗ったテストマップ
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

地形セット・マッチモード・ピアリングビット

Godot 4.7のドキュメントは、地形をGodot 3のオートタイルの「より強力な置き換え」と説明しています。TileSetが地形セットを持ち、セットごとにどの隣を見るかを決めるモードと、1つ以上の地形(名前と色)があります。各タイルにはTerrain SetとTerrainの番号(どちらも0から、−1はなし)を与え、隣の位置ごとにピアリングビット、つまりそこに来るべき地形番号(空なら−1)を設定します。ドキュメントの例のとおり、ビットがすべて0のタイルは8方向すべてが地形0のときだけ使われます。

モードは絵で決まります。内角まで描いた47タイルのブロブセットは8方向すべてを見るMatch Corners and Sides、辺16タイルや3 × 3のボックスは4辺だけを見るMatch Sides、角16タイル(Wang 2-corner、デュアルグリッド4 × 4)はMatch Cornersです。256ではなく47になるのは、角は両隣の辺がつながっているときだけ意味を持つため、1セルの近傍256通りが異なるタイル47枚にまとまるからです。

塗るとき、Godotはセルごとに隣とビットが最もよく合うタイルを選びます。TileMapLayerのリファレンスは、これには「必要なすべての地形の組み合わせ」が要ると注意しています。組み合わせが欠けていると、Godotは警告なしに最も近いタイルを置くかセルを空のままにします。「Godotの地形がうまく動かない」原因の大半はこれです(Godotの地形が違うタイルを塗るときを参照)。

地形セット(Terrain set)
1つのモードの下で互いに合わせられる地形のまとまり。タイルは1つの地形セットに属します。
Match Corners and Sides / Match Corners / Match Sides
3つのモード。タイルのビットが8つの隣接位置のどれを表すかを決めます。
ピアリングビット
隣の位置ごと(TileSet.CellNeighborの名前、例:top_right_corner)に来るべき地形番号。−1は空。
set_cells_terrain_connect
コードから地形を塗り、隣のセルも更新するTileMapLayerのメソッド。Terrainsタブと同じマッチングを使います。

例:1セル、8つの隣、1枚のタイル

Xは地面、Cはいま塗るセルです。cr31マスクは地面の隣ごとに重みを足します。

マップ        . X X
              X C .
              . X .
重み          N 1   NE 2   E 4   SE 8   S 16   SW 32   W 64   NW 128
元のマスク    N + NE + S + W = 1 + 2 + 16 + 64 = 83
NEはNとEが両方地面のときだけ数える。Eが空なのでNEは外れる
タイルマスク  1 + 16 + 64 = 81   (47のうちの1つ)
Godotタイル   地形0; top_side 0, bottom_side 0, left_side 0; 残り5ビットは−1
セット全体    タイル47枚、0に設定されたビット188個(それ以外は−1)

nerulio-tileset.jsonではこのタイルは"peering":{"top_side":0,"bottom_side":0,"left_side":0}と書かれ、名前のない位置は−1です。インポートスクリプトは名前ごとにTileSet.CellNeighborの定数を引き、TileData.set_terrain_peering_bit()を呼びます。

できること

  • 継ぎ目の連続性で、ブロブ47(公開された5種の並び)、辺16、角16・デュアルグリッド、3×3の配置を信頼度つきで認識。
  • 角+辺・辺・角のマッチモード、1セットに複数の地形。
  • チェックパネルが足りない組み合わせ、つまりGodotが黙って別タイルで代用するセルを示します。
  • 書き出し:PNG+JSON+nerulio_tileset_import.gd。スクリプトがGodot内で地形付きTileSetを作成(4.7.2で検証)。

使い方

  1. オートタイルシートをドロップ。
  2. グリッドを使い、最良の配置候補を適用。
  3. チェックし、Godotルールでテストマップを塗る。
  4. Godot 4向けに書き出し、エディターでインポートスクリプトを実行。

出力されるファイル

cave.pngというシートを書き出したときの、ZIP内のGodotフォルダーです(同じZIPにTiled・LDtk・Unity・汎用のフォルダーとNOTES.txtも入っています)。

ファイル用途
cave.pngタイルセット画像。変更されません。
nerulio-tileset.jsonタイルサイズ、余白、間隔、地形セット(モード、地形の名前と色)、タイルごとのアトラス座標・地形・ピアリングビット。設定した場合は衝突ポリゴンと確率も入ります。
nerulio_tileset_import.gdBuilderクラスがGodot自身のAPIでTileSetを作り、res://nerulio-tileset.tresとして保存するEditorScript。手書きの.tresは同梱しません。
README.txtこのセットのモードとタイル数を書いた、以下の手順。

Godot 4でTileSetを作って塗る

  1. PNG、nerulio-tileset.json、nerulio_tileset_import.gdをプロジェクトのルートにコピーします。スクリプトはres://nerulio-tileset.jsonを読みres://nerulio-tileset.tresを書くので、サブフォルダーに置く場合はスクリプト冒頭のJSON_PATHとOUTPUT_PATHを書き換えてください。
  2. ファイルシステムドックがPNGのインポートを終えたら、スクリプトエディターでスクリプトを開き、File › Run(Ctrl+Shift+X)で実行します。出力パネルにSaved res://nerulio-tileset.tres: source 0, 47 tiles, 188 peering bits, 0 collision polygons, mode match_corners_and_sidesのような行が出ます。
  3. TileMapLayerノードを追加し、Tile Setプロパティにnerulio-tileset.tresを読み込みます。
  4. レイヤーを選んだまま下部のTileMapパネルのTerrainsタブで地形セット0と地形を選び、Connectモードで塗ります。Pathモードは1回のストローク内のセルだけをつなぎます。
  5. コードでは範囲をまとめて塗ります。$TileMapLayer.set_cells_terrain_connect(cells, 0, 0)のcellsはArray[Vector2i]、最初の0が地形セット、次の0が地形です。
  6. ピクセルアートなら、レイヤーのTexture › FilterをNearestに(またはプロジェクト既定のキャンバステクスチャフィルターを)設定します。Godotでピクセルアートがぼやけるときも参照。

結果の確認

  • 出力行のタイル数とビット数を確認します。ブロブセットはタイル47・ビット188、辺16や角16のセットはタイル16・ビット32です。
  • TileSetエディター › Selectモードでタイルをクリックすると、TerrainsセクションにTerrain Set 0とTerrain 0が表示され、タイル上にピアリングビットが描かれます。
  • 3 × 3の四角と孤立した1セルを塗ります。四角には異なるタイル9枚(角4・辺4・中央)、孤立セルには孤立タイルが置かれるはずです。
  • Studioのテストマップで同じ形をGodotルールで塗ります。私たちの実行では、Godot 4.7.2は全セルに同じタイルを置きました。

トラブルシューティング

症状考えられる原因確認方法対処
スクリプトがCannot read res://nerulio-tileset.jsonと出力するファイルがサブフォルダーにある、またはJSONの名前を変えた出力パネルの最初の行3つのファイルをres://に移すか、スクリプトのJSON_PATHとOUTPUT_PATHを直して再実行
PNGがまだインポートされておらずピクセルを埋め込んだという警告エディターが画像を取り込む前にスクリプトを実行した.tresがPNGよりずっと大きいファイルシステムドックのインポート完了後に再実行し、TileSetがインポート済みPNGを参照するようにする
Tile (x, y) is outside the … atlas grid; skippedプロジェクトのPNGが書き出したものと違う、または書き出し前のグリッド(余白・間隔)が誤りStudioのタイルセットパネルのグリッドと画像サイズを比べるグリッドを直して書き出し直し、PNGとJSONを両方置き換える
塗ると空のセルや違う角が出るセットに必要な組み合わせがなく、Godotが近いタイルで代用するか空にするStudioのチェックパネルの「ある組み合わせ/必要な組み合わせ」とゴーストタイル足りないタイルを描くか生成して書き出し直す
Terrainsタブに塗れるものがないレイヤーが別のTileSetを使っている、またはタイルにTerrain SetがないTileMapLayerのTile Setプロパティそのレイヤーにnerulio-tileset.tresを設定
拡大するとタイルがにじむレイヤーのテクスチャフィルターがLinear2Dビューポートを拡大してピクセルの境目を見るレイヤーかプロジェクト全体のTexture › FilterをNearestに

ほかの方法

方法こんなときに向いています
GodotのTileSetエディターで手作業でビットを設定(SelectモードのTerrainsセクション、または同じ値を多数のタイルに塗るタイルプロパティペイント)タイルが数枚だけ、またはNerulioの知らない配置のとき。追加ファイルは不要ですが、ブロブセットなら47枚を1枚ずつ設定します。
先にオートタイルテスターやタイルセットジェネレーターでセットを確認・補完シートが不完全、または小さな元ブロックしかないとき。
TiledでWangセットを使ってマップを描き、TiledのGodot 4エクスポーター(Tiled 1.10以降)で書き出すレベルをTiledで設計し、Godotには完成したマップだけが必要なとき。

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

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

制限

  • 1回の書き出しにつき地形セット1つ(中に地形は最大16)。アイソメトリック・六角形タイル、アニメーションタイル、代替タイルは書き出しません。
  • Godotエディターの地形ブラシそのものはテストで操作しておらず、ブラシが使うset_cells_terrain_connectを検証しました。
  • 角(デュアルグリッド)セットは、Godotでは半タイルずれずにセルの上に描かれます。デュアルグリッドのタイルセットを参照。
  • Tiledの地形ブラシ、LDtkアプリ、Godotエディターでの塗りは操作していません。検証はエンジンの読み込み機能とset_cells_terrain_connectで行いました。
  • Unityへはブロブ・辺タイルセットのみ。地形が複数あると、互いにつながらないRule Tileが複数になります。
  • アイソメトリック・六角タイル、アニメーションタイル、オクルージョン・ナビゲーションレイヤーは対象外です。
  • 既知の配置なしでビットを提案するには基準となる「塗りつぶし」タイルが必要です。辺だけの道テンプレートでは、そのタイルを選ぶまで推定を誤ることがあります。

バージョンと出典

Godot 4.7.2で検証:同梱のインポートスクリプトがヘッドレスでTileSetを作り、リソースを読み直してset_cells_terrain_connectで塗り、全セルをStudioの予測と比較しました。コーパスの各ブロブセットで485/485セル、4地形のデュアルグリッドパックで251/251セルが一致しました。上のエディターのメニューとノード名はGodot 4.7の公式ドキュメントに基づきます。

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

よくある質問

.tresファイルで書き出しますか?

いいえ。PNG、JSON、Godot内でTileSetを作るGDScriptを出力します。リソースはGodot自身が書き、この流れ全体をGodot 4.7.2で検証しました。

Godotとセル単位で一致しますか?

テストコーパスで、Godot 4.7.2で塗った全セルがStudioのプレビューと一致しました(各ブロブセット485/485、デュアルグリッド251/251)。

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

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

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

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

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

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