Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

使用 Area2D

前言

Godot提供了許多碰撞物件來提供碰撞偵測和回應. 試圖決定為你的專案使用哪一個可能會讓人感到困惑. 如果你瞭解它們各自的工作原理以及它們的優點和缺點, 你就可以避免問題並簡化開發. 在本教學中, 我們將查看 Area2D 節點, 並展示一些如何使用它的例子.

備註

本文假設你熟悉 Godot 中的各種物理體,否則請先閱讀 物理介紹

什麼是區域?

Area2D定義了二維空間的區域. 在這個空間中, 您可以偵測到其他 CollisionObject2D 節點的重疊, 進入和退出. 區域(Area)還允許覆蓋本地物理屬性. 我們將在下面討論這些功能中的每一個.

Area 的屬性

區域有許多屬性可用於自訂它們的行為.

../../_images/area2d_properties.webp

前八個屬性用於配置區域的物理覆蓋行為. 我們將在下面一節中介紹如何使用這些內容.

MonitoringMonitorable 用於啟用和禁用該區域偵測.

音訊匯流排 (Audio Bus) 部分, 允許重寫該區域內的音訊, 例如當玩家移動時的音訊效果.

請注意,Area2D擴充了 CollisionObject2D, 所以它也提供了從該類繼承的屬性, 例如 input_pickable .

重疊偵測

也許Area2D節點最常見的用途是用於觸碰和重疊偵測. 當需要知道兩個物體已經觸碰, 但不需要物理碰撞時, 可以使用一個區域來通知.

例如, 要做一個硬幣讓玩家去撿. 硬幣並不是一個實心的物體, 玩家不能站在上面, 也不能推它, 只是想讓它在玩家觸碰它的時候消失.

這是硬幣節點的設定:

../../_images/area2d_coin_nodes.webp

為了偵測重疊, 我們將在Area2d上連接相應的訊號, 使用哪個訊號取決於玩家的節點型別. 如果玩家是另一個區域(Area2d), 就使用 area_entered . 然而假設玩家是一個 KinematicBody2D (因此也是一個 CollisionObject2D 型別), 將連接 body_entered 訊號.

備註

如果熟悉使用訊號, 請參閱 繫結訊號 的介紹.

extends Area2D

func _on_coin_body_entered(body):
    queue_free()

現在我們的遊戲角色可以收集硬幣了!

其他一些使用實例:

  • 區域對於子彈和其他彈丸物體來說是非常好用, 它可以擊中並造成傷害, 但不需要其他物理效果, 如彈跳.

  • 用敵人周圍的一個大圓圈區域設定為 "探測" 半徑, 當玩家在該區域外時, 敵人就無法 "看到" 玩家.

  • 安保攝像頭 - 在有多個攝像頭的大型關卡中, 在每個攝像頭上附加區域(area), 並在玩家進入時啟動它們.

遊戲中使用 Area2D 的範例請參閱 您的第一個 2D 遊戲

區域影響

區域節點的第二個主要用途是改變物理效果。預設情況下,區域不會這樣做,但你可以用 空間覆蓋(Space Override) 屬性啟用這個功能。當區域重疊時,它們會按照 優先順序(Priority) 的順序進行處理(優先順序較高的區域會被優先處理)。覆蓋有四個選項:

  • 合併(Combine) - 該區域將其數值加到目前已計算的數值上.

  • 替換(Replace) - 該區域替換物理屬性, 低優先順序區域被忽略.

  • 合併-替換 (Combine-Replace) - 該區域將其重力/阻尼值加到目前為止計算出的所有數值上(按優先順序), 忽略任何較低優先順序的區域.

  • 替換-合併 (Replace-Combine) - 該區域替換了目前為止計算的所有重力或阻尼, 但繼續計算其餘區域.

使用這些屬性, 可以建立具有多個重疊區域的複雜行為.

可以重寫的物理屬性有:

  • 重力(Gravity) - 區域內的重力強度.

  • 重力方向 (Gravity Direction) - 此向量不需要正規化。

  • 線性阻尼 (Linear Damp) - 物體停止移動的速度-每秒損失的線速度.

  • 角度阻尼 (Angular Damp) - 物體停止旋轉的速度-每秒損失的角速度.

重力點

重力點 (Gravity Point) 屬性允許您建立一個 "吸引器" . 區域中的重力將按 重力向量 (Gravity Vec) 屬性給出的點進行計算. 值是相對於Area2D而言的, 因此例如使用 (0, 0) 將吸引物件到區域中心.

範例

以下所附中的範例專案包含三個區域, 它們說明了物理重寫.

../../_images/area2d_override.gif

您可以在此處下載專案:area_2d_starter.zip