深入理解 Godot 的 Y-Sort

一個解決 2D 排序問題的互動指南

互動範例:眼見為憑

提示:用滑鼠拖曳角色來移動

試著拖曳「角色」,讓他從「樹」的前方和後方經過,觀察他的圖層變化。

修正排序原點
核心問題:你以為的「位置」不是 Godot 以為的位置

當你啟用 Y Sort Enabled 時,Godot 會根據子節點的 Y 座標來決定繪製順序:Y 值越大(在畫面上越下方)的節點,會被畫在越上層。

但關鍵在於,Godot 比較的不是整個圖片的位置,而是每個節點的「原點 (Origin)」的 Y 座標。

❌ 錯誤的排序 (預設情況)

Incorrect Sorting Diagram

角色和樹的原點都在左上角。當角色在樹的前方時,他的原點 Y 座標比樹的原點小,所以被畫在樹的後面。

✅ 正確的排序

Correct Sorting Diagram

將原點移到物件的「腳下」。現在當角色在樹的前方時,他的原點 Y 座標比樹大,因此被正確地畫在樹的前面。

解決方案

方法一:針對獨立節點 (如 Player, Tree)

對於獨立的場景實例(例如玩家、NPC、可拾取的道具、單獨放置的樹),你需要調整它們 Sprite 的原點。

  1. 打開你的物件場景 (例如 `Player.tscn` 或 `Tree.tscn`)。
  2. 在場景樹中選擇負責顯示圖形的 Sprite2DAnimatedSprite2D 節點。
  3. 在右邊的【屬性面板】中,找到 Transform 分類下的 Offset 屬性。
  4. 調整 Offset 的 Y 值,將圖片向上移動,直到節點的原點 (那個小小的十字) 對準物件的腳下。通常 Y 值會是一個負數。

💡 提示:

在 2D 視圖中,選擇移動工具 (W),然後按住 Alt 鍵拖曳你的 Sprite。這樣可以直接修改 Offset,非常直觀。

方法二:針對 TileMap

當你的遮擋物(例如樹、牆壁)是畫在 TileMap 上時,設定會稍微不同,需要兩步關鍵操作。

第一步:在 TileMap 圖層上啟用 Y-Sort

你需要告訴 Godot,這個圖層上的瓦片需要彼此之間進行 Y 軸排序。

  1. 在你的主場景中,點選 `TileMap` 節點下的那個**圖層 (Layer)**,例如 `Trees` 圖層。
  2. 在【屬性面板】中,找到 Ordering 分類,並勾選 Y Sort Enabled
  3. 注意: 是在**圖層**上啟用,而不是在 `TileMap` 主節點上!

第二步:在 TileSet 中設定瓦片原點

你需要為每一個需要遮擋的瓦片(如樹)設定它的排序「腳本」。

  1. 在編輯器下方,打開 TileSet 面板。
  2. 點選你的樹木瓦片。
  3. 在右邊的屬性中,找到 Rendering 分類。
  4. Y Sort Origin 的 Y 值設定為你瓦片的高度 (例如,16x16 的瓦片就設為 16)。
總結與除錯清單

當 Y-Sort 失效時,按照以下步驟檢查:

  • 父節點檢查: 所有需要互相排序的物件(玩家、樹、TileMap)是否都在同一個父節點下?該父節點是否已啟用 Y Sort Enabled
  • 物件原點檢查: 對於獨立的 `Sprite2D` 物件,它的 Offset 是否已調整到腳下?
  • TileMap 圖層檢查: 對於 `TileMap`,是否是在**圖層**上啟用 Y Sort Enabled,而不是主節點?
  • TileSet 瓦片檢查: 在 `TileSet` 中,遮擋物瓦片的 Y Sort Origin 是否已設定?
  • Z Index 檢查: 所有參與排序的物件的 Z Index 是否都為 0?Z Index 會覆蓋 Y-Sort 的效果。