PhysicsServer2D
继承: Object
用于访问低阶 2D 物理的服务器接口。
描述
PhysicsServer2D 是负责所有 2D 物理的服务器。它可以直接创建和操作所有物理对象:
Space(空间)是用于物理仿真的自包含世界。它包含实体、区域和关节。可以对其状态进行查询,获取碰撞和相交信息,并且可以修改部分仿真参数。
Shape(形状)是圆形、矩形、胶囊形、多边形等几何形状。加入到实体/区域中就可以用来进行碰撞检测,还可以带有相对于实体/区域原点的额外变换。实体/区域中可以添加多个(变换后的)形状,并且可以使用不同的局部变换将单个形状多次添加到实体/区域中。
Body(实体)是物理对象,可以处于静态、运动学或刚性模式。可以对其状态进行查询和更新(例如位置、速度等)。可以设置力的集成回调,自定义实体的物理特性。
Area(区域)是空间中的区块,可用于检测进入和离开它的实体和区域。可以设置实体的监视回调,报告进入/离开的实体形状,同样可以设置区域的监视回调。通过设置区域参数,可以在区域内覆盖重力和阻尼。
Joint(关节)是两个实体之间或一个实体相对于某个点的约束。可以调整关节偏置和弹簧关节的放松长度等参数。
PhysicsServer2D 中的物理对象可以独立创建和操作;不必将它们绑定到场景树中的节点。
注意:所有 2D 物理节点都在内部使用这个物理服务器。将物理节点添加到场景树,就会导致在物理服务器中创建相应的物理对象。刚体节点会注册回调,该回调会(在每次物理更新时)使用物理服务器中相应实体对象的变换更新该节点的变换。区域节点会注册回调,用来通知区域节点与物理服务器中相应区域对象的重叠。射线投射节点会查询物理服务器中相关空间的直接状态。
方法
枚举
enum SpaceParameter: 🔗
SpaceParameter SPACE_PARAM_CONTACT_RECYCLE_RADIUS = 0
常量,用于设置/获取一对物体在其碰撞状态被重新计算之前的最大移动距离。该参数的默认值为 ProjectSettings.physics/2d/solver/contact_recycle_radius。
SpaceParameter SPACE_PARAM_CONTACT_MAX_SEPARATION = 1
常量,用于设置/获取两个形状间的最大距离,超过该距离后它们将被视为分离,接触将被弃置。该参数的默认值为 ProjectSettings.physics/2d/solver/contact_max_separation。
SpaceParameter SPACE_PARAM_CONTACT_MAX_ALLOWED_PENETRATION = 2
常量,用于设置/获取两个形状互相穿透的最大距离,超过该距离后将视为碰撞。该参数的默认值为 ProjectSettings.physics/2d/solver/contact_max_allowed_penetration。
SpaceParameter SPACE_PARAM_CONTACT_DEFAULT_BIAS = 3
常量,用于设置/获取所有物理接触的默认求解器偏差。求解器偏差是控制两个对象在重叠后“反弹”的程度的一个系数,以避免由于数值不精确而使它们处于该状态。该参数的默认值为 ProjectSettings.physics/2d/solver/default_contact_bias。
SpaceParameter SPACE_PARAM_BODY_LINEAR_VELOCITY_SLEEP_THRESHOLD = 4
常量,用于设置/获取活跃的阈值线速度。一个线性速度和角速度都被标记为可能处于非活动状态的物体,将在给定时间后进入睡眠状态。该参数的默认值为 ProjectSettings.physics/2d/sleep_threshold_linear。
SpaceParameter SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_THRESHOLD = 5
常量,用于设置/获取活跃的阈值角速度。一个线性速度和角速度都被标记为可能处于非活动状态的物体,将在给定时间后进入睡眠状态。该参数的默认值为 ProjectSettings.physics/2d/sleep_threshold_angular。
SpaceParameter SPACE_PARAM_BODY_TIME_TO_SLEEP = 6
常量,用于设置/获得最大的活动时间。一个被标记为线速度和角速度都可能不活动的物体,在这个时间之后将被置入睡眠状态。
SpaceParameter SPACE_PARAM_CONSTRAINT_DEFAULT_BIAS = 7
常量,用于设置/获取所有物理约束的默认求解器偏差。求解器偏差是控制两个对象在违反约束后“反弹”的程度的一个系数,以避免由于数值不精确而使它们处于该状态。该参数的默认值为 ProjectSettings.physics/2d/solver/default_constraint_bias。
SpaceParameter SPACE_PARAM_SOLVER_ITERATIONS = 8
常量,用于设置/获取所有接触与约束的求解器迭代数。迭代次数越多,碰撞越准确。但是,大量的迭代会需要更多的 CPU 能力,会降低性能。
enum ShapeType: 🔗
ShapeType SHAPE_WORLD_BOUNDARY = 0
常量,用于创建世界边界形状。一个世界边界形状,是具有原点和法线的无限直线。因此,它可以用于前面/背面检查。
ShapeType SHAPE_SEPARATION_RAY = 1
常量,用于创建分离射线形状。一条分离射线由一个长度定义,并将其自身与接触其远端点的物体分开。对角色控制器很有用。
ShapeType SHAPE_SEGMENT = 2
常量,用于创建线段形状。一条线段形状是从点 A 到点 B 的有限线段。可以用于检查交叉点。
ShapeType SHAPE_CIRCLE = 3
这是创建圆形的常量。一个圆的形状只有一个半径。它可以用于交点和内/外侧检查。
ShapeType SHAPE_RECTANGLE = 4
这是用于创建矩形形状的常量。矩形形状是由宽度和高度定义的。它可以用于交点和内/外侧检查。
ShapeType SHAPE_CAPSULE = 5
这是创建胶囊形状的常量。一个胶囊形状由一个半径和一个长度定义。它可以用于交点和内/外侧检查。
ShapeType SHAPE_CONVEX_POLYGON = 6
常量,用于创建凸多边形形状。一个多边形是由一个点的列表定义的。它可以用于交叉点和内侧/外侧检查。
ShapeType SHAPE_CONCAVE_POLYGON = 7
这是创建凹形多边形的常量。一个多边形是由一个点的列表定义的。它可以用于交叉点检查,但不能用于内/外侧检查。
ShapeType SHAPE_CUSTOM = 8
引擎内部会使用这个常量。任何试图创建这种形状的行为都会导致错误。
enum AreaParameter: 🔗
AreaParameter AREA_PARAM_GRAVITY_OVERRIDE_MODE = 0
常量,在一个区域中设置/获取重力覆盖模式。有关可能的值,请参阅 AreaSpaceOverrideMode。这个参数的默认值是 AREA_SPACE_OVERRIDE_DISABLED。
AreaParameter AREA_PARAM_GRAVITY = 1
常量,用于设置/获取区域中的重力强度。该参数的默认值为 9.80665
。
AreaParameter AREA_PARAM_GRAVITY_VECTOR = 2
常量,用于设置/获取区域中的重力向量/中心。该参数的默认值为 Vector2(0, -1)
。
AreaParameter AREA_PARAM_GRAVITY_IS_POINT = 3
常量,用于设置/获取区域中的重力向量是方向,还是中心点。该参数的默认值为 false
。
AreaParameter AREA_PARAM_GRAVITY_POINT_UNIT_DISTANCE = 4
常量,用于设置/获取重力强度等于 AREA_PARAM_GRAVITY 控制的重力的距离。例如,在一个半径为 100 像素且表面重力为 4.0 px/s² 的行星上,将重力设置为 4.0,将单位距离设置为 100.0。重力将根据平方反比定律衰减,因此在该示例中,距离中心 200 像素处的重力将为 1.0 px/s²(距离的两倍,重力的 1/4),距离中心 50 像素处重力为 16.0 px/s²(距离的一半,重力的 4 倍),依此类推。
仅当单位距离为正数时,上述情况才成立。当单位距离设置为 0.0 时,重力将与距离无关。该参数的默认值为 0.0
。
AreaParameter AREA_PARAM_LINEAR_DAMP_OVERRIDE_MODE = 5
常量,用于在一个区域中设置/获取线性阻尼覆盖模式。有关可能的值,请参阅 AreaSpaceOverrideMode。这个参数的默认值是 AREA_SPACE_OVERRIDE_DISABLED。
AreaParameter AREA_PARAM_LINEAR_DAMP = 6
常数,用于设置/获取区域的线性阻尼系数。该参数的默认值为 0.1
。
AreaParameter AREA_PARAM_ANGULAR_DAMP_OVERRIDE_MODE = 7
常量,用于在一个区域中设置/获取角度阻尼覆盖模式。有关可能的值,请参阅 AreaSpaceOverrideMode。这个参数的默认值是 AREA_SPACE_OVERRIDE_DISABLED。
AreaParameter AREA_PARAM_ANGULAR_DAMP = 8
常数,用于设置/获取区域的角度阻尼系数。该参数的默认值为 1.0
。
AreaParameter AREA_PARAM_PRIORITY = 9
常量,用于设置/获取区域的优先级(处理顺序)。该参数的默认值为 0
。
enum AreaSpaceOverrideMode: 🔗
AreaSpaceOverrideMode AREA_SPACE_OVERRIDE_DISABLED = 0
该区域不影响重力/阻尼。这些区域的存在通常只是为了检测碰撞、以及物体是否进入或离开它们。
AreaSpaceOverrideMode AREA_SPACE_OVERRIDE_COMBINE = 1
该区域将其重力/阻尼值加到目前已经计算出的结果上。这样一来,许多重叠的区域可以结合它们的物理运算来创建有趣的效果。
AreaSpaceOverrideMode AREA_SPACE_OVERRIDE_COMBINE_REPLACE = 2
该区域将其重力/阻尼值加到目前已经计算出的结果上。然后停止考虑其余区域,甚至是默认区域。
AreaSpaceOverrideMode AREA_SPACE_OVERRIDE_REPLACE = 3
该区域将替换所有重力/阻尼,甚至是默认值,并停止考虑其余区域。
AreaSpaceOverrideMode AREA_SPACE_OVERRIDE_REPLACE_COMBINE = 4
该区域将替换目前已经计算出的任何重力/阻尼,但仍将继续计算其余区域,直到默认区域。
enum BodyMode: 🔗
BodyMode BODY_MODE_STATIC = 0
常量,用于静态物体。在这种模式下,物体只能由用户代码移动,移动时不会与路径上的其他物体发生碰撞。
BodyMode BODY_MODE_KINEMATIC = 1
常量,用于运动学物体。在这种模式下,物体只能由用户代码移动,会与路径上的其他物体发生碰撞。
BodyMode BODY_MODE_RIGID = 2
常量,用于刚体。在这种模式下,物体可以被其他物体推动,能够对其施加力。
BodyMode BODY_MODE_RIGID_LINEAR = 3
常量,用于线性刚体。在这种模式下,物体不能旋转,只有线速度受外力影响。
enum BodyParameter: 🔗
BodyParameter BODY_PARAM_BOUNCE = 0
常量,用于设置/获取物体的反弹系数。该参数的默认值为 0.0
。
BodyParameter BODY_PARAM_FRICTION = 1
常量,用于设置/获取物体的摩擦力。该参数的默认值为 1.0
。
BodyParameter BODY_PARAM_MASS = 2
常量,用于设置/获取物体的质量。该参数的默认值为1.0
。如果该物体的模式被设置为 BODY_MODE_RIGID,那么设置这个参数会有以下额外效果:
如果参数 BODY_PARAM_CENTER_OF_MASS 尚未被明确设置,则该参数的值将根据物体的形状重新计算。
如果参数 BODY_PARAM_INERTIA 被设置为
<= 0.0
,则该参数的值将根据该物体的形状、质量和质心重新计算。
BodyParameter BODY_PARAM_INERTIA = 3
常量,用于设置/获取物体的惯性。该参数的默认值为 0.0
。如果物体的惯性被设置为 <= 0.0
,则惯性将根据该物体的形状、质量和质心重新计算。
BodyParameter BODY_PARAM_CENTER_OF_MASS = 4
常量,用于在物体局部坐标系中设置/获取该物体的质心位置。该参数的默认值为 Vector2(0,0)
。如果该参数从未明确设置,则在设置参数 BODY_PARAM_MASS 或调用 body_set_space 时,会根据物体的形状重新计算。
BodyParameter BODY_PARAM_GRAVITY_SCALE = 5
常量,用于设置/获取物体的重力倍数。该参数的默认值为 1.0
。
BodyParameter BODY_PARAM_LINEAR_DAMP_MODE = 6
常量,用于设置/获取物体的线性阻尼模式。可能的值见 BodyDampMode。这个参数的默认值为 BODY_DAMP_MODE_COMBINE。
BodyParameter BODY_PARAM_ANGULAR_DAMP_MODE = 7
常量,用于设置/获取物体的角度阻尼模式。可能的值见 BodyDampMode。这个参数的默认值为 BODY_DAMP_MODE_COMBINE。
BodyParameter BODY_PARAM_LINEAR_DAMP = 8
常量,用于设置/获取物体的线性阻尼系数。该参数的默认值为 0.0
。
BodyParameter BODY_PARAM_ANGULAR_DAMP = 9
常量,用于设置/获取物体的角度阻尼系数。该参数的默认值为 0.0
。
BodyParameter BODY_PARAM_MAX = 10
代表 BodyParameter 枚举的大小。
enum BodyDampMode: 🔗
BodyDampMode BODY_DAMP_MODE_COMBINE = 0
物体的阻尼值将被加到区域中所设置的值或默认值上。
BodyDampMode BODY_DAMP_MODE_REPLACE = 1
物体的阻尼值会替换区域中所设置的值或默认值。
enum BodyState: 🔗
BodyState BODY_STATE_TRANSFORM = 0
常量,用于设置/获取物体的当前变换矩阵。
BodyState BODY_STATE_LINEAR_VELOCITY = 1
常量,用于设置/获取物体的当前线速度。
BodyState BODY_STATE_ANGULAR_VELOCITY = 2
常量,用于设置/获取物体的当前角速度。
BodyState BODY_STATE_SLEEPING = 3
常量,用于使物体沉睡/唤醒,或得到它是否在沉睡。
BodyState BODY_STATE_CAN_SLEEP = 4
常量,用于设置/获取物体是否可以休眠。
enum JointType: 🔗
JointType JOINT_TYPE_PIN = 0
常量,用于创造销关节。
JointType JOINT_TYPE_GROOVE = 1
常量,用于创造槽关节。
JointType JOINT_TYPE_DAMPED_SPRING = 2
常量,用于创造有阻尼的弹簧关节。
JointType JOINT_TYPE_MAX = 3
代表 JointType 枚举的大小。
enum JointParam: 🔗
JointParam JOINT_PARAM_BIAS = 0
常量,用于设置/获取该关节将实体拉回以满足关节约束的速度。值越低,两个物体对关节的拉动就越大。该参数的默认值为 0.0
。
注意:在 Godot 物理中,这个参数只用于销关节和槽关节。
JointParam JOINT_PARAM_MAX_BIAS = 1
常量,用于设置/获取关节可以应用校正的最大速度。该参数的默认值为 3.40282e+38
。
注意:在 Godot 物理中,这个参数只用于槽关节。
JointParam JOINT_PARAM_MAX_FORCE = 2
常量,用于设置/获取关节可用于作用于两个实体的最大力。该参数的默认值为 3.40282e+38
。
注意:在 Godot 物理中,这个参数只用于槽关节。
enum PinJointParam: 🔗
PinJointParam PIN_JOINT_SOFTNESS = 0
常量,用于设置/获取销关节的纽带可以弯曲多少。该参数的默认值为 0.0
。
PinJointParam PIN_JOINT_LIMIT_UPPER = 1
绕该销的最大旋转。
PinJointParam PIN_JOINT_LIMIT_LOWER = 2
绕该销的最小旋转。
PinJointParam PIN_JOINT_MOTOR_TARGET_VELOCITY = 3
马达的目标速度。单位为弧度每秒。
enum PinJointFlag: 🔗
PinJointFlag PIN_JOINT_FLAG_ANGULAR_LIMIT_ENABLED = 0
如果为 true
,则销关节具有最大和最小旋转。
PinJointFlag PIN_JOINT_FLAG_MOTOR_ENABLED = 1
如果为 true
,则马达将转动该销。
enum DampedSpringParam: 🔗
DampedSpringParam DAMPED_SPRING_REST_LENGTH = 0
设置弹簧关节的放松长度。当拉开时,该关节将始终尝试回到这个长度。该参数的默认值是关节锚点之间的距离。
DampedSpringParam DAMPED_SPRING_STIFFNESS = 1
设置弹簧关节的刚度。该关节施加的力等于刚度乘以距其放松长度的距离。该参数的默认值为 20.0
。
DampedSpringParam DAMPED_SPRING_DAMPING = 2
设置弹簧关节的阻尼比率。值为 0 表示无阻尼弹簧,而 1 表示系统尽可能快地达到平衡(临界阻尼)。该参数的默认值为 1.5
。
enum CCDMode: 🔗
CCDMode CCD_MODE_DISABLED = 0
禁用连续碰撞检测。这是检测物体碰撞的最快方法,但可能会错过较小和/或快速移动的物体。
CCDMode CCD_MODE_CAST_RAY = 1
通过射线投射实现连续的碰撞检测。它比形状投射更快,但不够精确。
CCDMode CCD_MODE_CAST_SHAPE = 2
通过形变实现连续的碰撞检测。它是最慢的 CCD 方法,也是最精确的。
enum AreaBodyStatus: 🔗
AreaBodyStatus AREA_BODY_ADDED = 0
当对象进入区域的任一形状时,区域回调函数接收的第一个参数值。
AreaBodyStatus AREA_BODY_REMOVED = 1
当对象退出区域的任一形状时,区域回调函数接收的第一个参数值。
enum ProcessInfo: 🔗
ProcessInfo INFO_ACTIVE_OBJECTS = 0
常量,用以获取未休眠的对象的数量。
ProcessInfo INFO_COLLISION_PAIRS = 1
常量,用以获取可能的碰撞数。
ProcessInfo INFO_ISLAND_COUNT = 2
常量,用以获取可能发生碰撞的空间区块数。
方法说明
void area_add_shape(area: RID, shape: RID, transform: Transform2D = Transform2D(1, 0, 0, 1, 0, 0), disabled: bool = false) 🔗
使用给定的局部变换向区域添加一个形状。该形状(连同它的 transform
和 disabled
属性)被添加到一个形状数组中,一个区域的形状通常由它们在这个数组中的索引引用。
void area_attach_canvas_instance_id(area: RID, id: int) 🔗
将画布的 ObjectID
附加到该区域。使用 Object.get_instance_id 获取 CanvasLayer 的 ObjectID
。
void area_attach_object_instance_id(area: RID, id: int) 🔗
将 Object 的 ObjectID
附加到该区域。使用 Object.get_instance_id 获取 CollisionObject2D 的 ObjectID
。
void area_clear_shapes(area: RID) 🔗
从该区域移除所有形状。这不会删除形状本身,因此它们可以继续在别处使用或稍后添加回来。
在物理服务器中创建一个 2D 区域对象,并返回标识该区域的 RID。所创建区域的默认设置包括设置为 1
的碰撞层和遮罩,以及设置为 false
的 monitorable
。
使用 area_add_shape 向其添加形状,使用 area_set_transform 设置其变换,并使用 area_set_space 将区域添加到一个空间。如果你希望该区域可被检测,请使用 area_set_monitorable。
int area_get_canvas_instance_id(area: RID) const 🔗
返回附加到该区域的画布的 ObjectID
。使用 @GlobalScope.instance_from_id 从非零 ObjectID
检索一个 CanvasLayer。
int area_get_collision_layer(area: RID) const 🔗
返回该区域所属的物理层,形式为位掩码。
int area_get_collision_mask(area: RID) const 🔗
返回该区域所能接触的物理层,形式为位掩码。
int area_get_object_instance_id(area: RID) const 🔗
返回附加到该区域的 ObjectID
。可使用 @GlobalScope.instance_from_id 从非零 ObjectID
中检索一个 Object。
Variant area_get_param(area: RID, param: AreaParameter) const 🔗
返回给定区域参数的值。可用参数的列表见 AreaParameter。
RID area_get_shape(area: RID, shape_idx: int) const 🔗
返回该区域的形状数组中给定索引的形状的 RID。
int area_get_shape_count(area: RID) const 🔗
返回添加给该区域的形状数量。
Transform2D area_get_shape_transform(area: RID, shape_idx: int) const 🔗
返回该区域的形状数组中给定索引的形状的局部变换矩阵。
RID area_get_space(area: RID) const 🔗
返回分配给该区域的空间 RID。如果没有分配空间,则返回空 RID。
Transform2D area_get_transform(area: RID) const 🔗
返回该区域的变换矩阵。
void area_remove_shape(area: RID, shape_idx: int) 🔗
从区域的形状数组中移除具有给定索引的形状。该形状本身并没有被删除,所以它可以继续在别处使用或稍后添加回来。此操作会使曾经索引高于 shape_idx
的区域形状的索引将减少一个。
void area_set_area_monitor_callback(area: RID, callback: Callable) 🔗
设置该区域的区域监视回调。当任何其他(形状)区域进入或退出(形状)给定区域时,将调用此回调,并且必须采用以下五个参数:
一个整数
status
:AREA_BODY_ADDED 或 AREA_BODY_REMOVED 取决于其他区域的形状是进入还是退出该区域,一个整数
instance_id
:附加到其他区域的ObjectID
,一个整数
area_shape_idx
:进入或退出该区域的其他区域的形状索引,一个整数
self_shape_idx
:其他区域进入或退出的区域的形状索引。
通过计算(或跟踪)进入和退出的形状,可以确定一个区域(及其所有形状)是第一次进入还是最后一次退出。
void area_set_collision_layer(area: RID, layer: int) 🔗
将该区域分配给若干个物理层,使用位掩码。
void area_set_collision_mask(area: RID, mask: int) 🔗
设置该区域所监视的物理层,使用位掩码。
void area_set_monitor_callback(area: RID, callback: Callable) 🔗
设置区域的实体监视器回调。当任何其他(形状的)实体进入或退出(形状的)给定区域时,将调用此回调,并且必须采用以下五个参数:
一个整数
status
:AREA_BODY_ADDED 或 AREA_BODY_REMOVED 取决于其他实体形状是否进入或退出该区域,一个整数
instance_id
:附加到该实体上的ObjectID
,一个整数
body_shape_idx
:进入或离开该区域的实体形状索引,一个整数
self_shape_idx
:实体进入或离开的区域的形状索引。
通过计算(或跟踪)进入和退出的形状,可以确定一个实体(及其所有形状)是第一次进入还是最后一次退出。
void area_set_monitorable(area: RID, monitorable: bool) 🔗
设置该区域是否可监视。如果 monitorable
为 true
,则该区域进入或退出其他区域时,会调用其他区域的区域监视回调。
void area_set_param(area: RID, param: AreaParameter, value: Variant) 🔗
设置给定的区域参数的值。可用参数列表见 AreaParameter。
void area_set_shape(area: RID, shape_idx: int, shape: RID) 🔗
用另一个形状替换给定索引处的区域形状,同时不会影响在同一索引处的 transform
和 disabled
属性。
void area_set_shape_disabled(area: RID, shape_idx: int, disabled: bool) 🔗
使用给定索引设置区域形状的禁用属性。如果 disabled
为 true
,则该形状将不会检测任何其他形状进入或退出它。
void area_set_shape_transform(area: RID, shape_idx: int, transform: Transform2D) 🔗
设置该区域给定索引的形状的局部变换。
void area_set_space(area: RID, space: RID) 🔗
从先前赋予的空间(如果有)中移除该区域后,将该区域添加到给定空间。
注意:要从空间中移除一个区域而不立即将其添加回其他地方,请使用 PhysicsServer2D.area_set_space(area, RID())
。
void area_set_transform(area: RID, transform: Transform2D) 🔗
设置该区域的变换矩阵。
void body_add_collision_exception(body: RID, excepted_body: RID) 🔗
将 excepted_body
添加到实体的碰撞例外列表中,以便忽略与它的碰撞。
void body_add_constant_central_force(body: RID, force: Vector2) 🔗
向实体添加一个恒定的定向力。该力不影响旋转。随着时间的推移,力会一直施加,直到使用 PhysicsServer2D.body_set_constant_force(body, Vector2(0, 0))
清除。
这相当于在实体的质心处使用 body_add_constant_force。
void body_add_constant_force(body: RID, force: Vector2, position: Vector2 = Vector2(0, 0)) 🔗
向实体添加一个恒定的定位力。如果 position
与实体的质心不同,则力会影响旋转。力会持续施加,直到使用 PhysicsServer2D.body_set_constant_force(body, Vector2(0, 0))
清除。
position
是在全局坐标中距实体原点的偏移量。
void body_add_constant_torque(body: RID, torque: float) 🔗
向实体添加一个恒定的旋转力。该力不影响位置。随着时间的推移,该力会一直施加,直到使用 PhysicsServer2D.body_set_constant_torque(body, 0)
清除。
void body_add_shape(body: RID, shape: RID, transform: Transform2D = Transform2D(1, 0, 0, 1, 0, 0), disabled: bool = false) 🔗
使用给定的局部变换向该区域添加一个形状。该形状(连同它的 transform
和 disabled
属性)将被添加到一个形状数组中,一个实体的形状通常由它们在这个数组中的索引引用。
void body_apply_central_force(body: RID, force: Vector2) 🔗
在实体的质心处向实体施加一个定向力。该力不影响旋转。力是时间相关的,这意味着每次物理更新都会被施加。
这相当于在实体的质心处使用 body_apply_force。
void body_apply_central_impulse(body: RID, impulse: Vector2) 🔗
在实体的质心处向该实体施加一个定向冲量。该冲量不影响旋转。
冲量是时间无关的!每帧施加一个冲量将产生一个依赖于帧速率的力。出于这个原因,它应该只在模拟一次性影响时使用(否则使用“_force”函数)。
这相当于在实体的质心处使用 body_apply_impulse。
void body_apply_force(body: RID, force: Vector2, position: Vector2 = Vector2(0, 0)) 🔗
向实体施加一个定位力。如果 position
与实体的质心不同,则力会影响旋转。力是时间相关的,意味着每次物理更新都会被施加。
position
是在全局坐标中距实体原点的偏移量。
void body_apply_impulse(body: RID, impulse: Vector2, position: Vector2 = Vector2(0, 0)) 🔗
向实体施加一个定位冲量。如果 position
与实体的质心不同,则该冲量会影响旋转。
冲量是时间无关的!每帧施加一个冲量将产生一个依赖于帧速率的力。出于这个原因,它应该只在模拟一次性影响时使用(否则使用“_force”函数)。
position
是在全局坐标中距实体原点的偏移量。
void body_apply_torque(body: RID, torque: float) 🔗
对实体施加一个旋转力。该力不影响位置。力是时间相关的,意味着每次物理更新都会被施加。
void body_apply_torque_impulse(body: RID, impulse: float) 🔗
对实体施加一个旋转的冲量。该冲量不影响位置。
冲量是时间无关的!每帧施加一个冲量将产生一个依赖于帧速率的力。出于这个原因,它应该只在模拟一次性影响时使用(否则使用“_force”函数)。
void body_attach_canvas_instance_id(body: RID, id: int) 🔗
将画布的 ObjectID
附加到该实体。可使用 Object.get_instance_id 获取 CanvasLayer 的 ObjectID
。
void body_attach_object_instance_id(body: RID, id: int) 🔗
将 Object 的 ObjectID
附加到该实体。可使用 Object.get_instance_id 获取 CollisionObject2D 的 ObjectID
。
void body_clear_shapes(body: RID) 🔗
从该实体中移除所有形状。这不会删除形状本身,因此它们可以继续在别处使用或稍后添加回来。
在物理服务器中创建一个 2D 物体对象,并返回标识它的 RID。所创建区域的默认设置包括设置为 1
的碰撞层和遮罩,以及设置为 BODY_MODE_RIGID 的物体模式。
使用 body_add_shape 为其添加形状,使用 body_set_state 设置其变换,使用 body_set_space 将物体添加到一个空间。
int body_get_canvas_instance_id(body: RID) const 🔗
返回附加到该实体的画布的 ObjectID
。可使用 @GlobalScope.instance_from_id 从非零 ObjectID
检索一个 CanvasLayer。
int body_get_collision_layer(body: RID) const 🔗
返回物体所属的物理层,形式为位掩码。
int body_get_collision_mask(body: RID) const 🔗
返回物体可以碰撞的物理层,形式为位掩码。
float body_get_collision_priority(body: RID) const 🔗
返回该实体的碰撞优先级。这用于 body_test_motion 的穿透阶段。优先级越高,对该实体的穿透力就越低。
Vector2 body_get_constant_force(body: RID) const 🔗
返回在每次物理更新期间,该物体被施加的总的恒定位置的力。
参阅 body_add_constant_force 和 body_add_constant_central_force。
float body_get_constant_torque(body: RID) const 🔗
返回在每次物理更新期间,该物体被施加的总的恒定旋转的力。
CCDMode body_get_continuous_collision_detection_mode(body: RID) const 🔗
返回该物体的连续碰撞检测模式(见 CCDMode)。
PhysicsDirectBodyState2D body_get_direct_state(body: RID) 🔗
返回该实体的 PhysicsDirectBodyState2D。如果该实体已被销毁或未被分配给一个空间,则返回 null
。
int body_get_max_contacts_reported(body: RID) const 🔗
返回该实体可以报告的最大接触数。请参阅 body_set_max_contacts_reported。
BodyMode body_get_mode(body: RID) const 🔗
返回该物体的模式(见 BodyMode)。
int body_get_object_instance_id(body: RID) const 🔗
返回附加到该实体的 ObjectID
。可使用 @GlobalScope.instance_from_id 从非零 ObjectID
中检索一个 Object。
Variant body_get_param(body: RID, param: BodyParameter) const 🔗
返回给定实体参数的值。有关可用的参数列表,请参阅 BodyParameter。
RID body_get_shape(body: RID, shape_idx: int) const 🔗
返回该实体形状数组中具有给定索引的形状的 RID。
int body_get_shape_count(body: RID) const 🔗
返回添加至该物体的形状的数量。
Transform2D body_get_shape_transform(body: RID, shape_idx: int) const 🔗
返回该区域的形状数组中给定索引的形状的局部变换矩阵。
RID body_get_space(body: RID) const 🔗
返回分配给该实体的空间的 RID。如果没有分配空间,则返回空 RID。
Variant body_get_state(body: RID, state: BodyState) const 🔗
返回该实体给定状态的值。有关可用状态的列表,请参阅 BodyState。
bool body_is_omitting_force_integration(body: RID) const 🔗
如果物体省略了标准力积分,则返回 true
。参见 body_set_omit_force_integration。
void body_remove_collision_exception(body: RID, excepted_body: RID) 🔗
从物体的碰撞例外列表中移除 excepted_body
,不再忽略与该物体的碰撞。
void body_remove_shape(body: RID, shape_idx: int) 🔗
从该实体的形状数组中移除具有给定索引的形状。该形状本身并没有被删除,所以它可以继续在别处使用或稍后添加回来。该操作将会使曾经索引高于 shape_idx
的实体形状的索引将减少一个。
void body_reset_mass_properties(body: RID) 🔗
根据实体的形状恢复该实体的默认惯性和质心。这会撤消之前使用 body_set_param 设置的任何自定义值。
void body_set_axis_velocity(body: RID, axis_velocity: Vector2) 🔗
修改实体的线速度,使其到轴 axis_velocity.normalized()
的投影正好是 axis_velocity.length()
。这对于跳跃行为很有用。
void body_set_collision_layer(body: RID, layer: int) 🔗
设置该物体所属的物理层,使用位掩码。
void body_set_collision_mask(body: RID, mask: int) 🔗
设置该物体能够碰撞的物理层,使用位掩码。
void body_set_collision_priority(body: RID, priority: float) 🔗
设置该实体的碰撞优先级。这用于 body_test_motion 的穿透阶段。优先级越高,对实体的穿透力就越低。
void body_set_constant_force(body: RID, force: Vector2) 🔗
设置在每次物理更新期间,该物体被施加的总的恒定位置的力。
参阅 body_add_constant_force 和 body_add_constant_central_force。
void body_set_constant_torque(body: RID, torque: float) 🔗
设置在每次物理更新期间,该物体被施加的总的恒定旋转的力。
void body_set_continuous_collision_detection_mode(body: RID, mode: CCDMode) 🔗
使用 CCDMode 常量之一设置连续碰撞检测模式。
连续碰撞检测试图预测一个移动的物体将在物理更新之间发生碰撞的位置,而不是移动它并在发生碰撞时纠正它的运动。
void body_set_force_integration_callback(body: RID, callable: Callable, userdata: Variant = null) 🔗
将物体的自定义力积分回调函数设置为 callable
。使用空的 Callable(Callable()
) 清除自定义回调。
函数 callable
将在标准力积分之前的每个物理刻度被调用(参见 body_set_omit_force_integration)。例如,它可用于根据与其他物体的接触更新物体的线速度和角速度。
如果 userdata
不为 null
,函数 callable
必须采用以下两个参数:
state
:用于检索和修改物体状态的 PhysicsDirectBodyState2D,userdata
:Variant;其值将是传递到该方法的userdata
。
如果 userdata
为 null
,则 callable
必须仅采用 state
参数。
void body_set_max_contacts_reported(body: RID, amount: int) 🔗
设置该实体可以报告的接触的最大数量。如果 amount
大于零,那么实体将最多跟踪与其他实体的这么多次接触。
void body_set_mode(body: RID, mode: BodyMode) 🔗
设置该实体的模式。有关可用模式的列表,请参阅 BodyMode。
void body_set_omit_force_integration(body: RID, enable: bool) 🔗
设置物体是否省略标准力积分。如果 enable
为 true
,物体将不会自动使用施加的力、扭矩和阻尼来更新物体的线速度和角速度。在这种情况下,可以使用 body_set_force_integration_callback 手动更新线速度和角速度。
当设置属性 RigidBody2D.custom_integrator 时,将调用该方法。
void body_set_param(body: RID, param: BodyParameter, value: Variant) 🔗
设置给定实体参数的值。有关可用参数列表,请参阅 BodyParameter。
void body_set_shape(body: RID, shape_idx: int, shape: RID) 🔗
用另一个形状替换给定索引处的实体形状,同时不会影响同一索引处的 transform
、disabled
和单向碰撞属性。
void body_set_shape_as_one_way_collision(body: RID, shape_idx: int, enable: bool, margin: float) 🔗
使用给定索引设置实体形状的单向碰撞属性。如果 enable
为 true
,则形状的局部向上轴 body_get_shape_transform(body, shape_idx).y
给出的单向碰撞方向将用于忽略与相反方向的形状,并确保运动实体的穿透发生在这个方向上。
void body_set_shape_disabled(body: RID, shape_idx: int, disabled: bool) 🔗
使用给定索引设置实体形状的禁用属性。如果 disabled
为 true
,则在所有碰撞检测中将忽略该形状。
void body_set_shape_transform(body: RID, shape_idx: int, transform: Transform2D) 🔗
使用给定索引设置该实体形状的局部变换矩阵。
void body_set_space(body: RID, space: RID) 🔗
从先前分配的空间(若存在)中移除实体后,将该实体添加到给定空间。如果实体的模式被设置为 BODY_MODE_RIGID,则将该实体添加到空间将具有以下额外效果:
如果从未明确设置参数 BODY_PARAM_CENTER_OF_MASS,则该参数的值将根据实体的形状重新计算。
如果参数 BODY_PARAM_INERTIA 被设置为一个
<= 0.0
的值,则该参数的值将根据实体的形状、质量和质心重新计算。
注意:要从一个空间中移除实体,且不立即将其添加回其他地方,请使用 PhysicsServer2D.body_set_space(body, RID())
。
void body_set_state(body: RID, state: BodyState, value: Variant) 🔗
设置实体状态的值。有关可用状态的列表,请参阅 BodyState。
注意:状态更改不会立即生效。状态更改将发生在下一个物理帧上。
void body_set_state_sync_callback(body: RID, callable: Callable) 🔗
Sets the body’s state synchronization callback function to callable
. Use an empty Callable (Callable()
) to clear the callback.
The function callable
will be called every physics frame, assuming that the body was active during the previous physics tick, and can be used to fetch the latest state from the physics server.
The function callable
must take the following parameters:
state
: a PhysicsDirectBodyState2D, used to retrieve the body’s state.
bool body_test_motion(body: RID, parameters: PhysicsTestMotionParameters2D, result: PhysicsTestMotionResult2D = null) 🔗
如果从空间中的给定点,沿着运动向量移动实体会产生一个碰撞,则返回 true
。有关可用的运动参数,请参阅 PhysicsTestMotionParameters2D。可以选择传递一个 PhysicsTestMotionResult2D 对象,该对象将用于存储有关所产生碰撞的信息。
在物理服务器中创建一个 2D 胶囊形状,并返回标识它的 RID。可使用 shape_set_data 设置胶囊的高度和半径。
在物理服务器中创建一个 2D 圆形,并返回标识它的 RID。可使用 shape_set_data 设置圆的半径。
RID concave_polygon_shape_create() 🔗
在物理服务器中创建一个 2D 凹多边形形状,并返回标识它的 RID。可使用 shape_set_data 设置凹多边形的线段。
RID convex_polygon_shape_create() 🔗
在物理服务器中创建一个 2D 凸多边形形状,并返回标识它的 RID。可使用 shape_set_data 设置凸多边形的点。
float damped_spring_joint_get_param(joint: RID, param: DampedSpringParam) const 🔗
返回给定阻尼弹簧关节参数的值。有关可用参数的列表,请参阅 DampedSpringParam。
void damped_spring_joint_set_param(joint: RID, param: DampedSpringParam, value: float) 🔗
设置给定阻尼弹簧关节参数的值。有关可用参数的列表,请参阅 DampedSpringParam。
销毁由 PhysicsServer2D 创建的任何对象。如果传递的 RID 不是 PhysicsServer2D 可以创建的对象之一,则会将一个错误发送到控制台。
int get_process_info(process_info: ProcessInfo) 🔗
返回关于 2D 物理引擎当前状态的信息。可用状态的列表见 ProcessInfo。
void joint_clear(joint: RID) 🔗
销毁具有给定 RID 的关节,创建一个新的未初始化关节,并使该 RID 引用这个新关节。
在物理服务器中创建一个 2D 关节,并返回标识它的 RID。要设置关节类型,请使用 joint_make_damped_spring、joint_make_groove 或 joint_make_pin。可使用 joint_set_param 设置通用关节参数。
void joint_disable_collisions_between_bodies(joint: RID, disable: bool) 🔗
设置附加到该 Joint2D 的物体能否互相碰撞。
float joint_get_param(joint: RID, param: JointParam) const 🔗
返回给定关节参数的值。可用参数的列表见 JointParam。
JointType joint_get_type(joint: RID) const 🔗
返回该关节的类型(见 JointType)。
bool joint_is_disabled_collisions_between_bodies(joint: RID) const 🔗
返回分配给该 Joint2D 的物体能否相互碰撞。
void joint_make_damped_spring(joint: RID, anchor_a: Vector2, anchor_b: Vector2, body_a: RID, body_b: RID = RID()) 🔗
使该关节成为一个阻尼弹簧关节,连接到实体 body_a
上的点 anchor_a
(在全局坐标中给出)和实体 body_b
上的点 anchor_b
(在全局坐标中给出)。要设置特定于阻尼弹簧的参数,请参阅 damped_spring_joint_set_param。
void joint_make_groove(joint: RID, groove1_a: Vector2, groove2_a: Vector2, anchor_b: Vector2, body_a: RID = RID(), body_b: RID = RID()) 🔗
使关节成为凹槽关节。
void joint_make_pin(joint: RID, anchor: Vector2, body_a: RID, body_b: RID = RID()) 🔗
使关节成为一个销关节。如果 body_b
是一个空 RID,则 body_a
被固定到点 anchor
(在全局坐标中给出); 否则,body_a
在 anchor
点被固定到 body_b
(在全局坐标中给出)。要设置特定于销关节的参数,请参阅 pin_joint_set_param。
void joint_set_param(joint: RID, param: JointParam, value: float) 🔗
设置给定关节参数的值。可用参数的列表见 JointParam。
bool pin_joint_get_flag(joint: RID, flag: PinJointFlag) const 🔗
获取销关节标志(请参阅 PinJointFlag 常量)。
float pin_joint_get_param(joint: RID, param: PinJointParam) const 🔗
返回销关节参数的值。有关可用参数列表,请参阅 PinJointParam。
void pin_joint_set_flag(joint: RID, flag: PinJointFlag, enabled: bool) 🔗
设置销关节标志(请参阅 PinJointFlag 常量)。
void pin_joint_set_param(joint: RID, param: PinJointParam, value: float) 🔗
设置销关节参数。有关可用参数列表,请参阅 PinJointParam。
RID rectangle_shape_create() 🔗
在物理服务器中创建一个 2D 矩形形状,并返回标识它的 RID。可使用 shape_set_data 设置该矩形的半边距。
在物理服务器中创建一个 2D 线段形状,并返回标识它的 RID。可使用 shape_set_data 设置线段的起点和终点。
RID separation_ray_shape_create() 🔗
在物理服务器中创建一个 2D 分离射线形状,并返回标识它的 RID。可使用 shape_set_data 设置形状的 length
和 slide_on_slope
属性。
void set_active(active: bool) 🔗
激活或停用 2D 物理服务器。如果 active
为 false
,则物理服务器将不会在其物理迭代中执行任何操作。
Variant shape_get_data(shape: RID) const 🔗
返回定义形状配置的形状数据,例如矩形的半边长或凹形的线段。有关每种情况下该数据的精确格式,请参阅 shape_set_data。
ShapeType shape_get_type(shape: RID) const 🔗
返回该形状的类型(见 ShapeType)。
void shape_set_data(shape: RID, data: Variant) 🔗
设置定义形状配置的形状数据。要传递的 data
取决于形状的类型(参见 shape_get_type):
SHAPE_WORLD_BOUNDARY:长度为 2 的数组,包含 Vector2 类型的
normal
方向和 float 类型的距离d
,SHAPE_SEPARATION_RAY:字典,包含键
length
和 float 值、以及键slide_on_slope
和 bool 值,SHAPE_SEGMENT:Rect2 类型的
rect
,以rect.position
表示线段中的第一个点,并以rect.size
表示线段中的第二个点,SHAPE_CIRCLE:float 类型的
radius
,SHAPE_RECTANGLE:Vector2 类型的
half_extents
,SHAPE_CAPSULE:长度为 2 的数组(或一个 Vector2),包含一个 float 类型的
height
和一个 float 类型的radius
,SHAPE_CONVEX_POLYGON:按逆时针顺序定义凸多边形的点的 PackedVector2Array(在内部使用由连续点形成的每个线段的顺时针向外法线计算);或一个长度可被 4 整除的 PackedFloat32Array,以便每个 4 元组的 float 包含一个点的坐标,后跟一个向量的坐标表示,该向量是当前点和下一个点之间的线段的顺时针向外法向量,
SHAPE_CONCAVE_POLYGON:长度可被 2 整除的 PackedVector2Array(每对点形成一个线段)。
警告:在 SHAPE_CONVEX_POLYGON 的情况下,该方法不检查提供的点是否能够形成凸多边形(与 CollisionPolygon2D.polygon 属性不同)。
在物理服务器中创建一个 2D 空间,并返回标识它的 RID。空间包含实体和区域,并控制其中实体的物理模拟的步骤。
PhysicsDirectSpaceState2D space_get_direct_state(space: RID) 🔗
返回空间的状态,即 PhysicsDirectSpaceState2D。该对象可用于进行碰撞/相交的查询。
float space_get_param(space: RID, param: SpaceParameter) const 🔗
返回给定空间参数的值。可用参数的列表见 SpaceParameter。
bool space_is_active(space: RID) const 🔗
如果该空间处于活动状态,则返回 true
。
void space_set_active(space: RID, active: bool) 🔗
激活或停用该空间。如果 active
为 false
,那么物理服务器将不会在它的物理迭代中对这个空间做任何事情。
void space_set_param(space: RID, param: SpaceParameter, value: float) 🔗
设置给定空间参数的值。可用参数的列表见 SpaceParameter。
RID world_boundary_shape_create() 🔗
在物理服务器中创建一个 2D 世界边界形状,并返回标识它的 RID。可使用 shape_set_data 设置形状的法线方向和距离属性。