Skip to content

Питання та відповіді

🇬🇧 English | 🇺🇦 Українська

Вибір і фокус

Чому предмет не вибирається?

Відкрийте панель налагодження командою InteractionOverlay (15) і подивіться рядок Focus. Якщо він порожній, перевірте: колізія предмета блокує TraceChannel (типово Visibility); предмет ближче за TraceDistance; теги проходять фільтр джерела; CanInteract повертає true; рука не тримає іншого предмета. Перший блокувальний об'єкт на шляху променя може бути стіною чи іншим предметом.

Чому на клієнті є фокус, але дія відхиляється?

Сервер повторно перевіряє світ у момент запиту. Причину повідомляє Reason у події OnActionResult і рядок Last answer панелі налагодження:

  • InvalidTarget — ціль не має Replicates;
  • InvalidPose — рука далі за MaxOriginDistance від pawn або закрита від його очей;
  • NotReachable — на сервері між рукою й предметом щось є;
  • Claimed — предмет у руках іншого гравця;
  • Unavailable — захоплення вимкнене, немає вільного місця або немає звичайної дії.

Повна таблиця — у 13.

Як показати гравцеві, чому не вийшло?

Обробіть OnActionResult і перетворіть Reason на текст: «Цей предмет у когось у руках», «Не дотягнутися» тощо. Готова таблиця повідомлень — у уроці 3.

Чому рука, яка тримає предмет, не показує підказок для інших предметів?

Один UInteractorComponent — одна рука. Поки вона тримає предмет або чекає відповіді сервера, CanFocusNewTarget() повертає false і фокус порожній. Друга VR-рука має власний компонент і вибирає незалежно.

Захоплення й рух

Чому предмет під час підбору стрибає до руки?

У профілі ввімкнено Alignment=Align: перша рука суміщає точку хвату (або корінь предмета) з долонею. Так налаштовані кубики InteractionLab і списи SpearRange. Щоб предмет залишався там, де його взяли, виберіть KeepOffset.

Як задати, де саме тримати предмет?

Додайте UInteractionGripPointComponent у потрібному місці (або вкажіть socket mesh), виберіть GripSelection=Authored чи PreferAuthored і Alignment=Align. Детально — у 08.

Чи можна тримати предмет двома руками?

Так, якщо MaximumHands=2 і обидві руки належать одному pawn. TwoHandPivot, bAllowScaling і межі масштабу задає профіль. Два різні гравці один предмет не тримають.

Чому предмет у руці проходить крізь стіни?

Movement=Direct ставить предмет точно в позу руки щокадру без фізичних зіткнень. Для інструментів, які мають упиратися в перешкоди, використайте Movement=Physics: тіло веде фізичний привід, а якщо воно застрягло й рука пішла далі на BreakDistance, хват безпечно скасовується.

Як зробити шухляду, кришку чи важіль, що є частиною іншого актора?

Вкажіть у маніпуляції TargetComponentName цієї частини та обмеження Linear або Rotary. Частина залишається під своїм батьком і рухається разом із ним. Покроково — урок 4.

Як тимчасово заборонити брати предмет, наприклад під час катсцени?

Викличте на сервері Set Grab Enabled(false): нові хвати відхиляються, а поточні руки безпечно відпускають предмет. Значення реплікується, тож підказка зникає й у клієнтів.

Як повернути предмети на місце?

Reset Manipulation на сервері звільняє руки й повертає предмет у домашню позу, ручку — у нульовий хід, а частину актора — під її батька. Дім запам'ятовується на початку гри й змінюється через Set Home Transform (08). Команда InteractionResetAll робить це для всіх предметів одразу.

Чому після додавання маніпуляції актор перестав реплікувати рух?

Компонент маніпуляції сам вимикає ReplicateMovement власника: рух, масштаб і прикріплення передає його snapshot. Не вмикайте ReplicateMovement знову. Пересувати предмет з gameplay-коду можна: компонент сам передасть зміну клієнтам.

Як прикріпити предмет до полиці чи кобури?

Без коду — UInteractionDockComponent: відпущена деталь із потрібним Actor Tag сідає в опору, а повторне захоплення її звільняє. З Blueprint чи C++ — Attach To Surface маніпуляції на сервері (11).

Як зробити двері чи кнопку в Blueprint?

Реалізуйте InteractableInterface і подію Interaction, а видимий стан змінюйте через replicated-змінну з RepNotify. Покроково — урок 2.

Мережа

Чому в мультиплеєрі предмет випадає з руки сам?

Сервер відпускає предмет без кидка, якщо від віддаленої руки довше за PoseTimeout не надходить жодного зразка пози, трекінг утрачено довше за TrackingLossGrace, pawn утратив контролер або захоплення вимкнули. Перешкода перед іншою рукою предмета не відбирає. Причини — у мережевій моделі.

Чи відстає предмет у власній руці від контролера?

Ні: власник бачить предмет у своїй руці одразу і в режимі Direct, і в Physics. Лише коли фізичне тіло на сервері впирається в перешкоду, власник плавно переходить до серверної пози (08).

Де змінити мережеві межі: відстань, інтервал, швидкість кидка?

У Project Settings → Plugins → Interaction System. Окремий InteractorComponent може перевизначити будь-яке значення прапорцем Override біля нього (04).

Чи працює система з AI?

Так. На сервері AI-pawn вважається локально керованим: його UInteractorComponent шукає фокус і виконує RequestGrab, RequestRelease, RequestInteraction без RPC. Зменште FocusUpdateHz, якщо AI не потрібен постійний фокус.

Чи завдає кинутий предмет шкоди?

Лише якщо ви це ввімкнули: Apply Impact Damage в Object Data готового фізичного актора. Тоді шкода дорівнює імпульсу удару × Damage Per Impulse, а ініціатором стає гравець, що востаннє брав предмет (05).

Інтеграція

Чи потрібен OpenXR?

Ядро використовує звичайні scene components. OpenXR або інший tracking provider налаштовує ваш проєкт.

Чи потрібен C++?

Ні. Персонажа, предмети, двері, реакції на події, серверні функції маніпуляції й навіть власну ціль захоплення (InteractionBlueprintGrabTargetComponent) можна зробити в Blueprint (11). C++ знадобиться, якщо ви хочете успадкувати базову ціль захоплення напряму чи змінити реакцію фізичного актора на удари.

Чи можна використовувати лише ядро?

Так. Реалізуйте IInteractableInterface на своїх акторах і додайте тільки InteractionSystem до dependencies. Готові фізичні актори й маніпуляція потребують World.

Як обчислюється швидкість кидка у VR?

Її передає ваш pawn у RequestRelease: лінійну у см/с і кутову у градусах/с у світових координатах. VR-pawn демо згладжує зміну позиції долоні між кадрами. Сервер обрізає значення до MaxThrowSpeed і MaxAngularSpeed.

Чому стріла не стає на тятиву?

Лук і стріла мають бути в різних руках одного pawn, лук — лише в одній руці, а хвіст стріли — ближче за NockRadius (18 см) до тятиви. Покроково — у 10.

Представлення

Чому немає outline?

Призначте overlay-матеріал або підключіть власний post-process до custom depth. Сам stencil не створює видимого контуру.

Чи можна працювати в split-screen?

Логіка джерел розділена. Вбудований mesh overlay спільний для процесу; для окремих підказок кожного viewport створіть presenter на LocalPlayer через OnFocusChanged.

Версія та пакування

Яка версія рушія підтримується?

InteractionSystem 1.0 підтримує лише Unreal Engine 5.8. Актуальна документація — цей каталог.

Як не постачати демо у своїй грі?

Додайте +DirectoriesToNeverCook=(Path="/InteractionSystem/Demo") у Config/DefaultGame.ini свого проєкту. Код Demo-модуля так не виключається; щоб прибрати і його, дивіться 06.

Чи потрапляють інструменти налагодження в гру?

У Shipping-збірці модуль InteractionSystemDebug нічого не реєструє: команд немає, панель не відкривається. Повністю прибрати його можна за інструкцією.