Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
使用 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