Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
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() внутренне.
Если true, тело заморожено. Гравитация и силы больше не применяются.
См. freeze_mode, чтобы настроить поведение тела в замороженном состоянии.
Примечание: Для тела, которое всегда заморожено, используйте StaticBody2D или AnimatableBody2D вместо этого.
FreezeMode freeze_mode = 0 🔗
void set_freeze_mode(value: FreezeMode)
FreezeMode get_freeze_mode()
Режим заморозки тела. Определяет поведение тела, когда freeze имеет значение true.
Примечание: Для тела, которое всегда заморожено, используйте StaticBody2D или AnimatableBody2D вместо этого.
Умножает силу тяжести, приложенную к телу. Сила тяжести тела рассчитывается на основе настройки проекта 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) 🔗
Устанавливает скорость тела по заданной оси. Скорость по заданной векторной оси будет установлена как заданная длина вектора. Это полезно для прыжкового поведения.