CollisionObject3D

继承: Node3D < Node < Object

派生: Area3D, PhysicsBody3D

3D 物理对象的抽象基类。

描述

3D 物理对象的抽象基类。CollisionObject3D 能够容纳任意数量的 Shape3D 用作碰撞形状。每个形状必须分配给一个形状所有者。形状所有者不是节点,也不会出现在编辑器中,但可以通过代码使用 shape_owner_* 方法访问。

警告:如果使用非均一缩放,则该节点可能无法按预期工作。建议让所有轴上的缩放保持一致,可以用对碰撞形状的调整来代替非均一缩放。

属性

int

collision_layer

1

int

collision_mask

1

float

collision_priority

1.0

DisableMode

disable_mode

0

bool

input_capture_on_drag

false

bool

input_ray_pickable

true

方法

void

_input_event(camera: Camera3D, event: InputEvent, event_position: Vector3, normal: Vector3, shape_idx: int) virtual

void

_mouse_enter() virtual

void

_mouse_exit() virtual

int

create_shape_owner(owner: Object)

bool

get_collision_layer_value(layer_number: int) const

bool

get_collision_mask_value(layer_number: int) const

RID

get_rid() const

PackedInt32Array

get_shape_owners()

bool

is_shape_owner_disabled(owner_id: int) const

void

remove_shape_owner(owner_id: int)

void

set_collision_layer_value(layer_number: int, value: bool)

void

set_collision_mask_value(layer_number: int, value: bool)

int

shape_find_owner(shape_index: int) const

void

shape_owner_add_shape(owner_id: int, shape: Shape3D)

void

shape_owner_clear_shapes(owner_id: int)

Object

shape_owner_get_owner(owner_id: int) const

Shape3D

shape_owner_get_shape(owner_id: int, shape_id: int) const

int

shape_owner_get_shape_count(owner_id: int) const

int

shape_owner_get_shape_index(owner_id: int, shape_id: int) const

Transform3D

shape_owner_get_transform(owner_id: int) const

void

shape_owner_remove_shape(owner_id: int, shape_id: int)

void

shape_owner_set_disabled(owner_id: int, disabled: bool)

void

shape_owner_set_transform(owner_id: int, transform: Transform3D)


信号

input_event(camera: Node, event: InputEvent, event_position: Vector3, normal: Vector3, shape_idx: int) 🔗

当对象收到未处理的 InputEvent 时发出。event_position 是鼠标指针在索引为 shape_idx 的形状表面上的世界空间位置,normal 是表面在该点的法向量。


mouse_entered() 🔗

当鼠标指针进入该对象的任何形状时发出。要求 input_ray_pickabletrue 并且至少设置了一个 collision_layer 位。

注意:由于缺少连续的碰撞检测,如果鼠标移动得足够快并且 CollisionObject3D 的区域很小,则该信号可能不会按预期的顺序发出。如果另一个 CollisionObject3D 与所讨论的 CollisionObject3D 重叠,则也可能不会发出该信号。


mouse_exited() 🔗

当鼠标指针离开该对象的所有形状时发出。要求 input_ray_pickabletrue 并且至少设置了一个 collision_layer 位。

注意:由于缺少连续的碰撞检测,如果鼠标移动得足够快并且 CollisionObject3D 的区域很小,则该信号可能不会按预期的顺序发出。如果另一个 CollisionObject3D 与所讨论的 CollisionObject3D 重叠,则也可能不会发出该信号。


枚举

enum DisableMode: 🔗

DisableMode DISABLE_MODE_REMOVE = 0

Node.process_mode 被设置为 Node.PROCESS_MODE_DISABLED 时,从物理仿真中移除,停止与此 CollisionObject3D 的所有物理交互。

当该 Node 再次被处理时,会自动重新加入到物理仿真中。

DisableMode DISABLE_MODE_MAKE_STATIC = 1

Node.process_mode 被设置为 Node.PROCESS_MODE_DISABLED 时,使实体静态化。不影响 Area3DPhysicsBody3D 在静态时不会受到力或其他实体的影响。

当该 Node 再次被处理时,自动将 PhysicsBody3D 设置回其原始模式。

DisableMode DISABLE_MODE_KEEP_ACTIVE = 2

Node.process_mode 被设置为 Node.PROCESS_MODE_DISABLED 时,不影响物理仿真。


属性说明

int collision_layer = 1 🔗

  • void set_collision_layer(value: int)

  • int get_collision_layer()

该 CollisionObject3D 所在的物理层。碰撞对象可以存在于 32 个不同层中的一层或多层。另见 collision_mask

注意:只有当对象 B 位于对象 A 扫描的任何层中时,对象 A 才能检测到与对象 B 的接触。有关更多信息,请参阅文档中的《碰撞层和掩码》


int collision_mask = 1 🔗

  • void set_collision_mask(value: int)

  • int get_collision_mask()

该 CollisionObject3D 扫描的物理层。碰撞对象可以扫描 32 个不同层中的一层或多层。另见 collision_layer

注意:只有当对象 B 位于对象 A 扫描的任何层中时,对象 A 才能检测到与对象 B 的接触。有关更多信息,请参阅文档中的《碰撞层和掩码》


float collision_priority = 1.0 🔗

  • void set_collision_priority(value: float)

  • float get_collision_priority()

发生穿透时用于解决碰撞的优先级。优先级越高,对物体的穿透度就越低。例如,可以用来防止玩家突破关卡的边界。


DisableMode disable_mode = 0 🔗

Node.process_mode 被设置为 Node.PROCESS_MODE_DISABLED 时,定义物理行为。有关不同模式的更多详细信息,请参阅 DisableMode


bool input_capture_on_drag = false 🔗

  • void set_capture_input_on_drag(value: bool)

  • bool get_capture_input_on_drag()

如果为 true,则当鼠标拖过其形状时,CollisionObject3D 将继续接收输入事件。


bool input_ray_pickable = true 🔗

  • void set_ray_pickable(value: bool)

  • bool is_ray_pickable()

如果为 true,则该对象是可拾取的。可拾取的对象可以检测鼠标指针的进入/离开,鼠标位于其中时,就会报告输入事件。要求至少设置一个 collision_layer 位。


方法说明

void _input_event(camera: Camera3D, event: InputEvent, event_position: Vector3, normal: Vector3, shape_idx: int) virtual 🔗

接收未处理的 InputEventevent_position 是鼠标指针在索引为 shape_idx 的形状表面上的世界空间位置,normal 是该点表面的法向量。连接到 input_event 信号即可轻松获取这些事件。

注意:_input_event 要求 input_ray_pickabletrue,并且至少要设置一个 collision_layer 位。


void _mouse_enter() virtual 🔗

当鼠标指针进入该实体的任何形状时调用。要求 input_ray_pickabletrue 并且至少设置一个 collision_layer 位。请注意,在单个 CollisionObject3D 中的不同形状之间移动,不会导致该函数被调用。


void _mouse_exit() virtual 🔗

当鼠标指针离开该实体的所有形状时调用。要求 input_ray_pickabletrue 并且至少设置一个 collision_layer 位。请注意,在单个 CollisionObject3D 中的不同形状之间移动,不会导致该函数被调用。


int create_shape_owner(owner: Object) 🔗

为给定对象创建一个新的形状所有者。返回 owner_id的新所有者,供将来引用。


bool get_collision_layer_value(layer_number: int) const 🔗

返回 collision_layer 中是否启用了指定的层,给定的 layer_number 应在 1 和 32 之间。


bool get_collision_mask_value(layer_number: int) const 🔗

返回 collision_mask 中是否启用了指定的层,给定的 layer_number 应在 1 和 32 之间。


RID get_rid() const 🔗

返回对象的 RID


PackedInt32Array get_shape_owners() 🔗

返回一个 owner_id 标识符的 Array。你可以在其他使用 owner_id 作为参数的方法中使用这些 ID。


bool is_shape_owner_disabled(owner_id: int) const 🔗

如果为 true,则禁用形状所有者及其形状。


void remove_shape_owner(owner_id: int) 🔗

移除给定形状的所有者。


void set_collision_layer_value(layer_number: int, value: bool) 🔗

根据 value,启用或禁用 collision_layer 中指定的层,给定的 layer_number 应在 1 和 32 之间。


void set_collision_mask_value(layer_number: int, value: bool) 🔗

根据 value,启用或禁用 collision_mask 中指定的层,给定的 layer_number 应在 1 和 32 之间。


int shape_find_owner(shape_index: int) const 🔗

返回指定形状的 owner_id


void shape_owner_add_shape(owner_id: int, shape: Shape3D) 🔗

向形状拥有者添加 Shape3D


void shape_owner_clear_shapes(owner_id: int) 🔗

移除形状所有者的所有形状。


Object shape_owner_get_owner(owner_id: int) const 🔗

返回给定形状所有者的父对象。


Shape3D shape_owner_get_shape(owner_id: int, shape_id: int) const 🔗

返回形状所有者中具有给定 ID 的 Shape3D


int shape_owner_get_shape_count(owner_id: int) const 🔗

返回给定形状所有者包含的形状数量。


int shape_owner_get_shape_index(owner_id: int, shape_id: int) const 🔗

返回形状所有者中具有给定 ID 的 Shape3D 的子索引。


Transform3D shape_owner_get_transform(owner_id: int) const 🔗

返回形状所有者的 Transform3D


void shape_owner_remove_shape(owner_id: int, shape_id: int) 🔗

从给定的形状所有者中移除一个形状。


void shape_owner_set_disabled(owner_id: int, disabled: bool) 🔗

如果为 true,则禁用给定的形状所有者。


void shape_owner_set_transform(owner_id: int, transform: Transform3D) 🔗

设置给定形状所有者的 Transform3D