Ми зіткнулися з проблемою, коли різні інтеректори спрацьовують не в той час. Це може бути актуальним для будь-якого інтеректора і взаємодіючого об'єкта (Interactable), але ми зосередимося на телепортації. У цих взаємодіючих об'єктах телепортації є властивість під назвою Teleport Trigger. Вона дозволяє контролювати, коли відбувається телепортація, залежно від взаємодії користувача та вибору дії Select або Activate з XRI Default Input Actions.
У погляді на Action Map ми бачимо, що дія Selection Action призначена для кнопки GripButton, яка зазвичай використовується для захоплення предметів. Проте це може призвести до плутанини, коли замість захоплення відбувається телепортація, або навпаки — захоплення, коли ви хочете телепортуватися.
Щоб вирішити цю проблему, ми використовуємо Action Based Controller Manager та/або XR Interaction Group, щоб визначити, який інтеректор має бути активний і який має пріоритет.
Action Based Controller Manager
Наш об'єкт Controller має кілька інтеректорів як дочірніх об'єктів, кожен з яких обробляє різну взаємодію. Це може бути проблемою, якщо всі ці інтеректори активні одночасно.
Action Based Controller Manager — це компонент, який автоматично увімкне і вимкне різні інтеректори (як Ray Interactors, Direct Interactors, Teleport Interactors і т. д.) залежно від того, що намагається зробити користувач, наприклад, телепортуватися або захоплювати предмети.
Action Based Controller Manager потребує посилань на різні дочірні інтеректори та Input Actions контролера.
- Посилання на ваші інтеректори → щоб можна було увімкнути/вимкнути їх залежно від того, що робить гравець.
- Посилання на ваші Input Actions → щоб знати, коли переключити режими взаємодії.
XR Interaction Group
XR Interaction Group дозволяє комбінувати кілька інтеректорів (як Direct Interactor і Ray Interactor) на одному контролері і керує тим, який з них активний, залежно від пріоритету або умов, коли вони не вимкнені Action Based Controller Manager.
Наприклад:
- Якщо рука знаходиться поруч з предметом для захоплення, використовуємо Direct Interactor (захоплення рукою).
- Якщо нічого поруч немає, використовуємо Ray Interactor (лазерний вказівник для UI, телепортація, захоплення на відстані).
- Але обидва інтеректори — Direct і Ray — активні на одному контролері.
Вам потрібно призначити XR Interaction Manager в сцені, а потім призначити кожен з інтеректорів, яких ви хочете використовувати в групі взаємодії. Після цього ви побачите параметр Override Configure, де визначається, який інтеректор «виграє», якщо вони обидва активні і спрацьовують одночасно.
Action Based Controller Manager vs XR Interaction Group
Action Based Controller Manager
- Керує коли інтеректори активні.
- Обробляє перемикання між режимами (захоплення, лазерний вказівник, телепортація).
- Зазвичай використовується для перемикання на основі вводу.
XR Interaction Group
- Керує як активні інтеректори взаємодіють разом.
- Керує пріоритетом взаємодії на одній руці або контролері.
- Зазвичай використовується для чистого розміщення інтеректорів на контролері.
Чому обидва?
Вам не обов'язково використовувати обидва ці компоненти. XR Interaction Group працює добре, якщо вам не заважає, що кілька інтеректорів завжди активні на одному контролері, але ви можете використовувати правила пріоритету, щоб визначити, який з них «виграє» (наприклад, Direct Interactor має пріоритет над Ray, якщо він достатньо близько).
Action Based Controller Manager дає більше явного контролю над режимом взаємодії гравця, оскільки він дозволяє увімкнути лише один інтеректор, вимикаючи решту.
Інтерактори
Teleport Interactor
Teleport Interactor — це просто Ray Interactor з деякими змінами. Для цього створюємо XR>Ray Interactor і перейменовуємо його на "Teleport Interactor".
Зміна, яку хочу підкреслити, це налаштування Input для Select Input. Ми хочемо призначити це для Locomotion Teleport Mode, що дозволяє зробити Select input активним, коли цей Teleport Interactor увімкнений (це контролюється Controller Input Action Manager), і дія спрямована вгору на джойстику. Це відрізняється від Select action у Interaction Map, де кнопка захвату призначена для іншої функції. Це зручно, бо ми не будемо випадково викликати Select input, навіть якщо перебуваємо на неправильному інтеректорі (наприклад, Ray Interactor), оскільки для них використовуються різні входи.
Ray Interactor
Ось як виглядає Ray Interactor і налаштування Input Actions для Select Input.
Direct Interactor
Цей інтеректор наразі не налаштований для виконання жодних дій, але він показує, як можна використовувати Controller Input Action Manager і XR Interaction Group.
Маски взаємодії (Interaction Layer Masks)
Маски взаємодії — це система фільтрів, яка контролює, з чим інтеректор (як Direct, Ray або Teleport) може взаємодіяти. Без масок взаємодії кожен інтеректор може взаємодіяти з усім, що призведе до небажаних результатів. Маски взаємодії дозволяють точно контролювати, які типи об'єктів повинні реагувати на різні інтеректори.
Для Ray Interactor ми не хочемо, щоб він детектував Teleport, тому налаштовуємо його на детекцію лише Default Layer. Для Teleport Interactor ми хочемо взаємодіяти лише з Teleport Layer. Ви можете створювати свої власні шари, щоб детектувати їх, вибираючи "Add layer...".
Нарешті, вам потрібно перейти до ваших Interactables і встановити їх Interaction Layer Mask так, щоб вони відповідали інтеректору, з яким ви хочете, щоб вони взаємодіяли. Наприклад, я встановив Teleport Area і Teleport Anchor на Teleport Layer, щоб тільки Teleport Interactor міг взаємодіяти з ними.
Висновки
Управління кількома інтеректорами на VR контролері вимагає обережного підходу, щоб уникнути небажаних взаємодій, особливо коли йдеться про телепортацію та захоплення предметів. Action Based Controller Manager дає чіткий контроль над тим, які інтеректори активні на основі вводу гравця, а XR Interaction Group керує тим, як кілька активних інтеректорів поводяться разом, використовуючи правила пріоритету. Хоча кожен з цих компонентів можна використовувати окремо, поєднання обох дає найбільш потужне рішення для вдосконалених VR-експериментів. Такий підхід гарантує точний контроль над режимами взаємодії та запобігає випадковим взаємодіям, створюючи більш плавний та інтуїтивно зрозумілий досвід для гравців.
Перекладено з: Unity VR: Multiple Interactors & One Controller