使用 Area2D
前言
Godot 提供多種碰撞物件,能用於碰撞偵測與回應。要決定專案中該選用哪一種物件,常常會讓人困惑。若你能理解每一種碰撞物件的運作方式及其優缺點,就能避免許多問題並簡化開發流程。本教學將介紹 Area2D 節點,並展示一些實際用法範例。
備註
本文假設你已熟悉 Godot 的各種物理物件。請先閱讀 物理系統簡介 以瞭解基礎內容。
什麼是區域?
Area2D 會定義出一塊 2D 空間的區域。在這區域內,你可以偵測其他 CollisionObject2D 節點的重疊、進入或離開。區域本身也能覆寫局部的物理屬性。下面我們會分別介紹這些功能。
Area 的屬性
區域有許多屬性可用來自訂其行為。
Gravity、Linear Damp 以及 Angular Damp 區段用於設定區域的物理屬性覆寫行為。這些會在下方「區域影響」章節說明。
Monitoring 和 Monitorable 用於啟用或停用區域偵測功能。
Audio Bus (音訊匯流排)區段允許你覆寫該區域內的音訊設定,例如玩家通過時可套用特殊音效。
請注意,Area2D 是 CollisionObject2D 的子類別,因此也繼承了該類別的屬性。你可以在 CollisionObject2D 的 Collision 區段中設定區域的碰撞圖層與遮罩。
重疊偵測
Area2D 節點最常見的用途之一,就是用於接觸與重疊偵測。當你只需要知道兩個物件是否碰到(但不須真的產生物理碰撞反應)時,可以用區域來通知你有無接觸。
舉例來說,假設我們要做一枚讓玩家撿取的金幣。金幣並不是實體物件——玩家不能站在金幣上,也不能推動它——我們只希望玩家碰到時金幣就會消失。
以下是金幣的節點設定:
要偵測重疊,我們需要連接 Area2D 上對應的訊號。使用哪個訊號要看玩家的節點型別:如果玩家也是區域(Area2D),就用 area_entered;但如果玩家是 CharacterBody2D``(所以屬於 ``CollisionObject2D 類型),就用 body_entered 訊號。
備註
如果你還不熟悉訊號(Signal)的使用方式,請先參考 繫結訊號 的介紹。
extends Area2D
func _on_coin_body_entered(body):
queue_free()
using Godot;
public partial class Coin : Area2D
{
private void OnCoinBodyEntered(PhysicsBody2D body)
{
QueueFree();
}
}
現在玩家就能收集金幣了!
其他常見用法範例:
區域很適合拿來當作子彈或其他不需要物理反彈效果的彈體,這類物件只需偵測擊中並造成傷害即可。
可以在敵人周圍設一個大型圓形區域來作為「偵測半徑」,玩家只要不進入該區域,敵人就無法「看到」玩家。
「監視攝影機」——在大型關卡中有多台攝影機時,可在每個攝影機上綁定一個區域(Area2D),當玩家進入該區域時啟動攝影機的偵測功能。
更多在遊戲中使用 Area2D 的案例,請參閱 您的第一個 2D 遊戲。
區域影響
區域節點的另一個重要用途是影響物理行為。預設情況下,區域不會改變物理效果,不過你可以透過 Space Override 屬性來啟用。當多個區域重疊時,會依照 Priority (優先級)屬性進行處理(優先級高的區域會先處理)。覆寫模式有四種選項:
Combine(合併) —— 該區域會將它的設定值加到目前已計算的值上。
Replace(取代) —— 該區域會完全覆蓋物理屬性,並忽略優先級較低的其他區域。
Combine-Replace(合併-取代) —— 依優先級順序,區域會將自己的重力和阻尼值加到目前已計算的值上,並忽略任何優先級較低的區域。
Replace-Combine(取代-合併) —— 該區域會取代目前所有已計算的重力/阻尼值,但會繼續與剩下的區域做合併計算。
透過這些設定,你可以讓多個重疊區域形成複雜的物理效果。
可被覆寫的物理屬性包括:
Gravity(重力) —— 區域內的重力強度。
Gravity Direction(重力方向) —— 這個向量不需要正規化。
Linear Damp(線性阻尼) —— 物體線速度每秒損失多少,影響物體停止移動的速度。
Angular Damp(角度阻尼) —— 物體角速度每秒損失多少,影響物體停止旋轉的速度。
重力點
Gravity Point 屬性可以讓你建立「吸引點」。區域內的重力會朝向由 Point Center 屬性指定的位置吸引。這個值是相對於 Area2D 節點本身的位置,例如設為 (0, 0) 時,會把物件吸向區域的中心。
範例
以下附檔的範例專案中有三個區域,分別示範了不同的物理覆寫效果。
你可以在這裡下載這份範例專案:area_2d_starter.zip