Godot 的瓦片地圖,可以理解成把一張包含草地、道路、牆壁、水面等小圖片的素材表,切成規則格子,再像畫畫一樣拼出關卡。
在 Godot 4.x,尤其是 4.3 之後的新專案中,建議使用 TileMapLayer。舊的 TileMap 節點已經被標記為棄用;現在更推薦一個地圖層對應一個 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
先理解兩個核心概念
瓦片地圖最重要的是兩個東西:
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
|
假設素材每個瓦片是 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
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。
- 設定匹配模式,例如按邊和角匹配。
- 建立 Terrain,例如
Grass、Dirt、Water。
- 給各個瓦片標註對應的地形連接位置。
- 在
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 負責編寫地圖互動、生成邏輯和 gameplay 腳本。
第一個練習怎麼做
建議第一個練習只做一張 20 × 15 的小地圖:
Ground 鋪草地。
Walls 畫一圈牆。
- 給牆壁瓦片配置碰撞。
- 放一個
Player。
- 讓玩家移動時被牆擋住。
- 再加入一個
Coin 場景。
這個練習做完,你就會真正理解 Godot 瓦片地圖的基本工作流:
1
2
3
4
5
|
TileSet 負責瓦片素材和規則
TileMapLayer 負責繪製某一層地圖
碰撞寫在 TileSet 的瓦片上
有行為的物件做成獨立場景
Codex 負責圍繞真實節點結構寫腳本
|
先把這個最小地圖跑通,再去研究 Terrain、Y Sort、程式化生成和大地圖載入,會穩很多。
用 AI 生成 Godot TileSet 的提示詞
用 AI 生成 Godot 的 tileset,關鍵不是讓它畫一張漂亮地圖,而是讓它生成一張真正方便切割、方便匯入 TileSet 的瓦片素材圖集。
最重要的目標是:
- 規則網格。
- 尺寸統一。
- 可重複拼接。
- 不跨格。
- 方便在 Godot 裡切成瓦片。
下面這套提示詞可以直接複製使用。建議先從基礎地面版本開始,不要一上來就生成完整道路、水面、牆體和裝飾大圖集。AI 對規則圖集的理解並不總是穩定,內容越多,越容易出現格子錯位、連接錯誤或風格漂移。
更適合 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 使用的頂視角像素風瓦片圖集。
要求:
- 嚴格頂視角
- 單個瓦片邏輯尺寸為 32×32
- 6 列 × 3 行規則網格
- 透明背景
- 所有格子大小完全一致
- 無文字、無標籤、無 UI、無角色
- 不要生成完整地圖
- 風格和光照保持統一
第一行:
普通草地、深色草地、稀疏草地、泥土、沙地、石地
第二行:
細草、碎石、花朵、落葉、地面裂紋、小蘑菇
第三行:
淺色草地變化、深色泥土變化、濕潤泥土、苔蘚石地、乾燥沙地、鵝卵石地面
技術要求:
- 所有地面瓦片能夠上下左右無縫重複平鋪
- 瓦片邊緣不能出現明顯斷層
- 細節不能跨越相鄰格子
- 輸出為單張 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 系統的頂視角像素風草地與泥土連接瓦片。
規格:
- 單個瓦片邏輯尺寸:32×32
- 嚴格頂視角
- 規則網格排列
- 透明背景
- 統一像素密度
- 統一光照方向
- 無文字、無 UI、無角色、無完整場景
需要包含:
- 純草地中心
- 純泥土中心
- 草地包圍泥土的上邊緣
- 下邊緣
- 左邊緣
- 右邊緣
- 左上外角
- 右上外角
- 左下外角
- 右下外角
- 左上內角
- 右上內角
- 左下內角
- 右下內角
- 橫向窄泥土道路
- 縱向窄泥土道路
- 十字連接
- T 形連接
要求所有邊緣像素能夠嚴格對應和無縫連接。
不要省略內角和外角。
每個連接瓦片必須單獨占據一個完整網格。
|
這一類 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 的頂視角像素風水面瓦片圖集。
要求:
- 單個瓦片邏輯尺寸:32×32
- 規則網格排列
- 透明背景
- 嚴格頂視角
- 水面顏色和波紋風格統一
- 無文字、無標籤、無 UI、無完整地圖
內容包括:
- 水面中心
- 水面變化塊 1
- 水面變化塊 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 的頂視角像素風地牢瓦片素材圖集。
規格:
- 單個瓦片邏輯尺寸: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 使用的頂視角手繪卡通風瓦片圖集。
要求:
- 單個瓦片邏輯尺寸為 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
|
保持與上一套素材完全相同的顏色、筆觸、像素密度、
視角、光照方向和輪廓風格。
|
不過不同批次仍可能出現風格漂移,正式專案最好統一做後期調色。
最推薦你先用的版本
如果你只想先跑通 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 使用的頂視角像素風基礎地面瓦片圖集。
單個瓦片邏輯尺寸為 32×32。
圖集使用 6 列 × 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
|
請嚴格參考我提供的 tileset 圖集,使用圖集中已有的地面、道路、水面、石牆和裝飾元素,拼成一張完整、合理、可用於俯視角 RPG 的森林村莊場景。
場景規格:
嚴格頂視角
不使用透視或等距視角
地圖邏輯尺寸為 24×18 個瓦片
每個瓦片邏輯尺寸為 32×32
保持參考 tileset 的原始畫風、顏色、紋理、光照方向和比例
不改變瓦片的設計
不新增參考圖中不存在的建築、角色或大型物體
不生成 UI、文字、邊框或網格線
輸出完整場景,不輸出 tileset 圖集
地圖結構:
地圖底層主要使用普通草地,少量混合深色草地和稀疏草地,避免大面積完全重複。
地圖下方中央設定一個清晰的入口。
從入口開始鋪設一條縱向主路,延伸到地圖中央。
主路在地圖中央分成左右兩條支路,所有道路必須連通,不能出現斷路或無意義的道路碎片。
地圖右上區域設定一個自然形狀的小水池。
水池必須由水面中心、上下左右邊緣和轉角正確拼接,不能出現水面直接截斷或岸邊方向錯誤。
地圖左上區域設定一段石牆圍合區域,牆體邊緣和轉角必須正確連接。
水池、石牆和地圖邊緣之間必須保留至少一個瓦片寬的可通行區域。
地圖中央保留一個較開闊的活動區域,方便角色移動。
不要讓水池或石牆完全堵住主路。
裝飾規則:
小花主要分布在草地區域,不能鋪在道路和水面上。
小石頭可以少量放在泥土、道路邊緣或稀疏草地上。
草叢集中放在地圖邊緣、水池附近和牆角。
樹樁只能少量出現,作為視覺興趣點,不要堵塞主路。
地面裂紋只放在泥土或乾燥區域。
落葉集中在地圖角落和牆邊。
道路中央保持乾淨,裝飾主要放在道路兩側。
地圖中心裝飾較少,地圖四周裝飾密度較高。
不要在每個格子都放裝飾,保留自然留白。
合理性要求:
所有道路必須有明確用途並互相連通。
所有可通行區域必須從入口到達。
水面、牆體和道路連接方向必須正確。
不出現孤立的單塊水面、單塊牆體或錯誤轉角。
不出現無法進入的狹小封閉空間。
地圖應像真實設計過的遊戲關卡,而不是隨機堆放瓦片。
畫面需要有主次關係:入口引導玩家進入,主路引向中心,水池和石牆作為次要視覺焦點。
只生成一張完整的俯視角地圖場景。
|
這段提示詞的目標是讓圖片模型先考慮結構,而不是只做裝飾。但要注意:即使寫了「嚴格參考 tileset」,圖片生成模型仍可能重繪瓦片細節,不能保證像素完全一致。
如果你需要可匯入遊戲的精確地圖,不要只依賴圖片生成結果。
讓 AI 先輸出地圖布局
這種方式更適合保持地圖合理性。先讓 AI 不畫圖,只輸出一張 24×18 的字符地圖。得到布局後,再讓 Codex 或腳本把字符轉換成 Godot 的 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 的開闊活動區。
水池、牆體和地圖邊緣之間至少保留一格可通行空間。
玩家必須能從 P 到達所有主要道路和開闊區域。
不允許出現封閉的單格草地區域。
不允許道路、水面或牆體出現無意義的單格碎片。
裝飾不能阻擋主要道路。
地圖邊緣裝飾較多,中央區域裝飾較少。
小花只放在草地上。
地面裂紋只放在泥土或稀疏草地區域。
落葉主要放在角落和牆體附近。
保持整體自然、不完全對稱,但結構清晰。
輸出要求:
第一部分只輸出完整的 24×18 字符網格。
每行必須正好包含 24 個字符。
總共必須正好輸出 18 行。
第二部分列出入口座標、道路節點、水池範圍和牆體範圍。
第三部分檢查地圖是否存在斷路、封閉區域或無法到達區域。
不生成圖片。
|
得到布局後,可以讓 AI 自檢:
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. 使用 @export 配置 source_id 和關鍵 atlas 座標;
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 專案,而不是停留在一張好看的概念圖。