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
繼承: CollisionObject2D < Node2D < CanvasItem < Node < Object
2D 空間中的一個區域,能夠偵測到其他 CollisionObject2D 的進入或退出。
說明
Area2D 是 2D 空間中的一個區域,由一個或多個 CollisionShape2D 或 CollisionPolygon2D 子節點定義,能夠偵測其他 CollisionObject2D 進入或離開,並持續追蹤尚未離開的碰撞物件(亦即仍與其重疊的物件)。
此節點亦可在區域內局部調整或覆寫物理參數(重力、阻尼),並將音訊導向自訂音訊匯流排。
注意: 以 PhysicsServer2D 建立的 Area 或剛體可能無法與 Area2D 如預期互動,亦可能無法正確發出訊號或追蹤物件。
教學
屬性
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
方法
get_overlapping_areas() const |
|
get_overlapping_bodies() const |
|
has_overlapping_areas() const |
|
has_overlapping_bodies() const |
|
overlaps_area(area: Node) const |
|
overlaps_body(body: Node) const |
訊號
當接收到的 area 進入此區域時發出。需將 monitoring 設為 true 才能觸發。
當接收到的 area 離開此區域時發出。需將 monitoring 設為 true 才能觸發。
area_shape_entered(area_rid: RID, area: Area2D, area_shape_index: int, local_shape_index: int) 🔗
當接收到的 area 之 Shape2D 進入本區域的某個形狀時發出。需將 monitoring 設為 true 才能觸發。
local_shape_index 與 area_shape_index 分別為本區域與對方區域互動形狀的索引。area_rid 為對方區域的 RID。這些值可搭配 PhysicsServer2D 使用。
範例: 依索引取得對應的 CollisionShape2D 節點:
var other_shape_owner = area.shape_find_owner(area_shape_index)
var other_shape_node = area.shape_owner_get_owner(other_shape_owner)
var local_shape_owner = shape_find_owner(local_shape_index)
var local_shape_node = shape_owner_get_owner(local_shape_owner)
area_shape_exited(area_rid: RID, area: Area2D, area_shape_index: int, local_shape_index: int) 🔗
當接收到的 area 之 Shape2D 離開本區域的形狀時發出。需將 monitoring 設為 true 才能觸發。
當接收到的 body 進入此區域時發出。body 可為 PhysicsBody2D 或 TileMap。若 TileMap 的 TileSet 設定了碰撞形狀亦可被偵測。需將 monitoring 設為 true 才能觸發。
當接收到的 body 離開此區域時發出。body 可為 PhysicsBody2D 或 TileMap。若 TileMap 的 TileSet 設定了碰撞形狀亦可被偵測。需將 monitoring 設為 true 才能觸發。
body_shape_entered(body_rid: RID, body: Node2D, body_shape_index: int, local_shape_index: int) 🔗
當接收到的 body 之 Shape2D 進入本區域的某個形狀時發出。body 可為 PhysicsBody2D 或 TileMap。若 TileMap 的 TileSet 設定了碰撞形狀亦可被偵測。需將 monitoring 設為 true 才能觸發。
local_shape_index 與 body_shape_index 分別為本區域與對應物件互動形狀的索引。body_rid 為該物件的 RID。這些值可搭配 PhysicsServer2D 使用。
範例: 依索引取得對應的 CollisionShape2D 節點:
var body_shape_owner = body.shape_find_owner(body_shape_index)
var body_shape_node = body.shape_owner_get_owner(body_shape_owner)
var local_shape_owner = shape_find_owner(local_shape_index)
var local_shape_node = shape_owner_get_owner(local_shape_owner)
body_shape_exited(body_rid: RID, body: Node2D, body_shape_index: int, local_shape_index: int) 🔗
當接收到的 body 之 Shape2D 離開本區域的形狀時發出。body 可為 PhysicsBody2D 或 TileMap。若 TileMap 的 TileSet 設定了碰撞形狀亦可被偵測。需將 monitoring 設為 true 才能觸發。
列舉
enum SpaceOverride: 🔗
SpaceOverride SPACE_OVERRIDE_DISABLED = 0
此區域不影響重力/阻尼。
SpaceOverride SPACE_OVERRIDE_COMBINE = 1
此區域會將自己的重力/阻尼值累加至目前已計算的值(依 priority 順序)。
SpaceOverride SPACE_OVERRIDE_COMBINE_REPLACE = 2
此區域會將自己的重力/阻尼值累加至目前已計算的值(依 priority 順序),並忽略較低優先權的區域。
SpaceOverride SPACE_OVERRIDE_REPLACE = 3
此區域會取代目前的重力/阻尼(包含預設值),並忽略所有較低優先權的區域。
SpaceOverride SPACE_OVERRIDE_REPLACE_COMBINE = 4
此區域會取代至今為止所計算的重力/阻尼(依 priority 順序),但仍會繼續計算其他區域。
屬性說明
物體在此區域停止旋轉的速率,代表每秒損失的角速度。
詳細說明請參考 ProjectSettings.physics/2d/default_angular_damp。
SpaceOverride angular_damp_space_override = 0 🔗
void set_angular_damp_space_override_mode(value: SpaceOverride)
SpaceOverride get_angular_damp_space_override_mode()
此區域內角阻尼計算的覆寫模式。可用值請參閱 SpaceOverride。
StringName audio_bus_name = &"Master" 🔗
void set_audio_bus_name(value: StringName)
StringName get_audio_bus_name()
此區域使用的音訊匯流排名稱。
bool audio_bus_override = false 🔗
若為 true,此區域的音訊匯流排將覆寫預設匯流排。
此區域的重力強度(單位:像素/秒²)。該值會乘於重力方向向量,可在不改變方向的情況下調整重力大小。
Vector2 gravity_direction = Vector2(0, 1) 🔗
此區域的重力向量(未正規化)。
若為 true,重力將以 gravity_point_center 指定的點為中心進行計算。另見 gravity_space_override。
Vector2 gravity_point_center = Vector2(0, 1) 🔗
若重力為點狀(參見 gravity_point),則此為吸引點。
float gravity_point_unit_distance = 0.0 🔗
當距離等於此值時,重力大小即為 gravity。例如:若行星半徑為 100 像素且表面重力為 4.0 px/s²,請將 gravity 設為 4.0,單位距離設為 100.0。重力將依平方反比定律遞減,故於 200 像素處重力為 1.0 px/s²(距離加倍,重力變 1/4),於 50 像素處重力為 16.0 px/s²(距離減半,重力變 4 倍),依此類推。
僅當此值為正數時上述規則才適用;若設為 0.0,重力將與距離無關而保持常數。
SpaceOverride gravity_space_override = 0 🔗
void set_gravity_space_override_mode(value: SpaceOverride)
SpaceOverride get_gravity_space_override_mode()
此區域內重力計算的覆寫模式。可用值請參閱 SpaceOverride。
物體在此區域停止移動的速率,代表每秒損失的線速度。
詳細說明請參考 ProjectSettings.physics/2d/default_linear_damp。
SpaceOverride linear_damp_space_override = 0 🔗
void set_linear_damp_space_override_mode(value: SpaceOverride)
SpaceOverride get_linear_damp_space_override_mode()
此區域內線性阻尼計算的覆寫模式。可用值請參閱 SpaceOverride。
若為 true,其他處於監測狀態的區域可偵測到此區域。
若為 true,此區域會偵測物體或其他區域的進入與離開。
區域優先權。優先權數值越高越先處理。World2D 的全域物理總在所有區域之後處理。
方法說明
Array[Area2D] get_overlapping_areas() const 🔗
傳回與本區域相交的 Area2D 清單。重疊區域的 CollisionObject2D.collision_layer 必須包含於本區域的 CollisionObject2D.collision_mask 之中才能被偵測。
基於效能考量(碰撞會在同一時間批次處理),此清單僅會於每次物理步驟更新一次,而非物件移動後立即更新。建議改用訊號。
Array[Node2D] get_overlapping_bodies() const 🔗
傳回與本區域相交的 PhysicsBody2D 與 TileMap 清單。重疊物件的 CollisionObject2D.collision_layer 必須包含於本區域的 CollisionObject2D.collision_mask 之中才能被偵測。
基於效能考量(碰撞會在同一時間批次處理),此清單僅會於每次物理步驟更新一次,而非物件移動後立即更新。建議改用訊號。
bool has_overlapping_areas() const 🔗
若與任一 Area2D 相交則回傳 true,否則回傳 false。重疊區域的 CollisionObject2D.collision_layer 必須包含於本區域的 CollisionObject2D.collision_mask 之中才能被偵測。
基於效能考量(碰撞會在同一時間批次處理),重疊區域清單僅會於每次物理步驟更新一次,而非物件移動後立即更新。建議改用訊號。
bool has_overlapping_bodies() const 🔗
若與任一 PhysicsBody2D 或 TileMap 相交則回傳 true,否則回傳 false。重疊物件的 CollisionObject2D.collision_layer 必須包含於本區域的 CollisionObject2D.collision_mask 之中才能被偵測。
基於效能考量(碰撞會在同一時間批次處理),重疊物件清單僅會於每次物理步驟更新一次,而非物件移動後立即更新。建議改用訊號。
bool overlaps_area(area: Node) const 🔗
若指定的 Area2D 與本區域相交或重疊則回傳 true,否則回傳 false。
注意: 測試結果並非物件移動後立即更新。基於效能,本區域的重疊清單於每影格且物理步驟之前僅更新一次。建議改用訊號。
bool overlaps_body(body: Node) const 🔗
若指定的物理物件與本區域相交或重疊則回傳 true,否則回傳 false。
注意: 測試結果並非物件移動後立即更新。基於效能,重疊清單於每影格且物理步驟之前僅更新一次。建議改用訊號。
body 可為 PhysicsBody2D 或 TileMap 實例。雖然 TileMap 本身不是物理物件,但其含碰撞形狀的圖塊會註冊為虛擬物理物件。