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, оскільки це призведе до встановлення його глобального перетворення щоразу, коли рухається його предок.

Посібники

Властивості

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. true і max_contacts_reported для виявлення всіх зіткнень. TileMap виявляються, якщо TileSet має Collision Shape2Ds.

body the 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 стикається з елементами PhysicsBody2D або Shape2D з TileMap. Потрібно, щоб contact_monitor було встановлено на true, а max_contacts_reported було встановлено на достатньо високе значення для виявлення всіх колізій. TileMap виявляються, якщо TileSet має колізії Shape2D.

body_ridRID іншого PhysicsBody2D або CollisionObject2D з TileSet, що використовується PhysicsServer2D.

bodyNode, якщо він існує в дереві, іншого 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_ridRID іншого PhysicsBody2D або CollisionObject2D TileSet, що використовується PhysicsServer2D.

bodyNode, якщо він існує в дереві, іншого 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 і найбільш точний.


Описи властивостей

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()

Швидкість обертання тіла в radians за секунду.


bool can_sleep = true 🔗

  • void set_can_sleep(value: bool)

  • bool is_able_to_sleep()

Якщо true, тіло може перейти в режим сну, коли немає руху. Див. sleeping.


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 буде випромінювати сигнали, коли він співає з іншим тілом.

Примітка: У зв'язку з тим, як ми використовуємо файли cookie, щоб надати вам інформацію про файли cookie.


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()

Якщо true, тіло заморожене. Витривалість і сили не застосовуються більше.

Дивись freeze_mode, щоб встановити поведінку тіла при замороженні.

Для тіла, який завжди заморожений, використовуйте StaticBody2D або AnimatableBody2D.


FreezeMode freeze_mode = 0 🔗

Режим заморожування тіла. Можна використовувати для встановлення поведінки тіла, коли ввімкнено freeze.

Для тіла, яке завжди заморожене, використовуйте StaticBody2D або AnimatableBody2D.


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

функція 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)) 🔗

Застосовується спрямований імпульс без впливу обертання.

Імпульс часозалежний! Нанесення імпульсу кожного кадру призведе до каркасно-залежної сили. З цієї причини слід використовувати тільки при симуляції одноразових ударів (користування функції "_сил" інакше).

Це еквівалентно використання 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) 🔗

Встановлює швидкість тіла на даній осі. Швидкість в заданій векторній віссі буде встановлена в якості заданої довжини вектора. Це корисно для стрибків поведінки.