RigidBody2D

Inherits: PhysicsBody2D < CollisionObject2D < Node2D < CanvasItem < Node < Object

由2D物理引擎控制的实体。

描述

该节点实现了模拟的2D物理。你不能直接控制一个RigidBody2D。而是,你对它施加力(重力、冲力等),物理模拟会根据它的质量、摩擦力和其他物理属性来计算出运动结果。

RigidBody2D有4种行为mode。刚性、静态、角色和运动。

注意: 你不应该每一帧或经常改变RigidBody2D的positionlinear_velocity。如果需要直接影响物体的状态,请使用_integrate_forces,它允许你直接访问物理状态。

要记住,物理物体在自己管理变换,它会覆盖你的变换设置。所以任何直接或间接的变换(包括节点或其父级的缩放)将只在编辑器中可见,并在运行时立即重置。

如果你需要重载默认的物理行为或者在运行时添加变换,你可以写一个自定义的合力。参阅custom_integrator

质量中心总是位于节点的原点,而不考虑CollisionShape2D中心点的偏移。

教程

属性

float

angular_damp

-1.0

float

angular_velocity

0.0

Vector2

applied_force

Vector2( 0, 0 )

float

applied_torque

0.0

float

bounce

bool

can_sleep

true

bool

contact_monitor

false

int

contacts_reported

0

CCDMode

continuous_cd

0

bool

custom_integrator

false

float

friction

float

gravity_scale

1.0

float

inertia

float

linear_damp

-1.0

Vector2

linear_velocity

Vector2( 0, 0 )

float

mass

1.0

Mode

mode

0

PhysicsMaterial

physics_material_override

bool

sleeping

false

float

weight

9.8

方法

void

_integrate_forces ( Physics2DDirectBodyState state ) virtual

void

add_central_force ( Vector2 force )

void

add_force ( Vector2 offset, Vector2 force )

void

add_torque ( float torque )

void

apply_central_impulse ( Vector2 impulse )

void

apply_impulse ( Vector2 offset, Vector2 impulse )

void

apply_torque_impulse ( float torque )

Array

get_colliding_bodies ( ) const

void

set_axis_velocity ( Vector2 axis_velocity )

bool

test_motion ( Vector2 motion, bool infinite_inertia=true, float margin=0.08, Physics2DTestMotionResult result=null )

信号

  • body_entered ( Node body )

当与另一个PhysicsBody2DTileMap发生碰撞时触发。需要将contact_monitor设置为true,并且将contacts_reported设置得足够高以检测所有的碰撞。如果TileSet有碰撞Shape2D,就会检测到TileMap的。

body是其他PhysicsBody2DTileMapNode,如果它存在于树中。


  • body_exited ( Node body )

当与另一个PhysicsBody2DTileMap的碰撞结束时发出的。需要将 contact_monitor 设置为 true 并将 contacts_reported 设置为足够高以检测所有碰撞。如果TileSet有碰撞Shape2D,就会检测到TileMap

body 其他PhysicsBody2DTileMapNode(如果它存在于树中)。


  • body_shape_entered ( RID body_rid, Node body, int body_shape_index, int local_shape_index )

当这个RigidBody2D的Shape2D与另一个PhysicsBody2DTileMapShape2D碰撞时发出。要求 contact_monitor 设置为 true 并且 contacts_reported 设置得足够高,以检测所有碰撞。如果 TileMap 具有碰撞 Shape2D,就会检测到 TileSet

body_ridPhysics2DServer 使用的其他 PhysicsBody2DTileSetCollisionObject2DRID

body其他PhysicsBody2DTileMapNode(如果它存在于树上)。

body_shape_index 其他 PhysicsBody2DTileMap 使用 Physics2DServerShape2D 索引。获得带有 body.shape_owner_get_owner (body_shape_index)CollisionShape2D 节点。

local_shape_index Physics2DServer 使用的此 RigidBody2D 的 Shape2D 索引。获得带有 self.shape_owner_get_owner (local_shape_index)CollisionShape2D 节点。


  • body_shape_exited ( RID body_rid, Node body, int body_shape_index, int local_shape_index )

当这个RigidBody2D的一个Shape2D和另一个PhysicsBody2DTileMapShape2D之间的碰撞结束时触发。要求contact_monitor设置为truecontacts_reported设置得足够高以检测所有的碰撞。如果TileSet有碰撞Shape2D,就会检测到TileMap的。

body_rid Physics2DServer使用的其他PhysicsBody2DTileSetCollisionObject2DRID

body 另一个PhysicsBody2DTileMapNode,如果它存在于树中。

body_shape_indexPhysics2DServer使用的其他PhysicsBody2DTileMapShape2D的索引。用body.shape_owner_get_owner(body_shape_index)获得CollisionShape2D节点。

local_shape_index这个RigidBody2D的Shape2D的索引,由Physics2DServer使用。用self.shape_owner_get_owner(local_shape_index)获取CollisionShape2D节点。


  • sleeping_state_changed ( )

当物理引擎改变物体的睡眠状态时发出。

注意:改变sleeping的值不会触发这个信号。只有当物理引擎改变了睡眠状态或者使用了emit_signal("sleeping_state_changed")时,它才会被发出。

枚举

enum Mode:

  • MODE_RIGID = 0 —- 刚性模式。物体的行为就像一个物理物体。它与其他物体发生碰撞,并对施加在它身上的力做出反应。这是默认模式。

  • MODE_STATIC = 1 —- 静态模式。物体的行为就像一个StaticBody2D,不会移动。

  • MODE_CHARACTER = 2 —- 角色模式。与MODE_RIGID类似,但主体不能旋转。

  • MODE_KINEMATIC = 3 —- 运动学模式。这个物体的行为就像一个KinematicBody2D,必须通过代码来移动。


enum CCDMode:

  • CCD_MODE_DISABLED = 0 —- 禁用连续碰撞检测。这是检测物体碰撞的最快方法,但可能会错过小型、快速移动的物体。

  • CCD_MODE_CAST_RAY = 1 —- 使用射线投射启用连续碰撞检测。这比 shapecasting 快,但精度较低。

  • CCD_MODE_CAST_SHAPE = 2 —- 使用 shapecasting 启用连续碰撞检测。这是最慢的 CCD 方法,也是最精确的。

属性说明

Default

-1.0

Setter

set_angular_damp(value)

Getter

get_angular_damp()

对物体的 angular_velocity进行阻尼运算。如果 -1,物体将使用项目 > 项目设置 > Physics > 2d 中定义的 Default Angular Damp(默认角度阻尼)。

有关阻尼的更多详细信息,请参阅 ProjectSettings.physics/2d/default_angular_damp


Default

0.0

Setter

set_angular_velocity(value)

Getter

get_angular_velocity()

物体的旋转速度,单位为弧度每秒。


Default

Vector2( 0, 0 )

Setter

set_applied_force(value)

Getter

get_applied_force()

对物体施加的合力。


Default

0.0

Setter

set_applied_torque(value)

Getter

get_applied_torque()

对物体施加总力矩。


Setter

set_bounce(value)

Getter

get_bounce()

实体的弹性。值范围从0(无弹跳)到1(完全弹跳)。

已被废弃,请通过physics_material_override使用PhysicsMaterial.bounce代替。


Default

true

Setter

set_can_sleep(value)

Getter

is_able_to_sleep()

如果true,身体可以在没有运动的情况下进入睡眠模式。见sleeping

注意: RigidBody2D 的modeMODE_CHARACTER 时不会自动进入休眠模式。仍然可以通过将其 sleeping 属性设置为 true 来手动使其休眠。


  • bool contact_monitor

Default

false

Setter

set_contact_monitor(value)

Getter

is_contact_monitor_enabled()

如果true,则物体在与另一个RigidBody2D碰撞时会发出信号。参阅contacts_reported


  • int contacts_reported

Default

0

Setter

set_max_contacts_reported(value)

Getter

get_max_contacts_reported()

将被记录的最大接触次数。需要将 contact_monitor 设置为 true

注:接触次数与碰撞次数不同。平行边之间的碰撞将意味着两个接触(每端一个),平行面之间的碰撞将意味着四个接触(每个角一个)。


Default

0

Setter

set_continuous_collision_detection_mode(value)

Getter

get_continuous_collision_detection_mode()

连续碰撞检测模式。

连续碰撞检测尝试预测一个移动的物体会在哪里碰撞,而不是移动它并在碰撞后纠正它的运动。连续碰撞检测速度较慢,但更精确,并且与快速移动的小物体发生碰撞时遗漏更少。可以使用光线投射和形状投射方法。有关详细信息,请参阅 CCDMode


  • bool custom_integrator

Default

false

Setter

set_use_custom_integrator(value)

Getter

is_using_custom_integrator()

如果 true,则禁用该物体的内力积分。除了碰撞响应,物体只会按照 _integrate_forces 函数确定的方式移动。


Setter

set_friction(value)

Getter

get_friction()

物体的摩擦。取值范围从0(无摩擦)到1(最大摩擦)。

已弃用,通过 physics_material_override 使用 PhysicsMaterial.friction


Default

1.0

Setter

set_gravity_scale(value)

Getter

get_gravity_scale()

乘以施加在物体上的重力。物体的重力是由项目 > 项目设置 > Physics > 2d中的 Default Gravity(默认重力)值和/或任何由 Area2D 应用的额外重力矢量计算出来的。


Setter

set_inertia(value)

Getter

get_inertia()

物体的惯性力矩。这就像质量,但对于旋转来说:它决定了旋转物体需要多大的力矩。惯性力矩通常是由质量和形状自动计算出来的,但是这个函数允许你设置一个自定义值。设置0惯性会切换回自动计算。


Default

-1.0

Setter

set_linear_damp(value)

Getter

get_linear_damp()

对物体的linear_velocity进行阻尼运算。如果-1,物体将使用项目 > 项目设置 > Physics > 2d 中的 Default Linear Damp(默认线性阻尼)。

有关阻尼的更多详细信息,请参阅 ProjectSettings.physics/2d/default_linear_damp


Default

Vector2( 0, 0 )

Setter

set_linear_velocity(value)

Getter

get_linear_velocity()

物体的线速度,单位为像素每秒。可以偶尔使用,但是不要每一帧都设置它,因为物理可能在另一个线程中运行,并且以不同的间隔。使用 _integrate_forces 作为你的进程循环,以精确控制物体状态。


Default

1.0

Setter

set_mass(value)

Getter

get_mass()

实体的质量。


Default

0

Setter

set_mode(value)

Getter

get_mode()

物体的模式。可能的值见Mode


Setter

set_physics_material_override(value)

Getter

get_physics_material_override()

物体的物理材质。

如果为该属性指定了一种材质,则将使用该材质代替任何其他物理材质,例如继承的材质。


Default

false

Setter

set_sleeping(value)

Getter

is_sleeping()

如果 true,物体不会移动并且不会计算力,直到被另一个物体唤醒,例如碰撞,或使用 apply_impulseadd_force 方法。


Default

9.8

Setter

set_weight(value)

Getter

get_weight()

物体的重量基于其质量和项目 > 项目设置 > Physics > 2d 中的 Default Gravity(默认重力)值。

方法说明

允许你读取并安全地修改对象的模拟状态。如果你需要直接改变物体的position或其他物理属性,请使用它代替Node._physics_process。默认情况下,它是在通常的物理行为之外工作的,但是custom_integrator允许你禁用默认行为并为一个物体编写自定义的合力。


  • void add_central_force ( Vector2 force )

增加一个恒定的方向力,而不影响旋转。


向实体添加有作用点的力。力和相对于主体原点的偏移都在全局坐标中。


  • void add_torque ( float torque )

添加恒定的旋转力。


  • void apply_central_impulse ( Vector2 impulse )

在不影响旋转的情况下施加一个方向性的冲量。


对物体施加一个有向的冲量。冲量是与时间无关的。每一帧应用一个冲量会有一个与帧相关的力。由于这个原因,它只应该在模拟一次性冲击时使用(否则就使用”_force “函数)。位置使用全局坐标系的旋转,但以物体的原点为中心。


  • void apply_torque_impulse ( float torque )

对物体施加旋转冲量。


  • Array get_colliding_bodies ( ) const

返回一个与此碰撞的物体的列表。要求contact_monitor设置为truecontacts_reported设置得足够高,以检测所有碰撞。

注意: 在移动物体后,这个测试的结果不是立即的。为了性能,碰撞列表每帧在物理运算之前更新一次。可以考虑使用信号来代替。


  • void set_axis_velocity ( Vector2 axis_velocity )

设置物体在给定轴上的速度。给定矢量轴上的速度将设置为给定向量长度。这对于跳跃行为很有用。


如果在给定的向量中移动会导致碰撞,则返回 truemargin增加参与碰撞检测的形状的大小,result 是一个 Physics2DTestMotionResult 类型的对象,它包含关于碰撞的额外信息(如果有的话)。