Godot Engine 学习笔记 RigidBody2D

RigidBody2D

  • RigidBody2D
    • 简要说明
    • 成员函数
    • 信号
    • 成员变量
    • 枚举
    • 说明
    • 成员函数说明
    • 使用

RigidBody2D

以下为我对于官方文档的翻译以及使用情况,3.0版本的文档
RigidBody2D官方文档
继承: PhysicsBody2D < CollisionObject2D < Node2D < CanvasItem < Node < Object
类型: Core

简要说明

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

成员函数

返回类型 函数
void _integrate_forces ( Physics2DDirectBodyState state ) virtual
void add_force ( Vector2 offset, Vector2 force )
void apply_impulse ( Vector2 offset, Vector2 impulse )
Array get_colliding_bodies ( ) const
void set_axis_velocity ( Vector2 axis_velocity )
bool test_motion ( Vector2 motion, float margin=0.08, Physics2DTestMotionResult result=null )

信号

  • body_entered ( Object body )

当一个物体进入这个物体时发出的。 contact_monitor 必须为true,contacts_reported 必须大于0

  • body_exited ( Object body )

当一个物体离开这个物体时发出的。 contact_monitor 必须为true,contacts_reported 必须大于0

  • body_shape_entered ( int body_id, Object body, int body_shape, int local_shape )

当一个物体进入这个物体时发出的。报告碰撞形状信息。有关形状索引信息,请参见 CollisionObject2D 。 contact_monitor 必须为true, contacts_reported 必须大于 0

  • body_shape_exited ( int body_id, Object body, int body_shape, int local_shape )

当一个物体离开这个物体时发出的。报告碰撞形状信息。有关形状索引信息,请参见 CollisionObject2D 。 contact_monitor 必须为true, contacts_reported 必须大于 0

  • sleeping_state_changed ( )

当睡眠改变时发出。

成员变量

  • float angular_damp - 抑制物体的 angular_velocity 。如果值为 -1 那么物体将使用 “Project(项目) > Project Settings(项目设置) > Physics > 2d” 中的 “Default Angular Damp” 。默认值: -1
  • float angular_velocity - 物体的旋转速度。
  • Vector2 applied_force - 物体的总施加力。
  • float applied_torque - 物体的总施加扭矩。
  • float bounce - 物体的弹性。默认值: 0
  • bool can_sleep - 如果值为 true ,如果没有运动,物体就不会计算力并且它将作为一个静止的物体。当其他力通过碰撞或使用 apply_impulse 或 add_force 时,身体会醒来。默认值: true
  • bool contact_monitor - 如果是真的,当它与另一个 RigidBody2D 相撞时,物体会发出信号。请参阅 contacts_reported 。默认值: false
  • int contacts_reported - 要报告的接触的最大数量。默认值: 0
  • CCDMode continuous_cd - 连续碰撞检测模式。默认值: CCD_MODE_DISABLED

连续碰撞检测试图预测一个运动物体在哪里碰撞,而不是移动它,并在碰撞后校正它的运动。连续碰撞检测速度较慢,但精度更高,并且忽略了小的、快速移动的物体的碰撞。光线投射与形状转换方法是能找到的。详情见CCD_MODE_ 常数。

  • bool custom_integrator - 如果值为 true 那么这个物体的内力结合将被禁止。除了碰撞响应之外,物体将只由 _integrate_forces 函数决定移动。
  • float friction - 身体的摩擦力值范围从 0 (无摩擦)到 1 (最大摩擦)。默认值: 1
  • float gravity_scale - 乘以重力施加于身体。物体的重力是由“ Project(项目) > Project Settings(项目设置) > Physics > 2d” 中的 “Default Gravity” 值 和/或 Area2Ds应用的任何附加重力矢量计算的。默认值:1
  • float inertia - 物体的转动惯量。这就像质量,但为了旋转:它决定旋转身体需要多少扭矩。惯性矩通常是根据质量和形状自动计算的,但是这个函数允许您设置一个自定义值。设置0(或负)惯性返回自动计算它。
  • float linear_damp - 抑制物体的 linear_velocity 。如果- 1,物体将使用 “Project(项目) > Project Settings(项目设置) > Physics > 2d” 中的“Default Linear Damp”。默认值: -1
  • Vector2 linear_velocity - 物体的线性速度。
  • float mass - 物体的质量。默认值: 1
  • Mode mode - 物体的模式。参见 MODE_* 常数。默认值: MODE_RIGID
  • bool sleeping - 如果值为 true 物体会进入睡眠且不会计算力,直到通过碰撞或使用 apply_impulse 或 add_force 唤醒。
  • float weight - 物体的重量基于其的质量和 “Project(项目) > Project Settings(项目设置) > Physics > 2d” 中的 “Default Gravity” 的值。

枚举

enum CCDMode

  • CCD_MODE_DISABLED = 0 — 禁用连续碰撞检测。这是检测身体碰撞最快的方法,但可以错过小而快速移动的物体。
  • CCD_MODE_CAST_RAY = 1 — 使用光线投射实现连续碰撞检测。这比形状调整快,但精度不高。
  • CCD_MODE_CAST_SHAPE = 2 — 使用形状调整实现连续碰撞检测。这是最慢的CCD方法,也是最精确的。
    enum Mode
  • MODE_RIGID = 0 — 刚性模式。身体表现为一个物理对象。它与其他物体发生碰撞,并对它施加的力作出反应。这是默认模式。
  • MODE_STATIC = 1 — 静态模式。物体的表现类似 StaticBody2D ,不动。
  • MODE_CHARACTER = 2 — 字符模式。类似于 MODE_RIGID ,但身体不能旋转。
  • MODE_KINEMATIC = 3 — 运动模式。物体类似一个 KinematicBody2D ,必须用代码移动。

说明

这个节点实现了模拟2D物理。您不直接控制 RigidBody2D 。取而代之的是,你施加力(重力、脉冲等)并且物理模拟基于它的质量、摩擦和其他物理特性来计算最终的运动。

RigidBody2D 具有4种行为模式:刚性、静态、字符和运动。

注意:你不应该改变 RigidBody2D 的 positionlinear_velocity 每帧甚至非常频繁。如果你需要直接影响身体的状态,请使用 _integrate_forces 力,它可以让你直接进入物理状态。
如果需要重写默认物理行为,可以编写自定义力集成。参见 custom_integrator 。

成员函数说明

  • void _integrate_forces ( Physics2DDirectBodyState state ) virtual

允许您读取并安全地修改对象的仿真状态。如果你需要直接改变身体的 position 或其他物理特性,就用这个 Node._physics_process 代替。默认情况下,它还可以用于附加普通的物理行为,但是 custom_integrator 允许禁用默认行为,并为主体编写自定义的力集成。

  • void add_force ( Vector2 offset, Vector2 force )

向物体增加一个定向力。来自物体原点的力和偏移都在全局坐标中。

  • void apply_impulse ( Vector2 offset, Vector2 impulse )

对物体施加一个定向推力(这将受身体质量和形状的影响)。这相当于用球杆击打台球:瞬间施加的力。推力和来自物体原点的偏移都在全局坐标中。

  • Array get_colliding_bodies ( ) const

返回与此碰撞的物体的列表。使用 contacts_reported 设置最大报告数。还必须将 contact_monitor 设置为 true。注意,在移动对象之后,此测试的结果不是即时的。对于性能,每帧一次和物理步骤之前更新一次碰撞列表。考虑使用信号代替。

  • void set_axis_velocity ( Vector2 axis_velocity )

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

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

如果用给定向量进行移动会导致冲突,则返回 truemargin 增加了碰撞检测中涉及的形状的大小, 并且 result(结果) 是Physics2DTestMotionResult类型的对象,该对象包含关于碰撞的附加信息(如果有的话)。

使用

RigidBody2D的使用需要创建碰撞区域,可以通过 CollisionShape2D 和 CollisionPolygon2D 创建碰撞区域。
关于RigidBody2D的mode属性的4个模式:

  • Rigid模式是RigidBody2D默认的模式,会自行根据所受的力计算合力进行运动,也受扭力的作用进行自身旋转。
  • Static模式属于静态不会动,无论施加怎样的力都不会移动。
  • Character模式与Rigid相近,当时不会出现自身的旋转,也就是说给它的applied_torque属性设置多大的值都不会出现旋转的情况,可以说是使物体不存在扭力。
  • Kinematic模式如果没有代码控制其移动的话,它将与Static模式相近处于静止状态,也不受碰撞影响。

关于 Angular Damp 与 Linear Damp:

  • 属性用于抑制物体的旋转和移动的。
  • Angular Damp 随着这个属性增大,旋转所需的扭力会不断增大。
  • Linear Damp 随着这个属性增大,移动所需的力会不断增大。

关于 Custom Integrator 启用:

  • 物体的内力结合将被禁止,它将只由 _integrate_forces 函数决定移动和碰撞造成的移动。
  • 但可以在 Angular Velocity 和 Linear Velocity 属性中赋予物体线性移动速度和自身旋转速度。

关于 函数 add_force 、apply_impulse 、set_axis_velocity:

  • ball.tscn

Godot Engine 学习笔记 RigidBody2D_第1张图片

  • ball.gd
extends RigidBody2D

var move_left = Vector2(-50, 0)
var left_offset = Vector2(0,0)

var move_right = Vector2(50, 0)
var right_offset = Vector2(0,0)

func _ready():
	pass

func _process(delta):
	if Input.is_action_pressed("ui_left"):
		get_node(".").apply_impulse(left_offset, move_left)
	if Input.is_action_pressed("ui_right"):
		get_node(".").add_force(right_offset, move_right)
	if Input.is_action_pressed("ui_up"):
		get_node(".").set_axis_velocity(jump)
	pass
  • apply_impulse

  • add_force

  • set_axis_velocity

你可能感兴趣的:(Godot,Engine)