RigidBody2D
Inherits: PhysicsBody2D < CollisionObject2D < Node2D < CanvasItem < Node < Object
由2D物理引擎控制的实体。
描述
该节点实现了模拟的2D物理。你不能直接控制一个RigidBody2D。而是,你对它施加力(重力、冲力等),物理模拟会根据它的质量、摩擦力和其他物理属性来计算出运动结果。
RigidBody2D有4种行为mode。刚性、静态、角色和运动。
注意: 你不应该每一帧或经常改变RigidBody2D的position
或linear_velocity
。如果需要直接影响物体的状态,请使用_integrate_forces,它允许你直接访问物理状态。
要记住,物理物体在自己管理变换,它会覆盖你的变换设置。所以任何直接或间接的变换(包括节点或其父级的缩放)将只在编辑器中可见,并在运行时立即重置。
如果你需要重载默认的物理行为或者在运行时添加变换,你可以写一个自定义的合力。参阅custom_integrator。
质量中心总是位于节点的原点,而不考虑CollisionShape2D中心点的偏移。
教程
属性
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
|
方法
void | _integrate_forces ( Physics2DDirectBodyState state ) virtual |
void | add_central_force ( Vector2 force ) |
void | |
void | add_torque ( float torque ) |
void | apply_central_impulse ( Vector2 impulse ) |
void | apply_impulse ( Vector2 offset, Vector2 impulse ) |
void | apply_torque_impulse ( float torque ) |
get_colliding_bodies ( ) const | |
void | set_axis_velocity ( Vector2 axis_velocity ) |
test_motion ( Vector2 motion, bool infinite_inertia=true, float margin=0.08, Physics2DTestMotionResult result=null ) |
信号
- body_entered ( Node body )
当与另一个PhysicsBody2D或TileMap发生碰撞时触发。需要将contact_monitor设置为true
,并且将contacts_reported设置得足够高以检测所有的碰撞。如果TileSet有碰撞Shape2D,就会检测到TileMap的。
body
是其他PhysicsBody2D或TileMap的Node,如果它存在于树中。
- body_exited ( Node body )
当与另一个PhysicsBody2D或TileMap的碰撞结束时发出的。需要将 contact_monitor 设置为 true
并将 contacts_reported 设置为足够高以检测所有碰撞。如果TileSet有碰撞Shape2D,就会检测到TileMap。
body
其他PhysicsBody2D或TileMap的Node(如果它存在于树中)。
当这个RigidBody2D的Shape2D与另一个PhysicsBody2D或TileMap的Shape2D碰撞时发出。要求 contact_monitor 设置为 true
并且 contacts_reported 设置得足够高,以检测所有碰撞。如果 TileMap 具有碰撞 Shape2D,就会检测到 TileSet。
body_rid
由 Physics2DServer 使用的其他 PhysicsBody2D 或 TileSet 的 CollisionObject2D 的 RID。
body
其他PhysicsBody2D或TileMap的Node(如果它存在于树上)。
body_shape_index
其他 PhysicsBody2D 或 TileMap 使用 Physics2DServer 的 Shape2D 索引。获得带有 body.shape_owner_get_owner (body_shape_index)
的 CollisionShape2D 节点。
local_shape_index
Physics2DServer 使用的此 RigidBody2D 的 Shape2D 索引。获得带有 self.shape_owner_get_owner (local_shape_index)
的 CollisionShape2D 节点。
当这个RigidBody2D的一个Shape2D和另一个PhysicsBody2D或TileMap的Shape2D之间的碰撞结束时触发。要求contact_monitor设置为true
,contacts_reported设置得足够高以检测所有的碰撞。如果TileSet有碰撞Shape2D,就会检测到TileMap的。
body_rid
Physics2DServer使用的其他PhysicsBody2D或TileSet的CollisionObject2D的 RID。
body
另一个PhysicsBody2D或TileMap的Node,如果它存在于树中。
body_shape_index
由Physics2DServer使用的其他PhysicsBody2D或TileMap的Shape2D的索引。用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 方法,也是最精确的。
属性说明
- float angular_damp
Default |
|
Setter | set_angular_damp(value) |
Getter | get_angular_damp() |
对物体的 angular_velocity进行阻尼运算。如果 -1
,物体将使用项目 > 项目设置 > Physics > 2d 中定义的 Default Angular Damp(默认角度阻尼)。
有关阻尼的更多详细信息,请参阅 ProjectSettings.physics/2d/default_angular_damp。
- float angular_velocity
Default |
|
Setter | set_angular_velocity(value) |
Getter | get_angular_velocity() |
物体的旋转速度,单位为弧度每秒。
- Vector2 applied_force
Default |
|
Setter | set_applied_force(value) |
Getter | get_applied_force() |
对物体施加的合力。
- float applied_torque
Default |
|
Setter | set_applied_torque(value) |
Getter | get_applied_torque() |
对物体施加总力矩。
- float bounce
Setter | set_bounce(value) |
Getter | get_bounce() |
实体的弹性。值范围从0
(无弹跳)到1
(完全弹跳)。
已被废弃,请通过physics_material_override使用PhysicsMaterial.bounce代替。
- bool can_sleep
Default |
|
Setter | set_can_sleep(value) |
Getter | is_able_to_sleep() |
如果true
,身体可以在没有运动的情况下进入睡眠模式。见sleeping。
注意: RigidBody2D 的mode 为MODE_CHARACTER 时不会自动进入休眠模式。仍然可以通过将其 sleeping 属性设置为 true
来手动使其休眠。
- bool contact_monitor
Default |
|
Setter | set_contact_monitor(value) |
Getter | is_contact_monitor_enabled() |
如果true
,则物体在与另一个RigidBody2D碰撞时会发出信号。参阅contacts_reported。
- int contacts_reported
Default |
|
Setter | set_max_contacts_reported(value) |
Getter | get_max_contacts_reported() |
将被记录的最大接触次数。需要将 contact_monitor 设置为 true
。
注:接触次数与碰撞次数不同。平行边之间的碰撞将意味着两个接触(每端一个),平行面之间的碰撞将意味着四个接触(每个角一个)。
- CCDMode continuous_cd
Default |
|
Setter | set_continuous_collision_detection_mode(value) |
Getter | get_continuous_collision_detection_mode() |
连续碰撞检测模式。
连续碰撞检测尝试预测一个移动的物体会在哪里碰撞,而不是移动它并在碰撞后纠正它的运动。连续碰撞检测速度较慢,但更精确,并且与快速移动的小物体发生碰撞时遗漏更少。可以使用光线投射和形状投射方法。有关详细信息,请参阅 CCDMode。
- bool custom_integrator
Default |
|
Setter | set_use_custom_integrator(value) |
Getter | is_using_custom_integrator() |
如果 true
,则禁用该物体的内力积分。除了碰撞响应,物体只会按照 _integrate_forces 函数确定的方式移动。
- float friction
Setter | set_friction(value) |
Getter | get_friction() |
物体的摩擦。取值范围从0
(无摩擦)到1
(最大摩擦)。
已弃用,通过 physics_material_override 使用 PhysicsMaterial.friction。
- float gravity_scale
Default |
|
Setter | set_gravity_scale(value) |
Getter | get_gravity_scale() |
乘以施加在物体上的重力。物体的重力是由项目 > 项目设置 > Physics > 2d中的 Default Gravity(默认重力)值和/或任何由 Area2D 应用的额外重力矢量计算出来的。
- float inertia
Setter | set_inertia(value) |
Getter | get_inertia() |
物体的惯性力矩。这就像质量,但对于旋转来说:它决定了旋转物体需要多大的力矩。惯性力矩通常是由质量和形状自动计算出来的,但是这个函数允许你设置一个自定义值。设置0惯性会切换回自动计算。
- float linear_damp
Default |
|
Setter | set_linear_damp(value) |
Getter | get_linear_damp() |
对物体的linear_velocity进行阻尼运算。如果-1
,物体将使用项目 > 项目设置 > Physics > 2d 中的 Default Linear Damp(默认线性阻尼)。
有关阻尼的更多详细信息,请参阅 ProjectSettings.physics/2d/default_linear_damp。
- Vector2 linear_velocity
Default |
|
Setter | set_linear_velocity(value) |
Getter | get_linear_velocity() |
物体的线速度,单位为像素每秒。可以偶尔使用,但是不要每一帧都设置它,因为物理可能在另一个线程中运行,并且以不同的间隔。使用 _integrate_forces 作为你的进程循环,以精确控制物体状态。
- float mass
Default |
|
Setter | set_mass(value) |
Getter | get_mass() |
实体的质量。
- Mode mode
Default |
|
Setter | set_mode(value) |
Getter | get_mode() |
物体的模式。可能的值见Mode。
- PhysicsMaterial physics_material_override
Setter | set_physics_material_override(value) |
Getter | get_physics_material_override() |
物体的物理材质。
如果为该属性指定了一种材质,则将使用该材质代替任何其他物理材质,例如继承的材质。
- bool sleeping
Default |
|
Setter | set_sleeping(value) |
Getter | is_sleeping() |
如果 true
,物体不会移动并且不会计算力,直到被另一个物体唤醒,例如碰撞,或使用 apply_impulse 或 add_force 方法。
- float weight
Default |
|
Setter | set_weight(value) |
Getter | get_weight() |
物体的重量基于其质量和项目 > 项目设置 > Physics > 2d 中的 Default Gravity(默认重力)值。
方法说明
- void _integrate_forces ( Physics2DDirectBodyState state ) virtual
允许你读取并安全地修改对象的模拟状态。如果你需要直接改变物体的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设置为true
,contacts_reported设置得足够高,以检测所有碰撞。
注意: 在移动物体后,这个测试的结果不是立即的。为了性能,碰撞列表每帧在物理运算之前更新一次。可以考虑使用信号来代替。
- void set_axis_velocity ( Vector2 axis_velocity )
设置物体在给定轴上的速度。给定矢量轴上的速度将设置为给定向量长度。这对于跳跃行为很有用。
- bool test_motion ( Vector2 motion, bool infinite_inertia=true, float margin=0.08, Physics2DTestMotionResult result=null )
如果在给定的向量中移动会导致碰撞,则返回 true
。margin
增加参与碰撞检测的形状的大小,result
是一个 Physics2DTestMotionResult 类型的对象,它包含关于碰撞的额外信息(如果有的话)。