RigidBody2D
Наследует: PhysicsBody2D < CollisionObject2D < Node2D < CanvasItem < Node < Object
Наследуется от: PhysicalBone2D
Двухмерное физическое тело, которое перемещается с помощью симуляции физики.
Описание
RigidBody2D реализует полноценную двумерную физику. Им нельзя управлять напрямую, вместо этого необходимо прикладывать к нему силы (гравитацию, импульсы и т. д.), а физическая симуляция вычисляет результирующее движение, вращение, реагирует на столкновения и влияет на другие физические тела на его пути.
Поведение тела можно настроить с помощью lock_rotation, freeze и freeze_mode. Изменяя различные свойства объекта, такие как mass, можно управлять тем, как на него воздействует физическая симуляция.
Твёрдое тело всегда сохраняет свою форму и размер, даже при приложении к нему сил. Это полезно для объектов, с которыми можно взаимодействовать в окружающей среде, например, для дерева, которое можно опрокинуть, или для штабеля ящиков, которые можно толкать.
Если вам нужно напрямую воздействовать на тело, предпочтительнее _integrate_forces(), поскольку он позволяет напрямую получать доступ к физическому состоянию.
Если вам нужно переопределить физическое поведение по умолчанию, вы можете написать собственную функцию интегрирования сил. См. custom_integrator.
Примечание: Изменение двумерного преобразования или linear_velocity объекта RigidBody2D очень часто может привести к непредсказуемому поведению. Это также происходит, когда RigidBody2D является потомком постоянно движущегося узла, например, другого RigidBody2D, поскольку это приведёт к установке его глобального преобразования при каждом перемещении его предка.
Обучающие материалы
Свойства
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
Методы
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) |
get_colliding_bodies() const |
|
get_contact_count() const |
|
void |
set_axis_velocity(axis_velocity: Vector2) |
Сигналы
Вызывается при столкновении с другим PhysicsBody2D или TileMap. Требует, чтобы contact_monitor был установлен на true, а max_contacts_reported был установлен достаточно высоким для обнаружения всех столкновений. TileMap-ы обнаруживаются, если TileSet имеет Столкновение Shape2D-ов.
body Node, если он существует в дереве, другого PhysicsBody2D или TileMap.
Вызывается, когда заканчивается столкновение с другим 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 и самый точный.
Описания свойств
Демпфирует вращение тела. По умолчанию тело будет использовать настройку 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 🔗
Скорость вращения тела в радианах в секунду.
Если true, тело может войти в режим сна, когда нет движения. Смотрите sleep.
Vector2 center_of_mass = Vector2(0, 0) 🔗
Центр масс тела, определяемый пользователем, относительно исходного положения тела, когда 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 🔗
void set_center_of_mass_mode(value: CenterOfMassMode)
CenterOfMassMode get_center_of_mass_mode()
Определяет способ установки центра массы тела.
Vector2 constant_force = Vector2(0, 0) 🔗
Общие постоянные позиционные силы тела, применяемые во время каждого обновления физики.
См. add_constant_force() и add_constant_central_force().
Общие постоянные вращательные силы тела, применяемые во время каждого обновления физики.
bool contact_monitor = false 🔗
Если true, RigidBody2D будет издавать сигналы при столкновении с другим телом.
Примечание: По умолчанию максимальное количество сообщаемых контактов установлено на 0, что означает, что ничего не будет записано, см. max_contacts_reported.
void set_continuous_collision_detection_mode(value: CCDMode)
CCDMode get_continuous_collision_detection_mode()
Режим непрерывного обнаружения столкновений.
Непрерывное обнаружение столкновений пытается предсказать, где движущееся тело столкнется, вместо того, чтобы перемещать его и корректировать его движение после столкновения. Непрерывное обнаружение столкновений медленнее, но точнее и пропускает меньше столкновений с небольшими, быстро движущимися объектами. Доступны методы Raycasting и Shapecasting.
bool custom_integrator = false 🔗
Если true, стандартная интеграция силы (например, гравитация или демпфирование) будет отключена для этого тела. За исключением реакции на столкновение, тело будет двигаться только так, как определено методом _integrate_forces(), если этот виртуальный метод переопределен.
Установка этого свойства вызовет метод PhysicsServer2D.body_set_omit_force_integration() внутренне.
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 🔗
void set_freeze_mode(value: FreezeMode)
FreezeMode get_freeze_mode()
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.
Умножает силу тяжести, приложенную к телу. Сила тяжести тела рассчитывается на основе настройки проекта ProjectSettings.physics/2d/default_gravity и/или любого дополнительного вектора силы тяжести, примененных Area2D-ов.
Момент инерции тела. Это похоже на массу, но для вращения: он определяет, какой крутящий момент требуется для вращения тела. Момент инерции обычно вычисляется автоматически из массы и форм, но это свойство позволяет вам задать пользовательское значение.
Если установлено значение 0, инерция вычисляется автоматически (значение по умолчанию).
Примечание: Это значение не изменяется при автоматическом вычислении инерции. Используйте PhysicsServer2D, чтобы получить вычисленную инерцию.
@onready var ball = $Ball
func get_ball_inertia():
return 1.0 / PhysicsServer2D.body_get_direct_state(ball.get_rid()).inverse_inertia
private RigidBody2D _ball;
public override void _Ready()
{
_ball = GetNode<RigidBody2D>("Ball");
}
private float GetBallInertia()
{
return 1.0f / PhysicsServer2D.BodyGetDirectState(_ball.GetRid()).InverseInertia;
}
Демпфирует движение тела. По умолчанию тело будет использовать настройку 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) 🔗
Линейная скорость тела в пикселях в секунду. Может использоваться спорадически, но не устанавливайте это в каждом кадре, потому что физика может работать в другом потоке и работать с другой гранулярностью. Используйте _integrate_forces() в качестве цикла процесса для точного управления состоянием тела.
Если true, тело не может вращаться. Гравитация и силы применяют только линейное движение.
Масса тела.
int max_contacts_reported = 0 🔗
Максимальное количество контактов, которые будут записаны. Требуется значение больше 0 и contact_monitor для установки в true для начала регистрации контактов. Используйте get_contact_count() для получения количества или get_colliding_bodies() для получения тел, с которыми произошло столкновение.
Примечание: Количество контактов отличается от количества столкновений. Столкновения между параллельными ребрами приведут к двум контактам (по одному на каждом конце), а столкновения между параллельными гранями приведут к четырем контактам (по одному на каждом углу).
PhysicsMaterial physics_material_override 🔗
void set_physics_material_override(value: PhysicsMaterial)
PhysicsMaterial get_physics_material_override()
Переопределение физического материала для тела.
Если материал назначен этому свойству, он будет использоваться вместо любого другого физического материала, например унаследованного.
Если 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) 🔗
Устанавливает скорость тела по заданной оси. Скорость по заданной векторной оси будет установлена как заданная длина вектора. Это полезно для прыжкового поведения.