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 つです。
TileSet
TileMapLayer
TileSet はタイル素材ライブラリです。ここには次の情報を保存します。
- 草地、土、壁、水面、道路などのタイル。
- 各タイルの衝突形状。
- Terrain の自動接続ルール。
- ナビゲーション、遮蔽、カスタムデータ。
TileMapLayer はキャンバスです。TileSet 内のタイルを使ってマップを描画します。
最初は次のようなノード構造から始めると分かりやすいです。
1
2
3
4
5
6
|
World (Node2D)
├─ Ground (TileMapLayer) # 草地、道路、床
├─ Decoration (TileMapLayer) # 花、ひび割れ、影
├─ Walls (TileMapLayer) # 壁、障害物
├─ Objects (Node2D) # 宝箱、ドア、NPC、コイン
└─ Player (CharacterBody2D)
|
レイヤーを分ける利点は明確です。
- 地面と壁が混ざらない。
- 表示順を個別に設定できる。
- 特定のレイヤーだけ非表示にできる。
- 壁レイヤーだけに衝突を付け、地面レイヤーはシンプルに保てる。
- 後で Codex にスクリプトを書かせるとき、ノードの責務が明確になる。
最初のタイルマップを作る
まずタイル画像を用意します。たとえば:
画像内の各セルは同じサイズにします。よくあるサイズは次の通りです。
1
2
3
|
16 × 16
32 × 32
64 × 64
|
素材の 1 タイルが 32 × 32 なら、TileSet の Tile Size も 32 × 32 にします。
TileMapLayer を追加する
シーンに次を追加します。
1
2
|
Node2D
└─ TileMapLayer
|
TileMapLayer の名前を次に変更します。
Ground を選択し、Inspector で次を探します。
クリックします。
1
2
|
<empty>
→ New TileSet
|
作成した TileSet リソースを開き、素材のグリッドサイズに合わせて Tile Size を設定します。例:
タイル素材を追加する
Ground を選択すると、下部に TileMap / TileSet 編集パネルが表示されます。
tileset.png を TileSet パネルにドラッグし、自動タイル作成を選びます。Godot は Tile Size に従って画像を小さなタイルに分割します。
これで TileSet に描画可能なタイルが入り、Ground という TileMapLayer でマップを描けるようになります。
マップを描く
下部の TileMap パネルに切り替えます。
- 草地タイルを選ぶ。
- 鉛筆ツールで描く。
- 消しゴムで削除する。
- 矩形ツールで領域を素早く塗る。
- 塗りつぶしツールで連続領域をまとめて埋める。
最初から大きなマップを作る必要はありません。まずは 20 × 15 の小さなマップを作り、草地、壁、プレイヤーのスポーン地点だけを置けば十分です。
壁に衝突を追加する
すべての地面タイルに衝突を付ける必要はありません。通常は、通行できないものだけに衝突を付けます。
- 壁。
- 岩。
- 柵。
- 水域の境界。
- 崖。
TileSet リソースを選択し、Inspector で次を探します。
クリックします。
一般的な設定は次のようになります。
1
2
|
Collision Layer: 1
Collision Mask: 1
|
次に下部の TileSet パネルで:
- 衝突または物理描画ツールに切り替える。
- 壁タイルを選択する。
- 壁部分に矩形または多角形の衝突形状を描く。
こうすると、同じ TileSet 内のタイルごとに異なる衝突形状を持たせられます。
プレイヤーをタイルの壁で止める
プレイヤーシーンは次のように作れます。
1
2
3
|
Player (CharacterBody2D)
├─ Sprite2D
└─ CollisionShape2D
|
移動スクリプトは最小構成から始めます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
extends CharacterBody2D
@export var speed: float = 200.0
func _physics_process(_delta: float) -> void:
var direction := Input.get_vector(
"move_left",
"move_right",
"move_up",
"move_down"
)
velocity = direction * speed
move_and_slide()
|
Player の衝突レイヤーとマスクが TileSet の物理レイヤーと一致していれば、プレイヤーは壁タイルにぶつかって止まります。
実行中は次を有効にすると便利です。
1
2
|
Debug
→ Visible Collision Shapes
|
壁とプレイヤーの衝突形状を直接確認できるので、デバッグがかなり楽になります。
マップは 3 レイヤーに分ける
初心者のうちは、次の 3 レイヤーがおすすめです。
1
2
3
4
|
World
├─ Ground
├─ Walls
└─ Decoration
|
各ノードは独立した TileMapLayer です。
Ground に置くもの:
- 草地。
- 土。
- 道路。
- 床。
通常は衝突なしです。
Walls に置くもの:
- 壁。
- 崖。
- 水域の境界。
- 通行できない岩。
通常は衝突ありです。
Decoration に置くもの:
- 小さな花。
- 草。
- 地面のひび割れ。
- 影。
通常は衝突なしです。
基本的な表示順は z_index で制御できます。
1
2
3
4
|
Ground: 0
Walls: 1
Decoration: 2
Player: 3
|
木、屋根、橋の下など、プレイヤーを隠す必要があるものは、後で 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 を参照できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
extends Node2D
@onready var ground: TileMapLayer = $Ground
const SOURCE_ID: int = 0
const GRASS_TILE: Vector2i = Vector2i(0, 0)
func place_grass(cell: Vector2i) -> void:
ground.set_cell(
cell,
SOURCE_ID,
GRASS_TILE
)
|
ここで cell はマップのセル座標です。たとえば:
1
|
place_grass(Vector2i(5, 3))
|
これは 5 列目、3 行目に草地タイルを置くという意味です。
注意:SOURCE_ID と GRASS_TILE の atlas 座標は、実際の TileSet に合わせる必要があります。サンプル値をそのまま使わないでください。
ワールド座標とセル座標を変換する
マウスクリック位置はワールド座標ですが、タイルマップはセル座標を使います。通常は、まずそのレイヤーのローカル座標に変換し、それからマップセルに変換します。
ワールド座標からセル座標へ:
1
2
|
var local_position := ground.to_local(get_global_mouse_position())
var cell := ground.local_to_map(local_position)
|
セル座標からマップ上の位置へ:
1
|
var position_in_layer := ground.map_to_local(cell)
|
マウスクリックでタイルを置くなら、次のように書けます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
extends Node2D
@onready var ground: TileMapLayer = $Ground
const SOURCE_ID: int = 0
const GRASS_TILE: Vector2i = Vector2i(0, 0)
func _unhandled_input(event: InputEvent) -> void:
if event is InputEventMouseButton:
if event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
var local_position := ground.to_local(
get_global_mouse_position()
)
var cell := ground.local_to_map(local_position)
ground.set_cell(
cell,
SOURCE_ID,
GRASS_TILE
)
|
右クリックでタイルを削除したい場合は、次を使います。
1
|
ground.erase_cell(cell)
|
set_cell()、erase_cell()、local_to_map()、map_to_local() は TileMapLayer でよく使う API です。
宝箱、ドア、コインをすべて普通のタイルにしない
次のようなオブジェクトは、普通の画像タイルだけにするのはあまり向いていません。
- コイン。
- 宝箱。
- 開けられるドア。
- NPC。
- 敵。
- ワープ地点。
- 仕掛け。
- 壊せる箱。
これらはスクリプト、アニメーション、衝突、シグナルを持つため、独立したシーンにする方が扱いやすいです。
たとえばコイン:
1
2
3
|
Coin (Area2D)
├─ Sprite2D
└─ CollisionShape2D
|
次の下に配置します。
普通のタイルは静的マップに向いています。振る舞いを持つオブジェクトは独立した Scene にした方がよいです。Godot には Scene Collection タイルもありますが、初心者のうちは独立シーンを手動配置する方が理解しやすく、デバッグもしやすいです。
Codex が得意なこと
Codex は次のような作業に向いています。
- プレイヤー移動スクリプトを書く。
- マップセルを読み取る。
- プロシージャルにマップを生成する。
- 地面タイルをランダム配置する。
- マウスでタイルを配置・削除する。
- スポーン地点を探す。
- カスタムタイルデータを読む。
TileMapLayer API の使い方を確認する。
- コイン、ドア、宝箱のロジックを実装する。
Codex には次のように依頼できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
これは Godot 4.x プロジェクトです。
シーン構造:
World:Node2D
├─ Ground:TileMapLayer
├─ Walls:TileMapLayer
├─ Objects:Node2D
└─ Player:CharacterBody2D
World 用のスクリプトを書いてください:
1. マウスのワールド座標を Ground のセル座標に変換する;
2. 左クリックで草地タイルを配置する;
3. 右クリックでタイルを消す;
4. SOURCE_ID と atlas 座標は @export で設定できるようにする;
5. Godot 4.x TileMapLayer API を使う;
6. 静的型付けを使う;
7. TileSet とシーンノード名は変更しない。
|
Codex があまり得意でないこと:
- 素材を何ピクセルで切るべきか判断する。
- マップ全体を視覚的に描く。
- Terrain のビットマスクを細かく設定する。
source_id を推測する。
- atlas 座標を推測する。
- 大量の
.tscn マップデータを手書きする。
より自然な分担は、Godot エディタで TileSet を作り、衝突を設定し、マップを描くのはあなたが行い、Codex には実際のノード構造に沿ってマップ操作、生成ロジック、ゲームプレイスクリプトを書かせることです。
最初の練習
最初の練習では、20 × 15 の小さなマップだけを作るのがおすすめです。
Ground に草地を敷く。
Walls に壁を一周描く。
- 壁タイルに衝突を設定する。
Player を配置する。
- プレイヤーが壁に遮られるようにする。
- その後で
Coin シーンを追加する。
この練習が終わると、Godot のタイルマップの基本的な流れが理解できます。
1
2
3
4
5
|
TileSet はタイル素材とルールを持つ
TileMapLayer は 1 つのマップレイヤーを描画する
衝突は TileSet 内のタイルに設定する
振る舞いを持つオブジェクトは独立シーンにする
Codex は実際のノード構造に沿ってスクリプトを書く
|
まずはこの最小マップを動かしましょう。その後で Terrain、Y Sort、プロシージャル生成、大規模マップ読み込みに進む方が安定します。
AI で Godot TileSet を生成するプロンプト
AI で Godot の tileset を生成するとき、目的は「きれいなマップ」を描かせることではありません。本当に必要なのは、切り出しやすく、TileSet に読み込みやすく、規則的なグリッドとして扱えるタイル素材アトラスです。
重要な目標は次の通りです。
- 規則的なグリッド。
- 統一されたサイズ。
- 繰り返し配置できること。
- セルをまたがないこと。
- Godot でタイルとして切り出しやすいこと。
以下のプロンプトはそのままコピーして使えます。最初は基本地面版から始めるのがおすすめです。道路、水面、壁、装飾を最初から全部まとめて生成しようとすると、セルのズレ、接続ミス、スタイルのばらつきが起きやすくなります。
AI 出力に向いた簡略版
AI に接続タイルを一度に大量生成させると失敗しやすいです。最初は基本地面だけを生成します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
Godot 4 TileSet で使用できる、トップダウン視点のピクセル風タイルアトラスを生成してください。
要件:
- 厳密なトップダウン視点
- 1 タイルの論理サイズは 32×32
- 6 列 × 3 行の規則的なグリッド
- 透明背景
- すべてのセルサイズは完全に同一
- 文字、ラベル、UI、キャラクターなし
- 完成したマップを生成しない
- スタイルと光照を統一する
1 行目:
通常の草地、濃い草地、まばらな草地、土、砂地、石地
2 行目:
細い草、砕石、花、落ち葉、地面のひび割れ、小さなキノコ
3 行目:
明るい草地バリエーション、濃い土バリエーション、湿った土、苔むした石地、乾いた砂地、丸石の地面
技術要件:
- すべての地面タイルは上下左右にシームレスに繰り返し配置できること
- タイルの端に明確な継ぎ目が出ないこと
- 細部が隣のセルにはみ出さないこと
- 1 枚の PNG アトラスとして出力
|
この版は成功率が高めです。まず基本地面を生成し、スタイルとグリッドが使えることを確認してから、道路、水面、壁に進みます。
草地と土の自動接続版
これは後で Godot Terrain を設定するための版です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
Godot 4 Terrain システム向けの、トップダウン視点ピクセル風の草地と土の接続タイルセットを生成してください。
仕様:
- 1 タイルの論理サイズ:32×32
- 厳密なトップダウン視点
- 規則的なグリッド配置
- 透明背景
- 統一されたピクセル密度
- 統一された光源方向
- 文字なし、UI なし、キャラクターなし、完成シーンなし
必要なタイル:
- 純粋な草地中央
- 純粋な土中央
- 草地が土を囲む上端
- 下端
- 左端
- 右端
- 左上外角
- 右上外角
- 左下外角
- 右下外角
- 左上内角
- 右上内角
- 左下内角
- 右下内角
- 横方向の細い土の道
- 縦方向の細い土の道
- 十字接続
- T 字接続
すべての端のピクセルは厳密に対応し、シームレスに接続できること。
内角と外角を省略しないこと。
各接続タイルは 1 つの完全なグリッドセルを単独で占めること。
|
このタイプは AI が最も間違えやすいです。生成後は Aseprite、Krita、Photoshop などで内角、外角、T 字接続を手作業で補正することが多いです。
水面 tileset プロンプト
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
Godot 4 TileSet 向けの、トップダウン視点ピクセル風水面タイルアトラスを生成してください。
要件:
- 1 タイルの論理サイズ:32×32
- 規則的なグリッド配置
- 透明背景
- 厳密なトップダウン視点
- 水面の色と波紋スタイルを統一
- 文字、ラベル、UI、完成マップなし
内容:
- 水面中央
- 水面バリエーション 1
- 水面バリエーション 2
- 上岸辺
- 下岸辺
- 左岸辺
- 右岸辺
- 左上外角
- 右上外角
- 左下外角
- 右下外角
- 左上内角
- 右上内角
- 左下内角
- 右下内角
- 小さな波紋
- 浮かぶ葉
- 水中の石
岸辺には自然な土と少量の草を使用すること。
すべての端は上下左右にシームレスに接続できること。
各タイルの内容は自分のグリッド領域を越えないこと。
|
水面素材では、特に次の 2 点を確認します。
- 水面中央がシームレスに平铺できるか。
- 岸辺の上下左右、内角と外角が本当に接続できるか。
ダンジョン tileset プロンプト
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
Godot 4 向けのトップダウン視点ピクセル風ダンジョンタイル素材アトラスを生成してください。
仕様:
- 1 タイルの論理サイズ:32×32
- 6 列 × 5 行の規則的なグリッド
- 透明背景
- 厳密なトップダウン視点
- 暗灰色の石造りダンジョン風
- 統一されたピクセル密度と光源方向
- キャラクターなし、完成した部屋なし、UI と文字なし
内容:
- 通常の石床
- ひび割れた石床
- 苔むした石床
- 血痕のある石床
- 石壁中央
- 石壁上部
- 石壁左右端
- 壁の内角
- 壁の外角
- 扉口
- 鉄の扉
- 石柱
- 松明台
- 木箱
- 木樽
- 砕石
- 骨
- 鎖
- 床トラップ
すべての床タイルはシームレスに平铺できること。
壁の端と角は正しく接続できること。
各オブジェクトは自分のセル内に完全に収まること。
|
ダンジョン素材でよくある失敗は、壁が横視点になったり、画像全体が完成した部屋になったりすることです。「トップダウン視点」「完成した部屋ではない」「タイル素材表だけ」を強調してください。
手描きカートゥーン風
ピクセル風にしたくない場合は、手描きカートゥーン風に変更します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
Godot 4 TileSet で使用できる、トップダウン視点の手描きカートゥーン風タイルアトラスを生成してください。
要件:
- 1 タイルの論理サイズは 64×64
- 厳密なトップダウン視点
- やわらかい手描き風
- はっきりした輪郭
- 統一された筆致
- 統一された光照
- 規則的なグリッド配置
- 透明背景
- 完成したマップシーンを生成しない
- 文字なし、UI なし、人物なし
内容:
草地、土、砂地、石道、水面、道路の端、草地と土の接続端、小さな花、小さな石、草むら。
すべての基本地面はシームレスに平铺できること。
端の模様は隣接タイルと接続できること。
各タイルは独立し、別セルにはみ出さないこと。
|
手描き風はピクセル風より端が揃いにくいです。生成後は画像編集ソフトでグリッドを再調整してから Godot に読み込むのがおすすめです。
ネガティブプロンプト
ネガティブプロンプトを使えるモデルでは、次を追加できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
no perspective view,
no isometric view,
no complete map,
no characters,
no text,
no labels,
no UI,
no irregular grid,
no overlapping tiles,
no inconsistent tile sizes,
no borders,
no mockup,
no screenshot,
no realistic photography,
no shadows crossing tile boundaries,
no objects cut off by tile edges
|
中国語版:
1
2
3
4
|
不要透视,不要等距视角,不要完整地图,不要角色,
不要文字,不要标签,不要 UI,不要预览边框,
不要不规则网格,不要瓦片重叠,不要尺寸不一致,
不要跨格阴影,不要让物体被网格边缘截断。
|
モデルが「きれいなプレビュー画像」を生成し続ける場合は、次を強めに追加します。
1
2
3
4
5
|
no preview scene,
no game screenshot,
no map mockup,
only a tile atlas,
only separate tiles in a regular grid
|
実際の生成パラメータ
まずは次の仕様から始めるのがおすすめです。
1
2
3
4
5
|
タイル論理サイズ:32×32
アトラスレイアウト:6×4 または 6×5
最終生成画像:1024×1024 またはそれ以上
背景:透明
スタイル:ピクセル風
|
注意点として、AI は通常、本当に厳密な 32×32 グリッドを出力してくれるわけではありません。
「32×32」は主にタイルの設計比率を AI に伝えるための指定です。生成後は画像編集ソフトで次の作業が必要です。
- キャンバスを切り抜く。
- 規則的なグリッドを作る。
- 各タイルを再配置する。
- 本物の
32×32 に縮小・調整する。
- 端を修正する。
- PNG として書き出す。
Godot の TileSet で自動分割しやすくするには、最終アトラスで次を満たす必要があります。
- キャンバスサイズがタイルサイズで割り切れる。
- 各タイルが固定グリッド内にある。
- 外枠がない。
- 不規則な間隔がない。
- セルをまたぐ内容がない。
最も安定する分割生成法
大きな完全アトラスを一度に生成しないでください。次の順番がおすすめです。
- 1 枚目:基本地面。
- 2 枚目:道路接続。
- 3 枚目:水面と岸辺。
- 4 枚目:壁と崖。
- 5 枚目:花、草、砕石装飾。
2 回目以降の生成では、次を追加します。
1
2
|
前回の素材セットと完全に同じ色、筆致、ピクセル密度、
視角、光源方向、輪郭スタイルを維持してください。
|
それでも別バッチではスタイルがずれることがあります。正式なプロジェクトでは、最後に色調整とクリーンアップを行うのが安全です。
最初に使うならこの版
Godot の TileSet 流れをまず確認したいだけなら、最初はこのプロンプトをコピーしてください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
Godot 4 TileSet で使用できる、トップダウン視点ピクセル風の基本地面タイルアトラスを生成してください。
1 タイルの論理サイズは 32×32。
アトラスは 6 列 × 3 行の規則的なグリッド。
透明背景。
厳密なトップダウン視点、透視なし、等角投影なし。
すべてのタイルは完全に同じサイズで、きれいに整列。
統一されたピクセル密度、色スタイル、光源方向。
1 行目:
通常の草地、濃い草地、明るい草地、通常の土、濃い土、砂地。
2 行目:
灰色の石地、苔むした石地、丸石の地面、湿った土、枯れ草地、砕石地。
3 行目:
小さな花草装飾、草むら装飾、小石装飾、落ち葉装飾、
地面のひび割れ装飾、小さなキノコ装飾。
すべての基本地面は上下左右にシームレスに繰り返し平铺できること。
装飾物は自分のタイル内に完全に収まること。
完成したマップを生成しないこと。
人物を生成しないこと。
文字、数字、ラベル、UI、枠線、プレビュー説明を入れないこと。
どの模様も隣接タイルにはみ出さないこと。
単一の透明 PNG アトラスとして出力すること。
|
この版は最初のテスト素材に最適です。生成後、Godot で規則的なグリッドとして切り出せて、基本地面が平铺できれば十分です。道路、水面、壁、装飾は後から追加し、最初から完全な図集を狙わない方が安定します。
AI に TileSet から完全なシーンを構築させる
画像生成 AI 向けシーンプロンプト
これはコンセプト画像や視覚プレビューに向いています。tileset 画像を参照画像としてアップロードしてから使います。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
提供した tileset 図集を厳密に参照し、その中にある地面、道路、水面、石壁、装飾要素だけを使って、トップダウン RPG 用の完全で合理的な森の村シーンを組み立ててください。
シーン仕様:
厳密なトップダウン視点
透視や等角投影を使わない
マップ論理サイズは 24×18 タイル
各タイルの論理サイズは 32×32
参照 tileset の元の画風、色、テクスチャ、光源方向、比率を維持する
タイルのデザインを変更しない
参照画像にない建物、キャラクター、大型オブジェクトを追加しない
UI、文字、枠線、グリッド線を生成しない
tileset 図集ではなく、完成したシーンを出力する
マップ構造:
地図の基礎は通常の草地を中心にし、濃い草地とまばらな草地を少し混ぜて大きな繰り返しを避ける。
地図下部中央に明確な入口を配置する。
入口から地図中央へ縦方向のメイン道路を伸ばす。
メイン道路は中央で左右の分岐に分かれ、すべての道は接続されていること。途切れた道や意味のない断片を作らない。
右上に自然な形の小さな池を置く。
池は水面中央、上下左右の端、角を正しく組み合わせること。水面の切断や岸辺の向き間違いを作らない。
左上に接続された石壁エリアを置く。
壁の端と角は正しく接続する。
池、石壁、地図端の間には少なくとも 1 タイル幅の通行可能領域を残す。
中央にはキャラクターが動ける開けた活動エリアを残す。
池や石壁でメイン道路を完全に塞がない。
装飾ルール:
小さな花は主に草地に置き、道路や水面には置かない。
小石は少量だけ土、道の端、まばらな草地に置ける。
草むらは地図端、池の近く、壁の角に集中させる。
切り株は少量だけ視覚的な見どころとして使い、メイン道路を塞がない。
地面のひび割れは土や乾いた場所にだけ置く。
落ち葉は地図の角や壁の近くに集める。
道路中央はきれいに保ち、装飾は主に道路の両側に置く。
地図中央の装飾は少なめ、外周の装飾は多めにする。
すべてのセルに装飾を置かず、自然な余白を残す。
合理性要件:
すべての道は明確な目的を持ち、互いに接続されていること。
すべての通行可能領域は入口から到達できること。
水面、壁、道路の接続方向は正しいこと。
孤立した単一水面、単一壁、間違った角を作らない。
入れない狭い閉鎖空間を作らない。
マップはランダムにタイルを置いたものではなく、実際に設計されたゲームレベルに見えること。
画面には主従関係が必要:入口がプレイヤーを導き、メイン道路が中央へ向かい、池と石壁が副次的な視覚焦点になる。
完全なトップダウンマップシーンを 1 枚だけ生成する。
|
このプロンプトは、画像モデルに装飾より先に構造を考えさせるためのものです。ただし「厳密に tileset を参照」と書いても、画像モデルはタイル細部を描き直す場合があります。ピクセル完全一致は保証できません。
ゲームに取り込める正確なマップが必要なら、画像生成だけに頼らない方が安全です。
AI に先にマップレイアウトを出力させる
これはマップの合理性を保つのに向いています。AI には画像を描かせず、まず 24×18 の文字マップだけを出力させます。その後、Codex やスクリプトで文字を TileMapLayer.set_cell() に変換します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
次のルールに従って、24×18 のトップダウン RPG 森マップレイアウトを設計してください。
マップ記号:
G = 通常の草地
D = 濃い草地
S = まばらな草地
R = 道路
W = 水面
A = 石壁
F = 小さな花
K = 小石
B = 草むら
U = 切り株
C = 地面のひび割れ
L = 落ち葉
P = プレイヤー入口
設計要件:
P は地図下部中央に置く。
P から地図中央へ続く道路が必ず存在する。
道路は中央で左右の分岐に分かれ、すべての道路は接続される。
右上に約 4×5 の自然な形の池を置く。
左上に合理的に接続された石壁を置く。
地図中央には少なくとも 7×5 の開けた活動エリアを残す。
池、壁、地図端の間には少なくとも 1 マスの通行可能空間を残す。
プレイヤーは P からすべての主要道路と開けた領域に到達できること。
閉じ込められた 1 マス草地領域を作らない。
道路、水面、壁に意味のない 1 マス断片を作らない。
装飾は主要道路を塞がない。
地図端は装飾多め、中央は少なめ。
小花は草地にだけ置く。
地面のひび割れは土またはまばらな草地にだけ置く。
落ち葉は主に角と壁付近に置く。
全体は自然で、完全対称ではないが、構造は明確にする。
出力要件:
第 1 部分は完全な 24×18 文字グリッドだけを出力。
各行は必ず 24 文字。
合計で必ず 18 行。
第 2 部分で入口座標、道路ノード、池の範囲、壁の範囲を列出。
第 3 部分で断路、閉鎖領域、到達不能領域があるか検査。
画像は生成しない。
|
レイアウトを得た後、さらに自己検査させます。
1
2
3
4
5
6
7
8
9
|
上の文字マップを検査してください:
1. P からすべての R 道路へ到達できるか;
2. 孤立した W 水面があるか;
3. 孤立した A 石壁があるか;
4. 水面や壁で封鎖された通行可能領域があるか;
5. 各行が正確に 24 文字か;
6. 行数が正確に 18 行か。
問題があれば、修正後の完全な 24×18 マップを出力してください。
|
直接画像を出すより、この手順はレベルデザインに近いです。先に構造を検証し、それから見た目を作ります。
Codex に tileset を厳密に使って Godot マップを作らせる
これが最も信頼できる方法です。実際に図集内のタイル座標を使うため、描き直しではありません。
次のプロンプトは VS Code の Codex パネルで使えます。前提として Godot プロジェクトに TileMapLayer ノードがあり、TileSet が読み込まれている必要があります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
これは Godot 4.x プロジェクトです。既存の TileSet を使って完全なマップを作成する必要があります。
シーン構造:
World:Node2D
├─ Ground:TileMapLayer
├─ Roads:TileMapLayer
├─ Water:TileMapLayer
├─ Walls:TileMapLayer
├─ Decorations:TileMapLayer
└─ PlayerSpawn:Marker2D
tileset 図集は 6 列 × 5 行で、座標定義は以下の通りです:
第一行:
(0,0) 通常の草地
(1,0) 濃い草地
(2,0) まばらな草地
(3,0) 土の地面
(4,0) 石板の地面
(5,0) 砂地
第二行:
(0,1) 横方向道路
(1,1) 縦方向道路
(2,1) 左上道路角
(3,1) 右上道路角
(4,1) 左下道路角
(5,1) 右下道路角
第三行:
(0,2) 水面中央
(1,2) 水面上端
(2,2) 水面下端
(3,2) 水面左端
(4,2) 水面右端
(5,2) 水面外角
第四行:
(0,3) 石壁中央
(1,3) 石壁上部
(2,3) 石壁下部
(3,3) 石壁左側
(4,3) 石壁右側
(5,3) 石壁角
第五行:
(0,4) 小さな花
(1,4) 小石
(2,4) 草むら
(3,4) 切り株
(4,4) 地面のひび割れ
(5,4) 落ち葉
タスク:
24×18 の森の村マップを作成する。
地図下部中央にプレイヤー入口を置く。
入口から中央へメイン道路を作り、中央で左右の分岐に分ける。
右上に合理的に接続された小さな池を作る。
左上に合理的に接続された石壁を作る。
中央は開けた領域として残す。
すべての道路は接続されていること。
水面と壁で通路を塞がないこと。
装飾は主に地図端、池周辺、壁の角に置く。
道路中央に装飾を置かない。
孤立水面、孤立壁、向きの間違った角を作らない。
source_id は @export で設定する。
Godot 4 TileMapLayer.set_cell() を使用する。
静的型付けを使用する。
マップデータと描画ロジックを分離する。
コード内にマップサイズ検査と到達可能性検査を追加する。
既存 tileset に接続に必要なタイルがない場合、推測や誤ったタイル代用をせず、欠落項目を明確に報告する。
まず現在のプロジェクト、シーン、TileSet リソースを読み、実際の source_id と atlas 座標を確認してからコードを変更してください。source_id が 0 だと直接仮定しないでください。
|
特に重要なのは最後の一文です。
1
|
まず現在のプロジェクト、シーン、TileSet リソースを読み、実際の source_id と atlas 座標を確認してからコードを変更してください。source_id が 0 だと直接仮定しないでください。
|
Godot の source_id、atlas 座標、TileSet Source の順序は想定と違う場合があります。AI が推測すると、実行はできても違うタイルを配置するコードになることがあります。
Codex に向いた二段階プロンプト
プロジェクトが複雑な場合、Codex に一度で全部やらせない方が安全です。まず分析と確認だけを依頼し、ファイルは変更させません。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
これは Godot 4.x プロジェクトです。
まだどのファイルも変更しないでください。
次を確認してください:
1. 現在のシーン構造を読む;
2. すべての TileMapLayer ノードを見つける;
3. それぞれが使用している TileSet を見つける;
4. 実際の source_id を確認する;
5. tileset 内の各 atlas 座標がどのタイルに対応するか列出する;
6. 24×18 の森の村マップを作るのに十分か判断する;
7. 道、水面、壁の接続タイルが不足している場合、明確に列出する;
8. マップデータ構造の設計を出す;
9. 到達可能性検査の方法を出す;
10. まだコードを書かない。
|
分析に問題がなければ、次に実装を依頼します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
これからマップ生成スクリプトを実装してください。
要件:
1. World のスクリプトだけを変更する;
2. TileSet は変更しない;
3. シーンノード名を変更しない;
4. マップサイズは 24×18;
5. 配列または辞書でマップデータを保存する;
6. TileMapLayer.set_cell() で描画する;
7. source_id と主要 atlas 座標は @export で設定する;
8. マップサイズ検査を追加する;
9. 道路連結性検査を追加する;
10. PlayerSpawn から主要領域への到達可能性検査を追加する;
11. 検査に失敗したら push_error() で理由を出力する;
12. 変更後、Godot でのテスト方法を説明する。
|
この二段階方式は安定します。まず AI にプロジェクトを理解させ、それから編集させます。
プロンプトで最重要の数行
どんなシーンを生成する場合でも、次を入れると安定します。
1
2
3
4
5
6
|
すべての道路は互いに接続され、明確な用途を持つこと。
孤立した単一の水面、壁、道路を作らないこと。
地図中央は読みやすく保ち、地図端の装飾密度を高めること。
すべての主要エリアはプレイヤー入口から到達できること。
装飾物は主要な通行ルートを塞がないこと。
まずマップ構造を設計し、その後で装飾を追加すること。
|
最後の一文が特に重要です。
これを書かないと、AI は「見た目を豊かにする」ことを優先し、道が乱れ、装飾が通路を塞ぎ、到達不能領域ができやすくなります。
おすすめワークフロー
最も安定する流れは次の通りです。
- 先に AI で tileset を生成または整理する。
- Godot で
TileSet を作り、各タイルの atlas 座標を確認する。
- AI に文字マップまたは JSON レイアウトを先に出力させる。
- 道の接続、入口からの到達、水面と壁の合理性を確認する。
- Codex にレイアウトを
TileMapLayer.set_cell() に変換させる。
- Godot で実行し、衝突とデバッグ表示を有効にする。
- 最後に装飾密度を微調整する。
一言でまとめると:
AI にいきなり「きれいなシーンを描かせる」のではなく、先に構造を設計させ、その後で実際の tileset 座標に従ってスクリプトで組み立てます。そうすれば、ただのきれいな概念図ではなく、Godot プロジェクトに入りやすいマップになります。