RigidBody2D

Наследует: PhysicsBody2D < CollisionObject2D < Node2D < CanvasItem < Node < Object

Наследуется от: PhysicalBone2D

Двухмерное физическое тело, которое перемещается с помощью симуляции физики.

Описание

RigidBody2D реализует полноценную двумерную физику. Им нельзя управлять напрямую, вместо этого необходимо прикладывать к нему силы (гравитацию, импульсы и т. д.), а физическая симуляция вычисляет результирующее движение, вращение, реагирует на столкновения и влияет на другие физические тела на его пути.

Поведение тела можно настроить с помощью lock_rotation, freeze и freeze_mode. Изменяя различные свойства объекта, такие как mass, можно управлять тем, как на него воздействует физическая симуляция.

Твёрдое тело всегда сохраняет свою форму и размер, даже при приложении к нему сил. Это полезно для объектов, с которыми можно взаимодействовать в окружающей среде, например, для дерева, которое можно опрокинуть, или для штабеля ящиков, которые можно толкать.

Если вам нужно напрямую воздействовать на тело, предпочтительнее _integrate_forces(), поскольку он позволяет напрямую получать доступ к физическому состоянию.

Если вам нужно переопределить физическое поведение по умолчанию, вы можете написать собственную функцию интегрирования сил. См. custom_integrator.

Примечание: Изменение двумерного преобразования или linear_velocity объекта RigidBody2D очень часто может привести к непредсказуемому поведению. Это также происходит, когда RigidBody2D является потомком постоянно движущегося узла, например, другого RigidBody2D, поскольку это приведёт к установке его глобального преобразования при каждом перемещении его предка.

Обучающие материалы

Свойства

float

angular_damp

0.0

DampMode

angular_damp_mode

0

float

angular_velocity

0.0

bool

can_sleep

true

Vector2

center_of_mass

Vector2(0, 0)

CenterOfMassMode

center_of_mass_mode

0

Vector2

constant_force

Vector2(0, 0)

float

constant_torque

0.0

bool

contact_monitor

false

CCDMode

continuous_cd

0

bool

custom_integrator

false

bool

freeze

false

FreezeMode

freeze_mode

0

float

gravity_scale

1.0

float

inertia

0.0

float

linear_damp

0.0

DampMode

linear_damp_mode

0

Vector2

linear_velocity

Vector2(0, 0)

bool

lock_rotation

false

float

mass

1.0

int

max_contacts_reported

0

PhysicsMaterial

physics_material_override

bool

sleeping

false

Методы

void

_integrate_forces(state: PhysicsDirectBodyState2D) virtual

void

add_constant_central_force(force: Vector2)

void

add_constant_force(force: Vector2, position: Vector2 = Vector2(0, 0))

void

add_constant_torque(torque: float)

void

apply_central_force(force: Vector2)

void

apply_central_impulse(impulse: Vector2 = Vector2(0, 0))

void

apply_force(force: Vector2, position: Vector2 = Vector2(0, 0))

void

apply_impulse(impulse: Vector2, position: Vector2 = Vector2(0, 0))

void

apply_torque(torque: float)

void

apply_torque_impulse(torque: float)

Array[Node2D]

get_colliding_bodies() const

int

get_contact_count() const

void

set_axis_velocity(axis_velocity: Vector2)


Сигналы

body_entered(body: Node) 🔗

Вызывается при столкновении с другим PhysicsBody2D или TileMap. Требует, чтобы contact_monitor был установлен на true, а max_contacts_reported был установлен достаточно высоким для обнаружения всех столкновений. TileMap-ы обнаруживаются, если TileSet имеет Столкновение Shape2D-ов.

body Node, если он существует в дереве, другого PhysicsBody2D или TileMap.


body_exited(body: Node) 🔗

Вызывается, когда заканчивается столкновение с другим PhysicsBody2D или TileMap. Требует, чтобы contact_monitor был установлен на true, а max_contacts_reported был установлен достаточно высоким для обнаружения всех столкновений. TileMap обнаруживаются, если TileSet имеет Столкновение Shape2D-ов.

body Node, если он существует в дереве, другого PhysicsBody2D или TileMap.


body_shape_entered(body_rid: RID, body: Node, body_shape_index: int, local_shape_index: int) 🔗

Вызывается, когда один из Shape2D-ов этого RigidBody2D сталкивается с Shape2D-ами другого PhysicsBody2D или TileMap. Требует, чтобы contact_monitor был установлен на true, а max_contacts_reported был установлен достаточно высоким для обнаружения всех столкновений. TileMap-ы обнаруживаются, если TileSet имеет Столкновение Shape2D-ов.

body_rid RID другого PhysicsBody2D или TileSet CollisionObject2D, используемого PhysicsServer2D.

body Node, если он существует в дереве, другого PhysicsBody2D или TileMap.

body_shape_index индекс Shape2D другого PhysicsBody2D или TileMap, используемого PhysicsServer2D. Получите узел CollisionShape2D с помощью body.shape_owner_get_owner(body.shape_find_owner(body_shape_index)).

local_shape_index индекс Shape2D этого RigidBody2D, используемый PhysicsServer2D. Получите узел CollisionShape2D с помощью self.shape_owner_get_owner(self.shape_find_owner(local_shape_index)).


body_shape_exited(body_rid: RID, body: Node, body_shape_index: int, local_shape_index: int) 🔗

Вызывается, когда заканчивается столкновение между одним из Shape2D-ов этого RigidBody2D и другим PhysicsBody2D или TileMap Shape2D-ов. Требует, чтобы contact_monitor был установлен на true, а max_contacts_reported был установлен достаточно высоким для обнаружения всех столкновений. TileMap обнаруживаются, если TileSet имеет Collision Shape2D-ов.

body_rid RID другого PhysicsBody2D или TileSet CollisionObject2D, используемого PhysicsServer2D.

body Node, если он существует в дереве, другого PhysicsBody2D или TileMap.

body_shape_index индекс Shape2D другого PhysicsBody2D или TileMap, используемого PhysicsServer2D. Получите узел CollisionShape2D с помощью body.shape_owner_get_owner(body.shape_find_owner(body_shape_index)).

local_shape_index индекс Shape2D этого RigidBody2D, используемого PhysicsServer2D. Получите узел CollisionShape2D с помощью self.shape_owner_get_owner(self.shape_find_owner(local_shape_index)).


sleeping_state_changed() 🔗

Выдается, когда физический движок изменяет состояние сна тела.

Примечание: Изменение значения sleeping не вызовет этот сигнал. Он выдается только в том случае, если состояние сна изменено физическим движком или используется emit_signal("sleeping_state_changed").


Перечисления

enum FreezeMode: 🔗

FreezeMode FREEZE_MODE_STATIC = 0

Режим статической заморозки тела (по умолчанию). Тело не подвержено влиянию гравитации и сил. Его можно перемещать только с помощью пользовательского кода, и оно не сталкивается с другими телами на своем пути.

FreezeMode FREEZE_MODE_KINEMATIC = 1

Режим кинематической заморозки тела. Похож на FREEZE_MODE_STATIC, но сталкивается с другими телами на своем пути при перемещении. Полезно для замороженного тела, которое нужно анимировать.


enum CenterOfMassMode: 🔗

CenterOfMassMode CENTER_OF_MASS_MODE_AUTO = 0

В этом режиме центр масс тела вычисляется автоматически на основе его форм. Это предполагает, что начало форм также является их центром масс.

CenterOfMassMode CENTER_OF_MASS_MODE_CUSTOM = 1

В этом режиме центр масс тела задается через center_of_mass. По умолчанию — исходное положение тела.


enum DampMode: 🔗

DampMode DAMP_MODE_COMBINE = 0

В этом режиме значение демпфирования тела добавляется к любому значению, заданному в областях, или к значению по умолчанию.

DampMode DAMP_MODE_REPLACE = 1

В этом режиме значение демпфирования тела заменяет любое значение, заданное в областях, или значение по умолчанию.


enum CCDMode: 🔗

CCDMode CCD_MODE_DISABLED = 0

Непрерывное обнаружение столкновений отключено. Это самый быстрый способ обнаружения столкновений тел, но он может пропускать мелкие быстро движущиеся объекты.

CCDMode CCD_MODE_CAST_RAY = 1

Непрерывное обнаружение столкновений включено с помощью raycasting. Это быстрее, чем shapecasting, но менее точно.

CCDMode CCD_MODE_CAST_SHAPE = 2

Непрерывное обнаружение столкновений, включенное с помощью shapecasting. Это самый медленный метод CCD и самый точный.


Описания свойств

float angular_damp = 0.0 🔗

  • void set_angular_damp(value: float)

  • float get_angular_damp()

Демпфирует вращение тела. По умолчанию тело будет использовать настройку ProjectSettings.physics/2d/default_angular_damp или любое переопределение значения, заданное Area2D, в котором находится тело. В зависимости от angular_damp_mode вы можете задать angular_damp для добавления или замены значения демпфирования тела.

Подробнее о демпфировании см. в ProjectSettings.physics/2d/default_angular_damp.


DampMode angular_damp_mode = 0 🔗

Определяет, как применяется angular_damp.


float angular_velocity = 0.0 🔗

  • void set_angular_velocity(value: float)

  • float get_angular_velocity()

Скорость вращения тела в радианах в секунду.


bool can_sleep = true 🔗

  • void set_can_sleep(value: bool)

  • bool is_able_to_sleep()

Если true, тело может войти в режим сна, когда нет движения. Смотрите sleep.


Vector2 center_of_mass = Vector2(0, 0) 🔗

  • void set_center_of_mass(value: Vector2)

  • Vector2 get_center_of_mass()

Центр масс тела, определяемый пользователем, относительно исходного положения тела, когда center_of_mass_mode имеет значение CENTER_OF_MASS_MODE_CUSTOM. Это точка равновесия тела, в которой приложенные силы вызывают только линейное ускорение. Приложение сил вне центра масс вызывает угловое ускорение.

Когда center_of_mass_mode имеет значение CENTER_OF_MASS_MODE_AUTO (значение по умолчанию), центр масс определяется автоматически, но это не приводит к обновлению значения center_of_mass.


CenterOfMassMode center_of_mass_mode = 0 🔗

Определяет способ установки центра массы тела.


Vector2 constant_force = Vector2(0, 0) 🔗

  • void set_constant_force(value: Vector2)

  • Vector2 get_constant_force()

Общие постоянные позиционные силы тела, применяемые во время каждого обновления физики.

См. add_constant_force() и add_constant_central_force().


float constant_torque = 0.0 🔗

  • void set_constant_torque(value: float)

  • float get_constant_torque()

Общие постоянные вращательные силы тела, применяемые во время каждого обновления физики.

См. add_constant_torque().


bool contact_monitor = false 🔗

  • void set_contact_monitor(value: bool)

  • bool is_contact_monitor_enabled()

Если true, RigidBody2D будет издавать сигналы при столкновении с другим телом.

Примечание: По умолчанию максимальное количество сообщаемых контактов установлено на 0, что означает, что ничего не будет записано, см. max_contacts_reported.


CCDMode continuous_cd = 0 🔗

  • void set_continuous_collision_detection_mode(value: CCDMode)

  • CCDMode get_continuous_collision_detection_mode()

Режим непрерывного обнаружения столкновений.

Непрерывное обнаружение столкновений пытается предсказать, где движущееся тело столкнется, вместо того, чтобы перемещать его и корректировать его движение после столкновения. Непрерывное обнаружение столкновений медленнее, но точнее и пропускает меньше столкновений с небольшими, быстро движущимися объектами. Доступны методы Raycasting и Shapecasting.


bool custom_integrator = false 🔗

  • void set_use_custom_integrator(value: bool)

  • bool is_using_custom_integrator()

Если true, стандартная интеграция силы (например, гравитация или демпфирование) будет отключена для этого тела. За исключением реакции на столкновение, тело будет двигаться только так, как определено методом _integrate_forces(), если этот виртуальный метод переопределен.

Установка этого свойства вызовет метод PhysicsServer2D.body_set_omit_force_integration() внутренне.


bool freeze = false 🔗

  • void set_freeze_enabled(value: bool)

  • bool is_freeze_enabled()

If true, the body is frozen. Gravity and forces are not applied anymore.

See freeze_mode to set the body's behavior when frozen.

Note: For a body that is always frozen, use StaticBody2D or AnimatableBody2D instead.


FreezeMode freeze_mode = 0 🔗

The body's freeze mode. Determines the body's behavior when freeze is true.

Note: For a body that is always frozen, use StaticBody2D or AnimatableBody2D instead.


float gravity_scale = 1.0 🔗

  • void set_gravity_scale(value: float)

  • float get_gravity_scale()

Умножает силу тяжести, приложенную к телу. Сила тяжести тела рассчитывается на основе настройки проекта ProjectSettings.physics/2d/default_gravity и/или любого дополнительного вектора силы тяжести, примененных Area2D-ов.


float inertia = 0.0 🔗

  • void set_inertia(value: float)

  • float get_inertia()

Момент инерции тела. Это похоже на массу, но для вращения: он определяет, какой крутящий момент требуется для вращения тела. Момент инерции обычно вычисляется автоматически из массы и форм, но это свойство позволяет вам задать пользовательское значение.

Если установлено значение 0, инерция вычисляется автоматически (значение по умолчанию).

Примечание: Это значение не изменяется при автоматическом вычислении инерции. Используйте PhysicsServer2D, чтобы получить вычисленную инерцию.

@onready var ball = $Ball

func get_ball_inertia():
    return 1.0 / PhysicsServer2D.body_get_direct_state(ball.get_rid()).inverse_inertia

float linear_damp = 0.0 🔗

  • void set_linear_damp(value: float)

  • float get_linear_damp()

Демпфирует движение тела. По умолчанию тело будет использовать настройку ProjectSettings.physics/2d/default_linear_damp или любое переопределение значения, заданное Area2D, в котором находится тело. В зависимости от linear_damp_mode вы можете задать linear_damp для добавления или замены значения демпфирования тела.

Подробнее о демпфировании см. в ProjectSettings.physics/2d/default_linear_damp.


DampMode linear_damp_mode = 0 🔗

Определяет, как применяется linear_damp.


Vector2 linear_velocity = Vector2(0, 0) 🔗

  • void set_linear_velocity(value: Vector2)

  • Vector2 get_linear_velocity()

Линейная скорость тела в пикселях в секунду. Может использоваться спорадически, но не устанавливайте это в каждом кадре, потому что физика может работать в другом потоке и работать с другой гранулярностью. Используйте _integrate_forces() в качестве цикла процесса для точного управления состоянием тела.


bool lock_rotation = false 🔗

  • void set_lock_rotation_enabled(value: bool)

  • bool is_lock_rotation_enabled()

Если true, тело не может вращаться. Гравитация и силы применяют только линейное движение.


float mass = 1.0 🔗

Масса тела.


int max_contacts_reported = 0 🔗

  • void set_max_contacts_reported(value: int)

  • int get_max_contacts_reported()

Максимальное количество контактов, которые будут записаны. Требуется значение больше 0 и contact_monitor для установки в true для начала регистрации контактов. Используйте get_contact_count() для получения количества или get_colliding_bodies() для получения тел, с которыми произошло столкновение.

Примечание: Количество контактов отличается от количества столкновений. Столкновения между параллельными ребрами приведут к двум контактам (по одному на каждом конце), а столкновения между параллельными гранями приведут к четырем контактам (по одному на каждом углу).


PhysicsMaterial physics_material_override 🔗

Переопределение физического материала для тела.

Если материал назначен этому свойству, он будет использоваться вместо любого другого физического материала, например унаследованного.


bool sleeping = false 🔗

  • void set_sleeping(value: bool)

  • bool is_sleeping()

Если true, тело не будет двигаться и не будет вычислять силы, пока не будет разбужено другим телом, например, посредством столкновения или с помощью методов apply_impulse() или apply_force().


Описания метода

void _integrate_forces(state: PhysicsDirectBodyState2D) virtual 🔗

Вызывается во время обработки физики, позволяя вам читать и безопасно изменять состояние симуляции для объекта. По умолчанию он вызывается перед стандартной интеграцией силы, но свойство custom_integrator позволяет вам отключить стандартную интеграцию силы и выполнить полностью настраиваемую интеграцию силы для тела.


void add_constant_central_force(force: Vector2) 🔗

Добавляет постоянную направленную силу, не влияя на вращение, которая продолжает применяться с течением времени, пока не будет очищена с помощью constant_force = Vector2(0, 0).

Это эквивалентно использованию add_constant_force() в центре масс тела.


void add_constant_force(force: Vector2, position: Vector2 = Vector2(0, 0)) 🔗

Добавляет к телу постоянную позиционную силу, которая продолжает применяться с течением времени, пока не будет очищена с помощью constant_force = Vector2(0, 0).

position — это смещение от начала координат тела в глобальных координатах.


void add_constant_torque(torque: float) 🔗

Добавляет постоянную вращательную силу, не влияя на положение, которая продолжает применяться с течением времени, пока не будет очищена с помощью constant_torque = 0.


void apply_central_force(force: Vector2) 🔗

Применяет направленную силу, не влияя на вращение. Сила зависит от времени и должна применяться при каждом обновлении физики.

Это эквивалентно использованию apply_force() в центре масс тела.


void apply_central_impulse(impulse: Vector2 = Vector2(0, 0)) 🔗

Применяет направленный импульс, не влияя на вращение.

Импульс не зависит от времени! Применение импульса в каждом кадре приведет к силе, зависящей от частоты кадров. По этой причине его следует использовать только при моделировании одноразовых ударов (в противном случае используйте функции "_force").

Это эквивалентно использованию apply_impulse() в центре масс тела.


void apply_force(force: Vector2, position: Vector2 = Vector2(0, 0)) 🔗

Применяет позиционированную силу к телу. Сила зависит от времени и должна применяться при каждом обновлении физики.

position — это смещение от начала координат тела в глобальных координатах.


void apply_impulse(impulse: Vector2, position: Vector2 = Vector2(0, 0)) 🔗

Применяет позиционированный импульс к телу.

Импульс не зависит от времени! Применение импульса в каждом кадре приведет к силе, зависящей от частоты кадров. По этой причине его следует использовать только при моделировании одноразовых ударов (в противном случае используйте функции "_force").

position — это смещение от начала координат тела в глобальных координатах.


void apply_torque(torque: float) 🔗

Применяет вращательную силу, не влияя на положение. Сила зависит от времени и должна применяться при каждом обновлении физики.

Примечание: для работы требуется inertia. Чтобы иметь inertia, активный CollisionShape2D должен быть дочерним элементом узла, или вы можете вручную задать inertia.


void apply_torque_impulse(torque: float) 🔗

Применяет вращательный импульс к телу, не влияя на положение.

Импульс не зависит от времени! Применение импульса в каждом кадре приведет к силе, зависящей от частоты кадров. По этой причине его следует использовать только при моделировании одноразовых ударов (в противном случае используйте функции "_force").

Примечание: для работы требуется inertia. Чтобы иметь inertia, активный CollisionShape2D должен быть дочерним элементом узла, или вы можете вручную задать inertia.


Array[Node2D] get_colliding_bodies() const 🔗

Возвращает список тел, сталкивающихся с этим. Требуется, чтобы contact_monitor был установлен на true, а max_contacts_reported был установлен достаточно высоким для обнаружения всех столкновений.

Примечание: Результат этого теста не появляется сразу после перемещения объектов. Для повышения производительности список столкновений обновляется один раз за кадр и перед шагом физики. Рассмотрите возможность использования сигналов вместо этого.


int get_contact_count() const 🔗

Возвращает количество контактов этого тела с другими телами. По умолчанию возвращается 0, если тела не настроены на отслеживание контактов (см. contact_monitor).

Примечание: Чтобы получить сталкивающиеся тела, используйте get_colliding_bodies().


void set_axis_velocity(axis_velocity: Vector2) 🔗

Устанавливает скорость тела по заданной оси. Скорость по заданной векторной оси будет установлена как заданная длина вектора. Это полезно для прыжкового поведения.