Godot入門:TileMapの使い方と活用法






Godot入門:TileMapの使い方と活用法


はじめに

Godot 4を使ってゲーム開発を始める際、マップやステージの作成は欠かせません。TileMapノードは、タイルセット(小さなグラフィック部品)を組み合わせて、効率的に大規模なマップを作成するための強力なツールです。2Dゲーム開発において、TileMapを理解することは、プロトタイプから完成作まで、開発スピードを劇的に向上させます。

このノードの真価は、単に「複数のタイルを並べる」だけではなく、レイヤーシステム、自動配置、コリジョン設定など、多くの高度な機能にあります。本記事では、TileMapの基本的な使い方から実践的なカスタマイズまで、段階的に解説していきます。

TileMapとは?

TileMapは、タイルセットという小さなグラフィック部品を座標指定で配置し、マップを効率的に構築するノードです。Godot 4では改良が加えられ、複数レイヤーの管理、自動タイル、物理シミュレーションとの連携など、より強力な機能を備えています。

「TileMapはレゴブロックのベースプレートのようなものです。タイルセットというパーツセットを使って、座標指定でマップを組み立てます。一つ一つ手描きするのではなく、プリセットされたパーツを効率よく組み合わせることで、膨大なマップを素早く作成できます。」

継承ツリー:

TileMap
  ↓
Node2D
  ↓
CanvasItem
  ↓
Node




TileMapの基本構造とタイルセットの関係
図1:TileMapはTileSetを使って座標グリッドにタイルを配置。レイヤーで奥行きを表現

このノードを使うべき場面

TileMapは以下のような場面での使用に最適です:

  1. RPGのフィールドマップ – 草原、森、建物、道路などを組み合わせた広大なマップを作成。キャラクターが歩き回る世界観を効率的に構築できます。
  2. プラットフォーマーの地形 – 跳ねるキャラクターのための壁や床、スパイク、動く床などを配置。物理演算と組み合わせて、ゲームメカニクスを実装します。
  3. パズルゲームのグリッド – マッチング、スイッチ、圧縮などの要素をグリッドベースで配置。ルールベースのゲームロジックと親和性が高いです。
  4. ローグライクのダンジョン自動生成 – 壁、床、敵スポーンポイントをプログラムで動的に配置。手作業で大量のダンジョンを用意しなくても、無限にバリエーション豊かなマップを生成できます。

別のノードが適切な場面: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)




複数レイヤーによる奥行き表現
図2:背景・地形・装飾の3レイヤーでマップに奥行きと複雑さを実現

もっと使いこなす:カスタマイズできるパラメータ

設定項目 説明 推奨値・用途
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 ノード解説

この記事はGodot 4.xをもとに執筆しています。


コメント