什麼是 Tiles?

Tiles 是由 TileSet + TileMap 組合而成。通常是用來製作遊戲中的地圖場景。
TileSet
→ 是圖庫

- 包含一張或多張圖(tileset image)
- 你定義每塊 tile 的區域、碰撞、動畫等
- 像是:「這塊是地面」「這塊是水」「這塊會滑動」
TileMap
→ 是地圖

- 使用你做好的 TileSet 去「鋪地圖」
- 像畫畫一樣拖拉圖塊建構場景
TileSet
中的碰撞設定
當設定好 TileMap
後馬上執行會讓腳色直接穿過。因為尚未設定碰撞設定,這樣角色節點上的 CollisionShape2D 沒辦法互動。

我們要在 TileSet
中的屬性面板選擇物理層級。並且要把可以與CollisionShape2D 發生碰撞的 TileSet
選取出來。
- 可以自行繪製碰撞範圍,不一定是方方正正的。但要注意光是 1 px的差距,可能都會造成腳色無法順利走過,像是橋梁部分有凹陷有高低差,會讓腳色無法順利走進走出。

TileMap 設定區塊(上半部)
- Tile Set:指定使用哪個 TileSet 資源(圖塊資料來源)。
- Tile Shape:圖塊形狀,例如:
Square
:方形圖塊Isometric
:等角圖塊
- Tile Layout:圖塊的堆疊方式,這裡是
Stacked
。 - Tile Offset Axis:圖塊偏移的軸向,這裡是
Horizontal Offset
。 - Tile Size:每個圖塊的大小,這裡是
16x16 px
,代表每個 tile 是 16 像素寬高。
Physics Layers(物理圖層)設定區
- Collision Layer(碰撞層)
- 指定此 TileMap 屬於哪些物理層。
- Collision Mask(碰撞遮罩)
- 指定 TileMap 會「偵測哪些層的碰撞」。
- Collision
- 通常是「碰撞阻力」或類似參數(數值為
1.0
代表完全阻擋)。
- 通常是「碰撞阻力」或類似參數(數值為
- Physics Material(Physics M)
- 可選擇一個
PhysicsMaterial
資源,定義摩擦力、彈性等細節。
- 可選擇一個
Collision Layer Collision Mask 差在哪
🧍♂️ 玩家(Player)
collision_layer = 2
(玩家層)collision_mask = 1
(我會去偵測牆)
🧱 牆壁(TileMap)
collision_layer = 1
(牆的層)collision_mask = 0
(牆不主動偵測)
✅ 結果:
- 玩家在第 2 層 → 不重要
- 玩家會偵測第 1 層 → 會偵測牆
- 牆在第 1 層 → 會被偵測到
- 牆不偵測其他 → 沒關係,只要一邊偵測就夠了
→ ✅ 玩家會撞到牆!
為何不單純根據 collision_layer 相同就碰撞就好?
舉個例子:三種物件
假設你有這三種物件:
- Player(玩家)
- Enemy(敵人)
- Bullet(子彈)
❌ 如果只根據 collision_layer
相同就碰撞:
- 如果三者都在同一層(例如 Layer 1):
- 玩家會撞敵人(OK)
- 玩家會撞子彈(❌ 很可能不想這樣)
- 子彈會撞自己(❌ 爛透了)
→ 完全無法區分誰要撞誰!
物件 | collision_layer | collision_mask | 意義說明 |
---|---|---|---|
玩家 | 2 | 1 | 玩家會撞敵人(Layer 1) |
敵人 | 1 | 2 | 敵人會撞玩家(Layer 2) |
子彈 | 4 | 1 | 子彈會撞敵人(Layer 1) |
敵人子彈 | 8 | 2 | 敵人子彈撞玩家(Layer 2) |