はじめに
Godot 4を使ってゲーム開発を始める際、マップやステージの作成は欠かせません。TileMapノードは、タイルセット(小さなグラフィック部品)を組み合わせて、効率的に大規模なマップを作成するための強力なツールです。2Dゲーム開発において、TileMapを理解することは、プロトタイプから完成作まで、開発スピードを劇的に向上させます。
このノードの真価は、単に「複数のタイルを並べる」だけではなく、レイヤーシステム、自動配置、コリジョン設定など、多くの高度な機能にあります。本記事では、TileMapの基本的な使い方から実践的なカスタマイズまで、段階的に解説していきます。
TileMapとは?
TileMapは、タイルセットという小さなグラフィック部品を座標指定で配置し、マップを効率的に構築するノードです。Godot 4では改良が加えられ、複数レイヤーの管理、自動タイル、物理シミュレーションとの連携など、より強力な機能を備えています。
「TileMapはレゴブロックのベースプレートのようなものです。タイルセットというパーツセットを使って、座標指定でマップを組み立てます。一つ一つ手描きするのではなく、プリセットされたパーツを効率よく組み合わせることで、膨大なマップを素早く作成できます。」
継承ツリー:
TileMap ↓ Node2D ↓ CanvasItem ↓ Node

このノードを使うべき場面
TileMapは以下のような場面での使用に最適です:
- RPGのフィールドマップ – 草原、森、建物、道路などを組み合わせた広大なマップを作成。キャラクターが歩き回る世界観を効率的に構築できます。
- プラットフォーマーの地形 – 跳ねるキャラクターのための壁や床、スパイク、動く床などを配置。物理演算と組み合わせて、ゲームメカニクスを実装します。
- パズルゲームのグリッド – マッチング、スイッチ、圧縮などの要素をグリッドベースで配置。ルールベースのゲームロジックと親和性が高いです。
- ローグライクのダンジョン自動生成 – 壁、床、敵スポーンポイントをプログラムで動的に配置。手作業で大量のダンジョンを用意しなくても、無限にバリエーション豊かなマップを生成できます。
別のノードが適切な場面:TileMapは「静的な背景」に向いているため、キャラクター、敵、アイテムなど「動的に振る舞うオブジェクト」は個別のノード(Sprite2D + RigidBody2D など)で実装するのが適切です。複雑な背景ディテールは、TileMapの上にSpriteを重ねることで表現できます。
主なプロパティと機能
| プロパティ/メソッド | 型 | 説明 |
|---|---|---|
tile_set |
TileSet | このTileMapが使用するタイルセットリソースを指定 |
set_cell(layer, coords, source_id, atlas_coords) |
void | 指定座標にタイルを配置。layerはレイヤーID、coordsはVector2i座標、source_idはタイルセット内のソースID、atlas_coordsはアトラス内の位置 |
get_cell_source_id(layer, coords) |
int | 指定座標のタイルのソースIDを取得。タイルがない場合は-1 |
erase_cell(layer, coords) |
void | 指定座標のタイルを削除 |
get_used_cells(layer) |
Array[Vector2i] | 指定レイヤーで使用されているすべてのセル座標を配列で返す |
clear_layer(layer) |
void | 指定レイヤーのすべてのタイルを削除 |
add_layer(to_position) |
void | 新しいレイヤーを追加 |
tile_size |
Vector2i | 1つのタイルのピクセルサイズ(例:16×16)。TileSetで定義 |
コード例1:基本的なTileMapの設定と動的なタイル配置
extends Node2D
@onready var tilemap = $TileMap
func _ready():
# TileMapにタイルセットを割り当て(Inspectorで設定済みの場合は不要)
# tilemap.tile_set = preload("res://assets/tileset.tres")
# 10x10の草原マップを生成
for x in range(10):
for y in range(10):
# レイヤー0に座標(x,y)へソースID 0のタイルを配置
tilemap.set_cell(0, Vector2i(x, y), 0, Vector2i(0, 0))
# 中央に岩のタイルを配置(ソースID 1)
tilemap.set_cell(0, Vector2i(5, 5), 1, Vector2i(0, 0))
func _input(event):
if event is InputEventMouseButton and event.pressed:
# マウスクリック位置のワールド座標を取得
var world_pos = get_global_mouse_position()
# ワールド座標をセル座標に変換
var cell_pos = tilemap.local_to_map(tilemap.get_local_mouse_position())
# そのセルに木のタイルを配置(ソースID 2)
tilemap.set_cell(0, cell_pos, 2, Vector2i(0, 0))
print("タイルを配置: ", cell_pos)
func clear_all_tiles():
# レイヤー0をすべてクリア
tilemap.clear_layer(0)
コード例2:動的なマップ生成とセル情報の取得
extends Node2D
@onready var tilemap = $TileMap
func _ready():
generate_dungeon()
func generate_dungeon():
# ランダムなダンジョンマップを生成
var width = 30
var height = 20
for x in range(width):
for y in range(height):
var is_wall = randf() < 0.2 # 20%の確率で壁
var source_id = 1 if is_wall else 0 # 1=壁、0=床
tilemap.set_cell(0, Vector2i(x, y), source_id, Vector2i(0, 0))
# 使用されているセル情報を表示
var used_cells = tilemap.get_used_cells(0)
print("配置されたタイルの数: ", used_cells.size())
func remove_tile_at(cell_pos: Vector2i):
# 指定座標のタイルを削除
tilemap.erase_cell(0, cell_pos)
func get_tile_type_at(cell_pos: Vector2i) -> int:
# 指定座標のタイルのソースIDを取得
return tilemap.get_cell_source_id(0, cell_pos)
func _input(event):
if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_RIGHT:
# 右クリックでタイルを削除
var cell_pos = tilemap.local_to_map(tilemap.get_local_mouse_position())
remove_tile_at(cell_pos)

もっと使いこなす:カスタマイズできるパラメータ
| 設定項目 | 説明 | 推奨値・用途 |
|---|---|---|
layer_*/collision_enabled |
特定レイヤーの物理コリジョン有効化 | 壁や床レイヤーはON、装飾レイヤーはOFF |
layer_*/y_sort_enabled |
Y座標に基づく自動ソート | キャラクターと地形の重なり判定が正確に。RPGに有効 |
layer_*/tile_data_runtime_update |
実行時のタイル更新の最適化 | フレーム中に大量のタイル変更があれば有効 |
rendering_quadrant_size |
レンダリング最適化のグリッドサイズ | 大規模マップなら16や32。小規模なら8 |
use_local_coordinates |
ローカル座標系を使用 | マップをスクロールさせる場合はON |
まとめ
TileMapはGodot 4における2Dマップ作成の基盤です。シンプルな操作で複雑なマップを効率的に構築でき、レイヤーシステムで奥行きを表現でき、物理演算と統合できる。ゲーム開発の初期段階から本格的な制作まで、長く付き合うノードとなるでしょう。タイルセットの設計、レイヤー戦略、動的な生成ロジックを組み合わせることで、無限の可能性が広がります。
- TileMapはタイルセットを座標指定で配置し、効率的にマップを構築
- 複数レイヤーを活用して、背景・地形・装飾の奥行きを表現
- set_cell()、erase_cell()などのメソッドで動的にマップを変更可能
次回はCamera2Dについて解説します。プレイヤーを追従するカメラの実装方法や、スムーズなスクロール効果を実現するテクニックを学びます。
シリーズ:Godot 4 ノード解説
- 001〜090:各種ノード
- 091:TileMap(この記事)
- 092:Camera2D
- 093:VisibleOnScreenNotifier2D
- 094:RemoteTransform2D
- 095:PointLight2D
この記事はGodot 4.xをもとに執筆しています。


コメント