Как добавить ближнее взаимодействие

Близкие взаимодействия приходят в виде касаний и захватов. События касания и захвата создаются как события указателя покепоинтер и сферепоинтерсоответственно.

Для прослушивания сенсорного ввода и/или получения входных событий в определенном GameObject требуется три ключевых шага.

  1. Убедитесь, что соответствующий указатель зарегистрирован в основном профиле конфигурации мртк.
  2. Убедитесь, что нужный GameObject имеет соответствующий компонент скрипта захвата или сенсорного ввода и .
  3. Реализуйте интерфейс обработчика входных данных для присоединенного скрипта к желаемому GameObject для прослушивания событий захвата или касания .

Добавление взаимодействий захвата

  1. Убедитесь, что сферепоинтер зарегистрирован в профиле указателя мртк.

    профиль мртк по умолчанию и профиль HoloLens 2 по умолчанию уже содержат сферепоинтер. Можно подтвердить, что сферепоинтер будет создан, выбрав профиль конфигурации мртк и перейдя к параметрам указателявходных указателей. По умолчанию для GrabPointer prefab (Assets/мртк/SDK/Features/UX/Prefabs/указатели) должен быть указан GrabPointer с установленной рукой. Пользовательское prefab можно использовать при условии, что он реализует SpherePointer класс.

    Grab Pointer Profile Example

    Указатель захвата по умолчанию запрашивает соседние объекты в конусе вокруг точки захвата в соответствии с интерфейсом Hololens 2 по умолчанию.

    Conical Grab Pointer

  2. В GameObject, которые должны быть захвачены, добавьте NearInteractionGrabbable , а также в виде конфликтующего.

    Убедитесь, что слой GameObject находится на захваченном слое. По умолчанию все слои, кроме пространственной осведомленности и Ignore райкастс , могут быть извлечены. Чтобы узнать, какие слои могут быть извлечены, проверьте маски слоя захвата в грабпоинтер prefab.

  3. В GameObject или одном из его предков добавьте компонент скрипта, реализующий IMixedRealityPointerHandler интерфейс. Любой предок объекта с объектом NearInteractionGrabbable будет иметь возможность получать события указателя.

Пример кода захвата

Ниже приведен скрипт, который будет печатать, если событие является касанием или захватом. В соответствующей функции интерфейса имикседреалитипоинтерхандлер можно просмотреть тип указателя, который активирует это событие через . Если указатель является сферепоинтер, то взаимодействие является захватом.

public class PrintPointerEvents : MonoBehaviour, IMixedRealityPointerHandler
{
    public void OnPointerDown(MixedRealityPointerEventData eventData)
    {
        if (eventData.Pointer is SpherePointer)
        {
            Debug.Log($"Grab start from {eventData.Pointer.PointerName}");
        }
        if (eventData.Pointer is PokePointer)
        {
            Debug.Log($"Touch start from {eventData.Pointer.PointerName}");
        }
    }

    public void OnPointerClicked(MixedRealityPointerEventData eventData) {}
    public void OnPointerDragged(MixedRealityPointerEventData eventData) {}
    public void OnPointerUp(MixedRealityPointerEventData eventData) {}
}

Добавление сенсорных взаимодействий

Процесс добавления сенсорного взаимодействия в элементах Унитюи отличается от процесса обычный 3D объекты gameobject. Чтобы включить компоненты пользовательского интерфейса Unity, можно перейти к следующему разделу Unity UI.

Однако для обоих типов элементов UX убедитесь, что покепоинтер зарегистрирован в профиле указателя мртк.

профиль мртк по умолчанию и профиль HoloLens 2 по умолчанию уже содержат покепоинтер. Можно подтвердить, что покепоинтер будет создан, выбрав профиль конфигурации мртк и перейдя к параметрам указателявходных указателей. По умолчанию PokePointer (Assets/мртк/SDK/Features/UX/Prefabs/указатели) prefab должен быть указан PokePointer с установленной рукой. Пользовательское prefab можно использовать при условии, что он реализует PokePointer класс.

Poke Pointer Profile Example

Трехмерная объекты gameobject

Существует два разных способа добавления сенсорных взаимодействий в трехмерные объекты gameobjectы в зависимости от того, будет ли трехмерный объект иметь только одну сенсорную плоскость, или, если она должна быть сенсорной в зависимости от его полного конфликта. Первый способ обычно применяется к объектам с Боксколлидерс, где требуется только один человек, реагирующий на события касания. Другой — для объектов, которые должны быть сенсорными в любом направлении в зависимости от их конфликтующего объекта.

Касание одним лицом

Это полезно для случаев, когда только один человек должен быть сенсорным. Этот параметр предполагает, что у игрового объекта есть Боксколлидер. его можно использовать с объектами, не являющимися Боксколлидер. в этом случае свойства "Bounds" и "Local Center" настраиваются вручную для настройки сенсорной плоскости (т. е. для границ следует задать ненулевое нулевое значение).

  1. в GameObject, который должен быть сенсорным, добавьте боксколлидер и [ NearInteractionTouchable ] (xref: Microsoft. микседреалити. набор средств. Input. Неаринтерактионтаучабле).

    1. задайте события для получениякасания при использовании [ ] (xref: Microsoft. микседреалити. набор средств. Input. Имикседреалититаучхандлер) в скрипте компонента ниже.

    2. Щелкните исправить границы и центр исправлений .

    NearInteractionTouchable Setup

  2. Для этого объекта или одного из его предков добавьте компонент скрипта, реализующийинтерфейса IMixedRealityTouchHandler. любой предок объекта с [ NearInteractionTouchable ] (xref: Microsoft. микседреалити. набор средств. Input. Неаринтерактионтаучабле) также смогут получать события указателя.

Примечание

В представлении сцены редактора с выбранным неаринтерактионтаучабле GameObject Обратите внимание на белый квадрат и стрелку. Стрелка указывает на "лицевой" сенсорной панели. Конфликтующие будет осуществляться только из этого направления. Дополнительные сведения о том, как сделать набор для противоречию от всех направлений, см. в разделе о произвольном касании. NearInteractionTouchable Gizmos

Произвольный сенсорный экран

Это полезно для случаев, когда объект игры должен быть сенсорным для всего себя. Например, это можно использовать для включения взаимодействия касания для объекта с Сфереколлидер, где весь конфликт должен быть сенсорным.

  1. в GameObject, который должен быть сенсорным, добавьте объект "" и [ NearInteractionTouchableVolume ] (xref: Microsoft. микседреалити. набор средств. Input. Неаринтерактионтаучаблеволуме).

    1. задайте события для получениякасания при использовании [ ] (xref: Microsoft. микседреалити. набор средств. Input. Имикседреалититаучхандлер) в скрипте компонента ниже.
  2. Для этого объекта или одного из его предков добавьте компонент скрипта, реализующийинтерфейса IMixedRealityTouchHandler. любой предок объекта с [ NearInteractionTouchable ] (xref: Microsoft. микседреалити. набор средств. Input. Неаринтерактионтаучабле) также смогут получать события указателя.

ИНТЕРФЕЙС Unity

  1. Добавьте или убедитесь, что в сцене есть унитюи холст .

  2. В GameObject, который должен быть сенсорным, добавьте NearInteractionTouchableUnityUI компонент.

    1. Задайте события, которые следует принимать в сенсорный ввод при использовании интерфейса в скрипте компонента ниже.
  3. Для этого объекта или одного из его предков добавьте компонент скрипта, реализующий IMixedRealityTouchHandler интерфейс. Все предки объекта с помощью смогут NearInteractionTouchableUnityUI также получать события указателя.

Важно!

Объекты могут работать не так, как ожидалось, если они расположены на перекрывающихся объектах Canvas. Чтобы обеспечить единообразие поведения, никогда не пересекать объекты Canvas в сцене.

Важно!

В NearInteractionTouchable компоненте скрипта для событий свойств NearInteractionTouchable два варианта: указатель и сенсорный ввод. Задайте события для полученияуказателя , если используется интерфейс, и задайте для параметра значение Touch , если используется интерфейс в скрипте компонента, который отвечает и обрабатывает входные события.

Пример кода Touch

В приведенном ниже коде показано неизменное поведение, которое можно присоединить к GameObject с NearInteractionTouchable вариантным компонентом и реагировать на события сенсорного ввода.

public class TouchEventsExample : MonoBehaviour, IMixedRealityTouchHandler
{
    public void OnTouchStarted(HandTrackingInputEventData eventData)
    {
        string ptrName = eventData.Pointer.PointerName;
        Debug.Log($"Touch started from {ptrName}");
    }
    public void OnTouchCompleted(HandTrackingInputEventData eventData) {}
    public void OnTouchUpdated(HandTrackingInputEventData eventData) { }
}

Примеры сценариев взаимодействия ближнего действия

События касания

Этот пример создает куб, делает его сенсорным и изменяет цвет при касании.

public static void MakeChangeColorOnTouch(GameObject target)
{
    // Add and configure the touchable
    var touchable = target.AddComponent<NearInteractionTouchableVolume>();
    touchable.EventsToReceive = TouchableEventType.Pointer;

    var material = target.GetComponent<Renderer>().material;
    // Change color on pointer down and up
    var pointerHandler = target.AddComponent<PointerHandler>();
    pointerHandler.OnPointerDown.AddListener((e) => material.color = Color.green);
    pointerHandler.OnPointerUp.AddListener((e) => material.color = Color.magenta);
}

События захвата

В приведенном ниже примере показано, как сделать GameObject перетаскиванием. Предполагает, что на нем есть объект Game.

public static void MakeNearDraggable(GameObject target)
{
    // Instantiate and add grabbable
    target.AddComponent<NearInteractionGrabbable>();

    // Add ability to drag by re-parenting to pointer object on pointer down
    var pointerHandler = target.AddComponent<PointerHandler>();
    pointerHandler.OnPointerDown.AddListener((e) =>
    {
        if (e.Pointer is SpherePointer)
        {
            target.transform.parent = ((SpherePointer)(e.Pointer)).transform;
        }
    });
    pointerHandler.OnPointerUp.AddListener((e) =>
    {
        if (e.Pointer is SpherePointer)
        {
            target.transform.parent = null;
        }
    });
}

Полезные интерфейсы API

См. также раздел