Godot-Tiles

什麼是 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 相同就碰撞就好?

舉個例子:三種物件

假設你有這三種物件:

  1. Player(玩家)
  2. Enemy(敵人)
  3. Bullet(子彈)
❌ 如果只根據 collision_layer 相同就碰撞:
  • 如果三者都在同一層(例如 Layer 1):
    • 玩家會撞敵人(OK)
    • 玩家會撞子彈(❌ 很可能不想這樣)
    • 子彈會撞自己(❌ 爛透了)

完全無法區分誰要撞誰!

物件collision_layercollision_mask意義說明
玩家21玩家會撞敵人(Layer 1)
敵人12敵人會撞玩家(Layer 2)
子彈41子彈會撞敵人(Layer 1)
敵人子彈82敵人子彈撞玩家(Layer 2)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *