Godot のタイルマップは、草地、道路、壁、水面などの小さな画像を含む素材シートを規則的なグリッドに分割し、それを絵を描くように並べてステージを作る仕組みです。
Godot 4.x、特に 4.3 以降の新規プロジェクトでは TileMapLayer を使うのがおすすめです。古い TileMap ノードは非推奨になっています。現在は、1 つのマップレイヤーに 1 つの TileMapLayer ノードを対応させる考え方がより自然です。階層が分かりやすくなり、Godot のノード構造にも合います。
公式ドキュメントでも、TileMapLayer は 2D tile-based maps 用のノードであり、TileSet を使ってグリッドマップを作成すると説明されています。複数レイヤーが必要な場合は、複数の TileMapLayer を使います。
公式ドキュメント:
https://docs.godotengine.org/en/stable/classes/class_tilemaplayer.html
https://docs.godotengine.org/en/latest/tutorials/2d/using_tilemaps.html
まず理解したい 2 つの概念
タイルマップで重要なのは次の 2 つです。
TileSetTileMapLayer
TileSet はタイル素材ライブラリです。ここには次の情報を保存します。
- 草地、土、壁、水面、道路などのタイル。
- 各タイルの衝突形状。
- Terrain の自動接続ルール。
- ナビゲーション、遮蔽、カスタムデータ。
TileMapLayer はキャンバスです。TileSet 内のタイルを使ってマップを描画します。
最初は次のようなノード構造から始めると分かりやすいです。
|
|
レイヤーを分ける利点は明確です。
- 地面と壁が混ざらない。
- 表示順を個別に設定できる。
- 特定のレイヤーだけ非表示にできる。
- 壁レイヤーだけに衝突を付け、地面レイヤーはシンプルに保てる。
- 後で Codex にスクリプトを書かせるとき、ノードの責務が明確になる。
最初のタイルマップを作る
まずタイル画像を用意します。たとえば:
|
|
画像内の各セルは同じサイズにします。よくあるサイズは次の通りです。
|
|
素材の 1 タイルが 32 × 32 なら、TileSet の Tile Size も 32 × 32 にします。
TileMapLayer を追加する
シーンに次を追加します。
|
|
TileMapLayer の名前を次に変更します。
|
|
Ground を選択し、Inspector で次を探します。
|
|
クリックします。
|
|
作成した TileSet リソースを開き、素材のグリッドサイズに合わせて Tile Size を設定します。例:
|
|
タイル素材を追加する
Ground を選択すると、下部に TileMap / TileSet 編集パネルが表示されます。
tileset.png を TileSet パネルにドラッグし、自動タイル作成を選びます。Godot は Tile Size に従って画像を小さなタイルに分割します。
これで TileSet に描画可能なタイルが入り、Ground という TileMapLayer でマップを描けるようになります。
マップを描く
下部の TileMap パネルに切り替えます。
- 草地タイルを選ぶ。
- 鉛筆ツールで描く。
- 消しゴムで削除する。
- 矩形ツールで領域を素早く塗る。
- 塗りつぶしツールで連続領域をまとめて埋める。
最初から大きなマップを作る必要はありません。まずは 20 × 15 の小さなマップを作り、草地、壁、プレイヤーのスポーン地点だけを置けば十分です。
壁に衝突を追加する
すべての地面タイルに衝突を付ける必要はありません。通常は、通行できないものだけに衝突を付けます。
- 壁。
- 岩。
- 柵。
- 水域の境界。
- 崖。
TileSet リソースを選択し、Inspector で次を探します。
|
|
クリックします。
|
|
一般的な設定は次のようになります。
|
|
次に下部の TileSet パネルで:
- 衝突または物理描画ツールに切り替える。
- 壁タイルを選択する。
- 壁部分に矩形または多角形の衝突形状を描く。
こうすると、同じ TileSet 内のタイルごとに異なる衝突形状を持たせられます。
プレイヤーをタイルの壁で止める
プレイヤーシーンは次のように作れます。
|
|
移動スクリプトは最小構成から始めます。
|
|
Player の衝突レイヤーとマスクが TileSet の物理レイヤーと一致していれば、プレイヤーは壁タイルにぶつかって止まります。
実行中は次を有効にすると便利です。
|
|
壁とプレイヤーの衝突形状を直接確認できるので、デバッグがかなり楽になります。
マップは 3 レイヤーに分ける
初心者のうちは、次の 3 レイヤーがおすすめです。
|
|
各ノードは独立した TileMapLayer です。
Ground に置くもの:
- 草地。
- 土。
- 道路。
- 床。
通常は衝突なしです。
Walls に置くもの:
- 壁。
- 崖。
- 水域の境界。
- 通行できない岩。
通常は衝突ありです。
Decoration に置くもの:
- 小さな花。
- 草。
- 地面のひび割れ。
- 影。
通常は衝突なしです。
基本的な表示順は z_index で制御できます。
|
|
木、屋根、橋の下など、プレイヤーを隠す必要があるものは、後で Y Sort を使うか、上下のパーツに分けて処理します。最初のマップから遮蔽システムを複雑にする必要はありません。
Terrain で道路や壁を自動接続する
次のようなことをしたい場合は:
- 草地と土の境界を自動でつなぐ。
- 道路の角を自動生成する。
- 壁が上下左右を見て適切なタイルを選ぶ。
- 水面に岸辺を自動生成する。
Godot の Terrain Set を使います。
基本的な流れは次の通りです。
TileSetにTerrain Setを追加する。- 辺や角で一致させるなど、マッチングモードを設定する。
Grass、Dirt、Waterなどの Terrain を作る。- 各タイルに地形接続位置を設定する。
TileMapLayerをTerrains描画モードに切り替える。ConnectまたはPathツールでマップを描く。
Godot は周囲のセルを見て、直線、角、端のタイルを自動選択します。公式ドキュメントでも Terrain の描画モードとして Connect と Path が説明されています。Connect は始めやすく、Path は道路や道をより細かく制御したい場合に向いています。
最初から Terrain を覚える必要はありません。まずは手動で小さなマップを描き、TileSet、TileMapLayer、衝突を理解してから自動接続に進むとよいです。
コードからタイルを操作する
シーン構造が次の場合:
|
|
World スクリプトから Ground を参照できます。
|
|
ここで cell はマップのセル座標です。たとえば:
|
|
これは 5 列目、3 行目に草地タイルを置くという意味です。
注意:SOURCE_ID と GRASS_TILE の atlas 座標は、実際の TileSet に合わせる必要があります。サンプル値をそのまま使わないでください。
ワールド座標とセル座標を変換する
マウスクリック位置はワールド座標ですが、タイルマップはセル座標を使います。通常は、まずそのレイヤーのローカル座標に変換し、それからマップセルに変換します。
ワールド座標からセル座標へ:
|
|
セル座標からマップ上の位置へ:
|
|
マウスクリックでタイルを置くなら、次のように書けます。
|
|
右クリックでタイルを削除したい場合は、次を使います。
|
|
set_cell()、erase_cell()、local_to_map()、map_to_local() は TileMapLayer でよく使う API です。
宝箱、ドア、コインをすべて普通のタイルにしない
次のようなオブジェクトは、普通の画像タイルだけにするのはあまり向いていません。
- コイン。
- 宝箱。
- 開けられるドア。
- NPC。
- 敵。
- ワープ地点。
- 仕掛け。
- 壊せる箱。
これらはスクリプト、アニメーション、衝突、シグナルを持つため、独立したシーンにする方が扱いやすいです。
たとえばコイン:
|
|
次の下に配置します。
|
|
普通のタイルは静的マップに向いています。振る舞いを持つオブジェクトは独立した Scene にした方がよいです。Godot には Scene Collection タイルもありますが、初心者のうちは独立シーンを手動配置する方が理解しやすく、デバッグもしやすいです。
Codex が得意なこと
Codex は次のような作業に向いています。
- プレイヤー移動スクリプトを書く。
- マップセルを読み取る。
- プロシージャルにマップを生成する。
- 地面タイルをランダム配置する。
- マウスでタイルを配置・削除する。
- スポーン地点を探す。
- カスタムタイルデータを読む。
TileMapLayerAPI の使い方を確認する。- コイン、ドア、宝箱のロジックを実装する。
Codex には次のように依頼できます。
|
|
Codex があまり得意でないこと:
- 素材を何ピクセルで切るべきか判断する。
- マップ全体を視覚的に描く。
- Terrain のビットマスクを細かく設定する。
source_idを推測する。- atlas 座標を推測する。
- 大量の
.tscnマップデータを手書きする。
より自然な分担は、Godot エディタで TileSet を作り、衝突を設定し、マップを描くのはあなたが行い、Codex には実際のノード構造に沿ってマップ操作、生成ロジック、ゲームプレイスクリプトを書かせることです。
最初の練習
最初の練習では、20 × 15 の小さなマップだけを作るのがおすすめです。
Groundに草地を敷く。Wallsに壁を一周描く。- 壁タイルに衝突を設定する。
Playerを配置する。- プレイヤーが壁に遮られるようにする。
- その後で
Coinシーンを追加する。
この練習が終わると、Godot のタイルマップの基本的な流れが理解できます。
|
|
まずはこの最小マップを動かしましょう。その後で Terrain、Y Sort、プロシージャル生成、大規模マップ読み込みに進む方が安定します。