Godotのリストに戻る

【Godot】Terrains機能でオートタイル(自動タイル配置)を設定する

作成: 2025-06-20更新: 2025-08-14マップブログ記事を読む

概要

GodotのTerrains機能を使って、タイルの境界を自動判定する「オートタイル」システムを設定する

設定手順

1. TileMapLayerノードの作成

まず、TileMapLayerノードを作成します。

TileMapLayerノードの作成

2. TileSetリソースの準備

TileMapLayerのインスペクタでTile Setプロパティから「New TileSet」を選択します。

新しいTileSetの作成

3. タイルシートの追加

TileSetエディタが開いたら、Tile Sourcesタブでタイルシート画像を追加します。Setupモードで基本的なタイル分割を設定します。

TileSetウィンドウ

4. Terrainsプロパティの設定

Paintモードに切り替えて、Paint PropertiesからTerrainsを選択します。

Terrainsプロパティ

5. Terrain Setsの設定

TileMapLayerのインスペクタで、Terrain Setsセクションを開きます。

Terrain Sets設定

Terrain Sets Modeについて

Modeには以下の3種類があります:

  • Match Corners and Sides: 辺と角の両方を考慮(最も細かい制御)
  • Match Corners: 角のみを考慮(47タイル構成用)
  • Match Sides: 辺のみを考慮(シンプルな接続)

通常は「Match Corners and Sides」を使用することで、最も自然な地形の接続が可能になります。

6. Terrainの定義

Add Elementボタンで新しいTerrainを追加し、名前と色を設定します(例:Forest Terrain、草、土、水など)。

7. タイルへのTerrainペイント

使用するTerrainタイルを選択してハイライトし、各タイルの接続パターンを設定します。

Terrainペイント設定

ピンクで塗られた部分が、そのTerrainに属することを示します。

完成したTerrain設定

タイルの種類:

  • 中央タイル: 全ての辺が同じTerrain
  • 境界タイル: 異なるTerrainが接する
  • 角タイル: 3方向以上の接続パターン

必要なパターン数(2地形の場合):

  • 中央(1種)
  • 直線境界(4種)
  • 外角(4種)
  • 内角(4種)
  • 特殊パターン(3種)

この設定は非常に混乱する部分なので、動画チュートリアル等で学習することをオススメします。

使用方法

マップへのペイント

  1. TileMapエディタで「Terrains」描画モードを選択
  2. 使用したいTerrainを選択
  3. マップ上でペイント(自動的に適切なタイルが配置される)
Terrainsを使ったペイント

便利な機能

ランダムタイル

草原タイルを配置するとき、黄緑一色だと単調すぎるので、草や砂利の混じった画像をあとから配置して自然な地形にデザインします。

GodotのTerrain機能では、この平地パターンを複数登録することができ、各タイルのProbability(出現頻度)を調整して、1ドラッグで自動的に草や砂利の混じったタイルを配置できます。この機能はダイスアイコンから切り替えることができます。

Physics一括設定

「F」キーで全タイルに衝突判定を一括適用できます。

スクリプトからの制御

extends TileMap

# Terrainを使用したタイル配置
func place_terrain_tile(coords: Vector2i, terrain_id: int):
    set_cells_terrain_connect(
        0,  # レイヤー
        [coords],  # 座標配列
        0,  # Terrainセット
        terrain_id  # Terrain ID
    )

# エリア全体をTerrainで塗りつぶし
func fill_area_with_terrain(start: Vector2i, end: Vector2i, terrain_id: int):
    var cells = []
    for x in range(start.x, end.x + 1):
        for y in range(start.y, end.y + 1):
            cells.append(Vector2i(x, y))
    
    set_cells_terrain_connect(0, cells, 0, terrain_id)

トラブルシューティング

境界がうまく繋がらない場合

  1. ペイント設定を再確認
  2. 全ての必要パターンが存在するか確認
  3. Terrain IDが正しいか確認

パフォーマンスの問題

大量のタイル更新はset_cells_terrain_connect()で一括更新してください。個別のset_cell()呼び出しは避けてください。

実装して学んだこと

Terrains機能により、マップ作成の効率が大幅に向上します。特に地形の修正が必要な場合、塗り直すだけで境界タイルが自動更新されるため、手動配置と比べて作業時間を大幅に削減できます。初期設定に時間はかかりますが、その後の作業効率を考えると十分な投資価値があります。