【Godot】TileMapLayer入門 - タイルマップの基礎と当たり判定・複数レイヤー

作成: 2026-07-09

Godot 4.3+のTileMapLayerで2Dマップを作る基礎を解説。TileMapLayerとTileSetの関係、タイルへの当たり判定(物理レイヤー)の付け方、地面と装飾を複数レイヤーに分ける方法、set_cellでのスクリプト配置までを図解します。

2Dゲームの地面や壁、洞窟、街並み——これらを1枚ずつスプライトで並べるのは大変です。そこで使うのが タイルマップ 。小さなタイル(絵)を格子状に敷き詰めて、広いマップを効率よく作る仕組みです。

Godot 4.3以降では、この主役が TileMapLayer ノードになりました。この記事では、TileMapLayerと TileSet の関係から、タイルに 当たり判定 を付ける方法、地面と装飾を 複数レイヤー に分けるコツ、そして スクリプトからタイルを配置 する方法まで、基礎をひととおり解説します。

タイルマップのイメージ。小さなタイルを格子状に敷き詰めて、地面や壁のある2Dマップを組み立てていく

この記事でわかること

  • TileMapLayerTileSet の関係(地図と絵の具箱)
  • タイルに 当たり判定 を付ける(物理レイヤー)
  • 地面・装飾を 複数のTileMapLayer に分ける
  • set_cellスクリプトからタイルを配置 する

Sponsored

TileMapLayerとTileSet:地図と絵の具箱

タイルマップは、2つの部品でできています。 TileSetTileMapLayer です。役割がはっきり分かれているので、まずここを押さえましょう。

TileMapLayerとTileSetの関係図。TileSetはタイル画像を切り分けて登録した絵の具箱(パレット)、TileMapLayerはそのタイルを格子に敷いてマップを作る地図。1つのTileSetを複数のTileMapLayerが共有できる
  • TileSet(絵の具箱) :「どんなタイルがあるか」を定義する リソース です。タイル画像を格子で切り分け、1マスずつを「使えるタイル」として登録します。
  • TileMapLayer(地図) :「そのタイルをどこに敷くか」を担う ノード です。パレットからタイルを選び、格子の上をなぞって配置します。

作る手順はシンプルです。シーンに TileMapLayer ノードを追加し、インスペクタの「Tile Set」から新しいTileSetを作成、タイル画像を登録します。あとはエディタ下部のTileMapパネルで、タイルを選んでマップに描いていくだけです。

補足: Godot 4.3で、旧 TileMap ノードは TileMapLayer に置き換えられ非推奨 になりました。ノード作成時は TileMapLayer を選びます。1つのTileSetは複数のTileMapLayerで共有できるので、絵の具箱は1つ、地図は何枚でも、という使い方ができます。

タイルに当たり判定を付ける

床の上をプレイヤーが歩き、壁で止まる——この 当たり判定 は、タイル1枚ずつに持たせます。付け方は「TileSetに物理レイヤーを追加し、各タイルに衝突の形を描く」だけです。

タイルの物理レイヤーの図。TileSetエディタで物理レイヤーを追加し、床タイルにコリジョンポリゴン(衝突形状)を描くと、そのタイルが敷かれたマップ上の全ての場所に自動で当たり判定が生まれ、プレイヤーが床に乗れるようになる
  1. TileSetエディタの「Physics Layers(物理レイヤー)」を1つ追加する
  2. 各タイルを選び、そのタイルに コリジョンポリゴン(衝突の形) を描く

これだけで、そのタイルが敷かれた場所すべてに 自動で当たり判定 が生まれます。何百枚の床タイルを置いても、当たり判定を1つずつ設定する必要はありません。タイル側に一度描けば、あとは敷くだけです。プレイヤー(CharacterBody2D)は、この当たり判定に乗って歩けるようになります(2D物理ボディの使い分け 参照)。

Sponsored

複数のTileMapLayerでレイヤー分け

マップは1枚のTileMapLayerだけでも作れますが、 役割ごとにノードを分ける と管理がぐっと楽になります。Godot 4.3では1つの TileMapLayer が1つのレイヤーなので、地面・装飾などを別々のノードにします。

複数TileMapLayerの重ね合わせ図。背景レイヤー・地面レイヤー・装飾レイヤーの3枚のTileMapLayerが重なり、合成されて1つの完成したマップになる。ツリーで下のノードほど手前に描画される
Level (Node2D)
├── Background (TileMapLayer)   # 背景(空・遠景)
├── Ground (TileMapLayer)       # 地面・壁(当たり判定つき)
└── Decoration (TileMapLayer)   # 草・小物(地面の上に重ねる)
  • 描画順(重なり) :ツリーで 下にあるノードほど手前 に描かれます。地面の上に草を重ねたいなら、DecorationGround より下に置きます。
  • 役割の分離 :当たり判定は Ground だけに持たせ、Decoration(草や看板)は当たり判定なしにする、といった分け方ができます。「当たる地面」と「飾りだけの装飾」を混ぜないのがコツです。

物理レイヤーとTileMapLayerは別物 です。「物理レイヤー」はTileSet内でタイルに当たり判定を持たせる設定、「TileMapLayer(ノード)」はマップの1枚を担うノードです。名前が似ていますが、前者はタイルの性質、後者は地図の重なり、と役割が違います。

実践:スクリプトでタイルを配置する

タイルはエディタで手描きするだけでなく、 コードから動的に配置 できます。ローグライクの自動生成ダンジョン、サンドボックスの地形破壊、シミュレーションの地形生成——「マップをルールで作る」ジャンルで活躍します。

set_cellによるタイル配置の図。コードでset_cell(座標, source_id, atlas_coords)を呼ぶと、指定した格子の座標にTileSetの該当タイルが1枚配置される。これを繰り返してマップをプログラムで組み立てる

鍵になるのが set_cell() です。「この座標に、TileSetのこのタイルを置く」と指定します。ここで出てくる source_idatlas_coords は、 「どのタイル画像の、何列目・何行目のタイルか」 を指す番地です。

source_idとatlas_coordsの図。TileSetに登録したタイル画像(アトラス)は格子で区切られ、各マスに(0,0)(1,0)(2,0)...とアトラス座標が振られている。set_cellのsource_idはどの画像か、atlas_coordsはその中のどのマスかを指す
extends TileMapLayer

func _ready() -> void:
    # 座標(3, 5)に、source_id=0・アトラス座標(2, 0)のタイルを置く
    set_cell(Vector2i(3, 5), 0, Vector2i(2, 0))

    # 10x10の床をまとめて敷く
    for x in 10:
        for y in 10:
            set_cell(Vector2i(x, y), 0, Vector2i(1, 1))

    # 座標(3, 5)のタイルを消す
    erase_cell(Vector2i(3, 5))

ポイントは2つです。

  • set_cell はレイヤー引数が不要TileMapLayer は1ノード=1レイヤーなので、set_cell(座標, source_id, atlas座標) と書きます。旧 TileMapset_cell(layer, ...) とは違うので、古い記事のコードには注意してください。消すときは erase_cell(座標) です。
  • 生成アルゴリズムは「どの座標を何にするか」だけ :ランダムウォークやセルオートマトンなどで「床にする座標」を決め、あとは set_cell で敷くだけ。境界タイルの自動接続まで欲しくなったら、Terrains(オートタイル)set_cells_terrain_connect() が次の一手です。

おまけ:先に知っておくと良いこと

  • 境界タイルを自動で選ばせたい :草と土の境目などを1枚ずつ選ぶのは大変です。Terrains(オートタイル) を使うと、地形を塗るだけでエンジンが境界タイルを自動配置してくれます。この記事の基礎ができたら、次はこちらへ。
  • マップの上を敵に歩かせたい :タイルマップから経路探索用のメッシュを作れます。NavigationRegion2Dとナビゲーションメッシュ が入口です。
  • 広いマップはカメラでスクロール :画面より大きいマップは Camera2D で追従・スクロールさせて見せます。

まとめ

  • TileSet は「どんなタイルがあるか」の絵の具箱、TileMapLayer は「どこに敷くか」の地図。1つのTileSetを複数レイヤーで共有できる
  • Godot 4.3以降は TileMapLayer を使う(旧 TileMap は非推奨)
  • 当たり判定 はTileSetの物理レイヤーで各タイルに持たせる。敷けば自動で判定が付く
  • 地面・装飾は 別のTileMapLayer に分け、下のノードほど手前に描画される
  • set_cell(座標, source_id, atlas座標) でスクリプトからタイルを配置できる(レイヤー引数なし)

まずは床タイルに物理レイヤーを付け、その上をプレイヤーが歩けるところまで作ってみてください。タイルマップは、2Dゲームのステージ作りの土台になります。

さらに学ぶために