RigidBody2D
Успадковує: PhysicsBody2D < CollisionObject2D < Node2D < CanvasItem < Node < Object
Успадковано від: PhysicalBone2D
Корпус фізики 2D, який переміщається за допомогою фізкультури.
Опис
RigidBody2D реалізує повну двовимірну фізику. Ним не можна керувати безпосередньо, натомість до нього потрібно прикладати сили (гравітацію, імпульси тощо), а фізичне моделювання розрахує результуючий рух, обертання, реагуватиме на зіткнення та впливатиме на інші фізичні тіла на своєму шляху.
Поведінку тіла можна регулювати за допомогою lock_rotation, freeze та freeze_mode. Змінюючи різні властивості об'єкта, такі як mass, можна контролювати, як фізичне моделювання діє на нього.
Тверде тіло завжди зберігатиме свою форму та розмір, навіть коли до нього прикладаються сили. Це корисно для об'єктів, з якими можна взаємодіяти в середовищі, таких як дерево, яке можна перекинути, або стопка ящиків, які можна штовхати.
Якщо вам потрібно безпосередньо впливати на тіло, віддайте перевагу _integrate_forces(), оскільки це дозволяє вам безпосередньо отримати доступ до фізичного стану.
Якщо вам потрібно змінити поведінку фізики за замовчуванням, ви можете написати власну функцію інтегрування сил. Див. custom_integrator.
Примітка: Часта зміна 2D-перетворення або 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. true і max_contacts_reported для виявлення всіх зіткнень. TileMap виявляються, якщо TileSet має Collision Shape2Ds.
body the 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 стикається з елементами PhysicsBody2D або Shape2D з TileMap. Потрібно, щоб contact_monitor було встановлено на true, а max_contacts_reported було встановлено на достатньо високе значення для виявлення всіх колізій. TileMap виявляються, якщо TileSet має колізії Shape2D.
body_rid – RID іншого PhysicsBody2D або CollisionObject2D з TileSet, що використовується 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 та Shape2D іншого PhysicsBody2D або TileMap. Потрібно, щоб contact_monitor було встановлено на true, а max_contacts_reported було встановлено на достатньо високе значення для виявлення всіх колізій. TileMap виявляються, якщо TileSet має колізії Shape2D.
body_rid – RID іншого PhysicsBody2D або CollisionObject2D TileSet, що використовується 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
Статичний режим замерзання тіла (default). Тіло не впливає на тяжіння і сили. Ви можете переміщатися тільки за допомогою коду користувача і не співвідноситься з іншими органами.
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
Безперервне виявлення зіткнень увімкнено з використанням зондування. Це швидше, ніж формулювання, але менш точний.
CCDMode CCD_MODE_CAST_SHAPE = 2
Безперервне виявлення зіткнень увімкнено за допомогою формулювання. Це повільний метод 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 🔗
Швидкість обертання тіла в radians за секунду.
Якщо true, тіло може перейти в режим сну, коли немає руху. Див. sleeping.
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().
Загальні постійні сили обертання тіла, що застосовуються під час кожного оновлення фізики.
Див. add_constant_torque().
bool contact_monitor = false 🔗
true, RigidBody2D буде випромінювати сигнали, коли він співає з іншим тілом.
Примітка: У зв'язку з тим, як ми використовуємо файли cookie, щоб надати вам інформацію про файли cookie.
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.
Для тіла, яке завжди заморожене, використовуйте StaticBody2D або AnimatableBody2D.
Збільшує силу тяжіння, прикладену до тіла. Сила тяжіння тіла обчислюється на основі налаштувань проекту ProjectSettings.physics/2d/default_gravity та/або будь-якого додаткового вектора гравітації, застосованого Area2D.
Момент інерції тіла. Це як маса, але для обертання: вона визначає, який крутний момент потрібен для обертання тіла. Момент інерції зазвичай обчислюється автоматично на основі маси та форм, але ця властивість дозволяє встановити власне значення.
Якщо встановлено значення 0, інерція обчислюється автоматично (значення за замовчуванням).
Примітка. Це значення не змінюється, коли інерція обчислюється автоматично. Використовуйте PhysicsServer2D, щоб отримати обчислену інерцію.
@onready var ball = $Ball
функція 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)) 🔗
Застосовується спрямований імпульс без впливу обертання.
Імпульс часозалежний! Нанесення імпульсу кожного кадру призведе до каркасно-залежної сили. З цієї причини слід використовувати тільки при симуляції одноразових ударів (користування функції "_сил" інакше).
Це еквівалентно використання apply_impulse() в центрі маси тіла.
void apply_force(force: Vector2, position: Vector2 = Vector2(0, 0)) 🔗
Застосовується сила позиціонування організму. Знаряддя часу залежна і означена для кожного оновлення фізики.
position – це зміщення з організму в глобальних координатах.
void apply_impulse(impulse: Vector2, position: Vector2 = Vector2(0, 0)) 🔗
Застосує поміщений імпульс до тіла.
Імпульс часозалежний! Нанесення імпульсу кожного кадру призведе до каркасно-залежної сили. З цієї причини слід використовувати тільки при симуляції одноразових ударів (користування функції "_сил" інакше).
position – це зміщення з організму в глобальних координатах.
void apply_torque(torque: float) 🔗
Застосовує обертальну силу, не впливаючи на положення. Сила залежить від часу та має застосовуватися під час кожного оновлення фізики.
Примітка: Для роботи потрібен inerty. Щоб мати inerty, активний CollisionShape2D має бути дочірнім елементом вузла, або ви можете вручну встановити inerty.
void apply_torque_impulse(torque: float) 🔗
Застосовує обертальний імпульс до тіла без впливу на положення.
Імпульс часозалежний! Нанесення імпульсу кожного кадру призведе до каркасно-залежної сили. З цієї причини слід використовувати тільки при симуляції одноразових ударів (користування функції "_сил" інакше).
Примітка: 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) 🔗
Встановлює швидкість тіла на даній осі. Швидкість в заданій векторній віссі буде встановлена в якості заданої довжини вектора. Це корисно для стрибків поведінки.