Area3D
繼承: CollisionObject3D < Node3D < Node < Object
3D 空間中的一個區域,能夠偵測到其他 CollisionObject3D 的進入或退出。
說明
Area3D 是 3D 空間中的一個區域,可由一個或多個 CollisionShape3D 或 CollisionPolygon3D 子節點定義。它能偵測其他 CollisionObject3D 進入或離開此區域,並追蹤仍在區域內(即與其重疊)的碰撞物件。
此節點也可以局部調整或覆寫物理參數(重力、阻尼),並將音訊導向自訂音訊匯流排。
注意: 以 PhysicsServer3D 建立的 Area 與剛體可能與 Area3D 的互動不如預期,亦可能無法正確發送訊號或追蹤物件。
警告: 若在本節點的 CollisionShape3D 子節點中使用 ConcavePolygonShape3D(例如在選取 MeshInstance3D 後於 Mesh 功能表選擇 Create Trimesh Collision Sibling 建立),因為該碰撞形狀為中空,可能產生非預期結果。如不希望如此,請將其拆分為多個 ConvexPolygonShape3D 或 BoxShape3D 等基礎形狀;某些情況下亦可改用 CollisionPolygon3D。
教學
屬性
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
方法
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: Area3D, area_shape_index: int, local_shape_index: int) 🔗
當接收到的 area 中的某個 Shape3D 進入此區域的某個形狀時觸發。必須將 monitoring 設為 true。
local_shape_index 與 area_shape_index 分別為此區域與對方區域中互動形狀的索引;area_rid 為對方區域的 RID。這些值可與 PhysicsServer3D 配合使用。
範例: 依形狀索引取得 CollisionShape3D 節點:
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: Area3D, area_shape_index: int, local_shape_index: int) 🔗
當接收的 area 的 Shape3D 退出此區域的形狀時發出。需要 monitoring 被設定為 true。
當接收到的 body 進入這個區域時發出。body 可以是一個 PhysicsBody3D 或一個 GridMap。如果 GridMap 的 MeshLibrary 配置了碰撞形狀就會被偵測到。需要將 monitoring 設定為 true 。
當接收到的 body 離開這個區域時發出的。body 可以是一個 PhysicsBody3D 或一個 GridMap。如果 GridMap 的 MeshLibrary 配置了碰撞形狀,就會被偵測到。要求 monitoring 被設定為 true 。
body_shape_entered(body_rid: RID, body: Node3D, body_shape_index: int, local_shape_index: int) 🔗
當接收到的 body(可為 PhysicsBody3D 或 GridMap,其中 GridMap 必須在其 MeshLibrary 中設定碰撞形狀)之 Shape3D 進入此區域的某個形狀時觸發。必須將 monitoring 設為 true。
local_shape_index 與 body_shape_index 分別為此區域與該物體中互動形狀的索引;body_rid 為該物體的 RID。這些值可與 PhysicsServer3D 配合使用。
範例: 依形狀索引取得 CollisionShape3D 節點:
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: Node3D, body_shape_index: int, local_shape_index: int) 🔗
當接收到的物體 body 中的某個 Shape3D 離開此區域中的某個形狀時發出。body 可以是 PhysicsBody3D 或 GridMap。GridMap 的 MeshLibrary 配置有碰撞形狀時才能夠被偵測到。要求將 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/3d/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,此區域的音訊匯流排將覆寫預設匯流排。
該區域的重力強度(以米每平方秒為單位)。這個值是重力向量的倍數。這對於改變重力大小而不改變其方向很有用。
Vector3 gravity_direction = Vector3(0, -1, 0) 🔗
此區域的重力向量(未正規化)。
若為 true,重力將以 gravity_point_center 指定的點為中心進行計算。另見 gravity_space_override。
Vector3 gravity_point_center = Vector3(0, -1, 0) 🔗
若重力為點狀(參見 gravity_point),則此為吸引點。
float gravity_point_unit_distance = 0.0 🔗
重力強度等於 gravity 的距離。例如,在一個半徑為 100 米、表面重力為 4.0 m/s² 的行星上,將 gravity 設定為 4.0,將單位距離設定為 100.0。重力會根據平方反比定律衰減,因此在該範例中,距中心 200 米處的重力將為 1.0 m/s²(距離的兩倍,重力的 1/4),在 50 米處為 16.0 m/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/3d/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,此區域會偵測物體或其他區域的進入與離開。
該區域的優先順序。將優先處理優先順序較高的區域。World3D 的物理始終在所有區域之後處理。
float reverb_bus_amount = 0.0 🔗
該區域對其相關音訊套用混響的程度。範圍從 0 到 1,精度為 0.1。
bool reverb_bus_enabled = false 🔗
如果為 true,該區域會將混響套用於其關聯音訊。
StringName reverb_bus_name = &"Master" 🔗
void set_reverb_bus_name(value: StringName)
StringName get_reverb_bus_name()
用於該區域關聯音訊的混響匯流排的名稱。
float reverb_bus_uniformity = 0.0 🔗
該區域的混響效果均勻的程度。範圍從 0 到 1,精度為 0.1。
float wind_attenuation_factor = 0.0 🔗
風力隨與源點距離增加而呈指數遞減的速率。
注意: 風力僅作用於 SoftBody3D 節點,其他物理物體目前不受影響。
float wind_force_magnitude = 0.0 🔗
此區域專屬風力的強度大小。
注意: 風力僅作用於 SoftBody3D 節點,其他物理物體目前不受影響。
NodePath wind_source_path = NodePath("") 🔗
用以指定此區域風力方向與來源的 Node3D。風向與該節點局部轉換的 z 軸相反,風源則位於其局部原點。
注意: 風力僅作用於 SoftBody3D 節點,其他物理物體目前不受影響。
方法說明
Array[Area3D] get_overlapping_areas() const 🔗
返回相交的 Area3D 的列表。重疊區域的 CollisionObject3D.collision_layer 必須是該區域的 CollisionObject3D.collision_mask 的一部分才能被偵測到。
出於性能原因(同時處理所有碰撞),此列表在物理步驟期間修改一次,而不是在實體被移動後立即修改。可考慮改用訊號。
Array[Node3D] get_overlapping_bodies() const 🔗
返回相交的 PhysicsBody3D 和 GridMap。重疊物體的 CollisionObject3D.collision_layer 必須是該區域 CollisionObject3D.collision_mask 的一部分,才能被偵測到。
出於性能原因(所有碰撞都是一起處理的),這個列表只會在每次物理反覆運算時發生一次更改,不會在物件移動後立即更改。請考慮使用訊號。
bool has_overlapping_areas() const 🔗
如果與其他 Area3D 相交,則返回 true,否則返回 false。重疊區域的 CollisionObject3D.collision_layer 必須是該區域 CollisionObject3D.collision_mask 的一部分,才能被偵測到。
出於性能原因(所有碰撞都是一起處理的),重疊區域的列表只會在每次物理反覆運算時發生一次更改,不會在對象移動後立即更改。請考慮使用訊號。
bool has_overlapping_bodies() const 🔗
如果與其他 PhysicsBody3D 或 GridMap 相交,則返回 true,否則返回 false。重疊物體的 CollisionObject3D.collision_layer 必須是該區域 CollisionObject3D.collision_mask 的一部分,才能被偵測到。
出於性能原因(所有碰撞都是一起處理的),重疊物體的列表只會在每次物理反覆運算時發生一次更改,不會在對象移動後立即更改。請考慮使用訊號。
bool overlaps_area(area: Node) const 🔗
如果給定的 Area3D 與此 Area3D 相交或重疊,則返回 true,否則返回 false。
注意:測試結果不反映物件移動後的即時狀態。出於性能原因,重疊列表每影格只會在物理反覆運算前更新一次。請考慮使用訊號。
bool overlaps_body(body: Node) const 🔗
如果給定的物理物體與此 Area3D 相交或重疊,則返回 true,否則返回 false。
注意:測試結果不反映物件移動後的即時狀態。出於性能原因,重疊列表每影格只會在物理反覆運算前更新一次。請考慮使用訊號。
參數 body 可以是 PhysicsBody3D 實例,也可以是 GridMap 實例。GridMap 雖然不是物理物體,但會把圖塊的碰撞形狀註冊為虛擬物理物體。