Обмеження та відомі проблеми¶
🇬🇧 English | 🇺🇦 Українська
Сторінка описує поведінку InteractionSystem 1.0, яку варто знати до інтеграції: свідомі межі моделі та сценарії, які не перевірялися автоматично. Кожна межа — рішення архітектури з причиною; поруч наведено, як діяти, якщо вона заважає вашій грі.
Мережа та VR¶
Немає передбачення захоплення¶
Межа. RequestGrab чекає рішення сервера: предмет з'являється в руці через час обміну з сервером. Те саме стосується RequestInteraction. Після підтвердження предмет іде за рукою власника без затримки: Direct власник розв'язує сам, Physics — передбачає.
Чому. Хто що тримає, вирішує лише сервер; передбачене захоплення доводилося б відкочувати, коли два гравці хапають предмет одночасно.
Передбачення фізичного предмета має допуск¶
Межа. Власник бачить фізичний предмет у своїй руці, поки серверне тіло відстає не більше ніж на половину OwnerPredictionTolerance (типово 5 з 10 см). Якщо тіло впирається в перешкоду, власник плавно переходить до серверної пози, тож на великій затримці мережі зупинку видно із запізненням. Інші гравці завжди бачать серверну позу, згладжену RemoteInterpolationSpeed.
Дві руки — лише одного гравця¶
Межа. Один предмет можуть тримати щонайбільше дві руки (MaximumHands 1 або 2) одного pawn. Спільне утримання кількома гравцями не підтримується.
Мережеві цілі мають реплікуватися¶
Межа. У мережевій грі сервер відхиляє дію з актором, у якого Replicates=false (причина InvalidTarget). Компонент, до якого прикріплюють предмет (AttachToSurface, посадкова опора), має бути доступним для реплікації, інакше клієнт не приєднає предмет, а лише отримуватиме його позу зі snapshot.
Прихована рука не діє, поки її не видно¶
Межа. Рука, чию позу сервер відхилив (далеко від pawn або за перешкодою від його очей), зберігає останню прийняту позу. Її запити відхиляються з InvalidPose, а відпускання не кидає предмет. Інші руки працюють незалежно. Якщо від джерела зовсім перестали надходити зразки довше за PoseTimeout, сервер відпускає його предмет.
Фокус і цілі¶
Одна ціль захоплення на актор¶
Межа. Interactor знаходить ціль через FindComponentByClass<UInteractionGrabTargetComponent>(), тобто бере перший такий компонент актора, а реєстр веде облік по актору. Не додавайте до одного актора два компоненти маніпуляції.
Що робити. Одна рухома частина актора — через TargetComponentName (08). Для кількох незалежних частин (дві шухляди однієї шафи) зробіть кожну окремим актором, прикріпленим до шафи.
Перешкоду визначає перший блокувальний об'єкт¶
Межа. Промінь і sweep зупиняються на першому об'єкті, що блокує TraceChannel, навіть якщо він не є ціллю. Тонкі декоративні меші, тригери з Block на Visibility і невидима колізія закривають предмети за ними. Налаштуйте відповідь колізії або окремий канал трасування.
Маніпуляція¶
Компонент маніпуляції вимикає ReplicateMovement усього актора¶
Межа. На сервері BeginPlay викликає SetReplicateMovement(false) для власника: рух передає лише snapshot маніпуляції. Не вмикайте ReplicateMovement знову. Переміщувати корінь з gameplay-коду можна: компонент помітить зміну й передасть її клієнтам; SyncTransform() робить це негайно.
Обмежені ручки¶
Межа. Constraint=Rotary і Linear працюють лише з Movement=Direct, однією рукою й без масштабування. Кут колеса рахується навколо pivot цілі, тож pivot mesh має бути в центрі обертання. Стрибок понад 90° за кадр не зараховується як оберт.
Масштабування¶
Межа. Масштаб лише рівномірний і додатний, у межах MinimumScale–MaximumScale за найбільшою віссю, лише для Direct, двох рук і без обмеження. Батьківський компонент цілі має бути масштабований рівномірно.
Blueprint-ціль захоплення не рухає предмет сама¶
Межа. UInteractionBlueprintGrabTargetComponent лише відповідає на питання сервера й викликає ваші події. Рух, прикріплення й фізику ваш Blueprint виконує сам, на сервері, з реплікацією результату (наприклад, Replicate Movement власника для прикріплення до руки).
Інструменти налагодження¶
Межа. Команди й панель InteractionSystemDebug недоступні в Shipping-збірках. На клієнті PIE вони працюють після EnableCheats; серверні команди (InteractionClaims, InteractionResetAll) клієнт пересилає через ServerExec, тому сервер теж має дозволяти читерські команди (у PIE дозволяє).
Що не перевірялося автоматично¶
- Збирання для Windows (MSVC) на машині розробки: перевірка name hiding запобігає типовим помилкам, але не замінює збирання.
- Реальний Quest 2 і комфорт у HMD.
- Запуск на пристрої iOS чи Android. У коді немає платформних частин, а
.upluginдозволяє ці платформи, але плагін збирали й перевіряли тут лише на Mac; сенсорний ввід, продуктивність і мобільну збірку перевірте на своєму пристрої. - Окремі мережеві машини, втрати пакетів і late join. Затримку пакетів автоматичні тести імітують в одному процесі PIE.
Перед випуском своєї гри перевірте ці сценарії самостійно.