Програмування логіки захоплення та метання предметів у VR

Наша компанія з розробки відеоігор веде незалежні проекти, спільно з клієнтом створює ігри та надає додаткові операційні послуги. Досвід нашої команди дозволяє нам охопити всі ігрові платформи та розробити приголомшливий продукт, що відповідає баченню клієнта та перевагам гравців.

Від імерсивних застосунків до ігрових світів і 3D-сцен

Наша виділена команда для VR/AR/MR-розробки, Unity-продакшну і 3D-моделювання та анімації — з власними кейсами і презентаціями.

Відвідати персоналізований сайт
Показано 1 з 1 послугУсі 242 послуг
Програмування логіки захоплення та метання предметів у VR
Складна
~1-2 тижні
Часті питання

Наші компетенції

Які етапи розробки гри?

Останні роботи

  • image_games_mortal_motors_495_0.webp
    Розробка гри для компанії Mortal Motors
    683
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Покрокова стратегія у фентезі сеттингу With Fire And Sword
    862
  • image_games_second_team_604_0.webp
    Розробка ігри для компанії Second term
    491
  • image_games_phoenix_ii_606_0.webp
    3D-анімація – тизер для гри phoenix 2.
    533

Програмування логіки захвату та метання предметів в VR

Взяти предмет рукою в VR та швирнути його в стіну – один із найбазовіших та одночасно один із найтехнічно неочевидних механік. Коли вона працює добре, гравець не помічає нічого. Коли погано – предмет телепортується в руку з затримкою, дрижить при утриманні, летить не туди або проваливається крізь підлогу.

Чому стандартний Rigidbody + Attach не працює як очікується

Перший інстинкт – при захваті переміститись об'єкт у позицію контролера та зробити його child. Це працює 5 секунд. Потім виясняється:

Rigidbody з isKinematic = false під контролером-батьком поводиться непередбачуваного: фізичний движок не знає, що об'єкт рухається кінематично, продовжує обчислювати колізії зі старим velocity. Об'єкт проходить крізь поверхні при швидкому рухові руки.

З isKinematic = true об'єкт перестає брати участь у фізиці взагалі: ігнорує колізії, не штовхає інші об'єкти. Можна розмахувати мечем крізь все.

Правильне рішення в XR Interaction ToolkitXRGrabInteractable з Movement Type = VelocityTracking. У цьому режимі об'єкт не телепортується до руки – до нього застосовується velocity, яка рухає Rigidbody до target позиції. Фізика залишається активною. Об'єкт сталкується з перешкодами при переміщенні рукою. Параметри Track Position Strength та Track Rotation Strength визначають "жорсткість" слідування – високі значення (20–30) дають щільне прилипання до руки, низькі (5–10) – м'яке, з лагом, як буцьто тримаєш важкий шар.

Метання: звідки береться velocity

Після release потрібно передати об'єкту швидкість, що відповідає рухові руки. Здавалось би, просто rigidBody.velocity = controllerVelocity. Проблеми:

Velocity контролера в XR Node – це миттєве значення у момент release. Якщо гравець різко зупинив руку перед кидком (що роблять багато хто), velocity = 0 та об'єкт падає вертикально вниз. Реальний фізичний кидок використовує піковую швидкість у фазі метання, не фінальну.

Velocity smoothing: XRGrabInteractable збирає історію позицій контролера за останні N кадрів (за замовчуванням – Velocity Smoothing буфер 5–10 фреймів). При release вичислюється середня velocity за буфером. Це імітує фізичну інерцію. У версії XR Interaction Toolkit 2.3+ параметр Throw Velocity Scale додатково масштабує фінальну velocity – значення 1.5–2.0 дає ощущення більш "важкого" кидка.

Angular velocity для обертання. Якщо не передати angular velocity при кидку – об'єкт летить без обертання, що неестетично. rigidBody.angularVelocity = controllerAngularVelocity * throwAngularVelocityScale.

Специфіка для Quest та мобільного VR

На Quest controller tracking працює з затримкою 20–30 мс (Prediction компенсує частково). Velocity із InputDevice.TryGetFeatureValue(CommonUsages.deviceVelocity) вже передбачена Meta Runtime – використовувати саме її, не вичислювати вручну по дельті позицій.

Haptic feedback при захваті – обов'язковий для якості життя. XRBaseController.SendHapticImpulse(0.7f, 0.05f) при початку grab, SendHapticImpulse(0.3f, 0.02f) при release. Без вібрації VR-захват ощущається пластиковим.

Окрема тема – two-handed grab: зброя, яку можна тримати двома руками. XR Interaction Toolkit 2.x надає XRGrabInteractable з кількома Attach Points та логікою dominant/secondary hand. Для зброї потрібна кастомна логіка: основна рука визначає позицію, друга – додає обертання вздовж осі ствола.

Терміни: базова grab/throw механіка через XR Interaction Toolkit – 2–4 робочих дні; кастомна two-handed система з haptics та velocity tuning – 1–2 тижні. Вартість визначається після аналізу вимог проекту.