Размещение касанием

TapToPlace

Размещение касанием — это компонент дальнего взаимодействия, который используется для размещения игрового объекта на поверхности. Он полезен для размещения объектов на виртуальной сетке. Для размещения объекта с помощью этого компонента требуется сочетание двух щелчков мыши и движение головой. Щелкните, чтобы начать размещение, сделайте движение головой, чтобы управлять положением объекта, и щелкните, чтобы поместить объект на сцене.

Использование размещения касанием

  1. Настройка сцены

    • Создание сцены Unity
    • Добавьте MRTK в сцену, перейдя к Mixed Reality Toolkit (Набор средств смешанной реальности)  > Add to Scene and Configure (Добавить в сцену и настроить).

    Примечание

    Размещение касанием использует щелчки, которые управляются системой ввода MRTK, но им также можно управлять без щелчков. Чтобы узнать, как, см. раздел "Настройка кода для размещения касанием" ниже.

    • Добавьте куб в сцену и измените масштаб на 0,2, а расположение — на (0; 0; 0,7).
  2. Присоедините размещение касанием к игровому объекту с помощью коллайдера.

    TapToPlaceInspector

    • При добавлении компонента размещения касанием будет также присоединен обработчик решателя. Размещение касанием происходит от класса Solver, для которого требуется обработчик решателя. Расположение объекта размещения касанием вычисляется относительно элемента TrackedTargetType в обработчике решателя. По умолчанию заголовком является TrackedTargetType, т. е. при движении головой объект следует за ней, если он выбран. TrackedTargetType также можно задать значение луча контроллера, в котором объект следует за контроллером. Первой группой свойств в инспекторе размещения касанием являются общие свойства решателя.

    Важно!

    Размещение касанием — это автономный решатель, который невозможно поставить в цепочку с другими решателями. Он не может быть помещен в цепочку, так как SolverHandler.UpdateSolvers используется для обновления расположения объекта во время его размещения.

    • Свойства размещения касанием:
      • Auto Start: если задано значение True, решатель размещения касанием начнет управлять положением игрового объекта для размещения. Объект немедленно начнется следовать за TrackedTargetType (головой или лучом контроллера). Это значение должно быть изменено перед вызовом Start() для выполнения любого действия.
      • Default Placement Distance: расстояние по умолчанию (в метрах), на которое будет помещен объект по отношению к TrackedTargetType вперед в SolverHandler. Игровой объект будет размещен на расстоянии по умолчанию, если поверхность не достигнута лучом.
      • Max Raycast Distance: максимальное расстояние (в метрах) для луча, основанное на источнике TrackedTargetType. Этот луч ищет поверхность для размещения выбранного объекта.
      • UseDefaultSurfaceNormalOffset: это свойство имеет значение True по умолчанию, что гарантирует, что размещаемый объект будет располагаться на поверхности. Если это свойство имеет значение True, то вместо любого значения, указанного для свойства SurfaceNormalOffset, будет применено стандартное смещение нормали поверхности по умолчанию. Если задано значение False, будет применено значение для SurfaceNormalOffset. Смещение нормали поверхности по умолчанию — это экстент коллайдера вдоль оси Z.
      • Surface Normal Offset: расстояние между центром игрового объекта, который нужно разместить, и нормали поверхности, если луч достигает поверхности. Это свойство применяется к объекту только в том случае, если UseDefaultSurfaceNormalOffset имеет значение False.
      • Keep Orientation Vertical: если значение равно True, игровой объект будет находиться вертикально и на одной линии с Vector3.up.
      • Rotate According to Surface: если значение равно False, то размещаемый игровой объект не будет изменять свой поворот в зависимости от удара по поверхности. Объект будет оставаться повернутым к камере, пока IsBeingPlaced имеет значение True.
      • Magnetic Surfaces: массив объектов LayerMasks для выполнения от высшего до самого низкого приоритета. Маска первого слоя, обеспечивающая попадание луча, будет использоваться для расчетов положения.
      • Debug Enabled: если значение равно True и в редакторе Unity, нормаль попадания луча будет нарисована желтым цветом. Включенная отладка полезна, если RotateAccordingToSurface имеет значение True, так как она рисует нормаль к поверхности, что визуально объясняет, почему объект установлен в текущей ориентации.
      • On Placing Started: это событие активируется один раз при выборе игрового объекта, который нужно разместить.
      • On Placing Stopped: это событие активируется один раз при отмене выбора размещенного игрового объекта.
  3. Тестирование поведения размещения касанием в редакторе

    • Нажмите кнопку воспроизведения и удерживайте пробел, чтобы отобразить руку имитации ввода.
    • Двигайте рукой до тех пор, пока куб не станет активным, и имитируйте щелчок с помощью руки, щелкнув левой кнопкой мыши.
      • Если в сцене отсутствуют коллайдеры, объект будет следовать за объектом TrackedTargetType на определенном расстоянии Default Placement Distance.
    • Объект будет следовать за перемещением TrackedTargetType после выбора. Чтобы имитировать движение головой в редакторе, нажимайте клавиши WASD. Измените поворот головы, щелкнув и удерживая правую кнопку мыши.
    • Чтобы остановить размещение объекта, щелкните еще раз. Объект не обязательно должен находиться в фокусе при нажатии для завершения размещения. Фокус необходим только для начального щелчка, запускающего процесс размещения.
    TrackedTargetType: голова (по умолчанию) TrackedTargetType: луч контроллера
    Луч контроля головой для имитации ввода при размещении касанием Луч контролера для имитации ввода при размещении касанием 2

Настройка кода для размещения касанием

Временем выбора объекта для размещения касанием также можно управлять с помощью StartPlacement() и StopPlacement() вместо того, чтобы требовать событие щелчка. Эта возможность полезна для написания тестов и предоставляет альтернативный способ размещения объекта в редакторе без использования системы ввода MRTK.

  1. Создайте пустой игровой объект.

  2. Создайте и присоедините следующий пример скрипта к пустому игровому объекту.

    using UnityEngine;
    using Microsoft.MixedReality.Toolkit.Utilities.Solvers;
    
    public class TapToPlaceInputExample : MonoBehaviour
    {
        private GameObject cube;
        private TapToPlace tapToPlace;
    
        void Start()
        {
            cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
            cube.transform.localScale = Vector3.one * 0.2f;
            cube.transform.position = Vector3.forward * 0.7f;
    
            tapToPlace = cube.AddComponent<TapToPlace>();
        }
    
        void Update()
        {
            if (Input.GetKeyDown(KeyCode.U))
            {
                tapToPlace.StartPlacement();
            }
            if (Input.GetKeyDown(KeyCode.I))
            {
                tapToPlace.StopPlacement();
            }
        }
    }
    
  3. В режиме воспроизведения нажмите клавишу U, чтобы начать размещение куба.

  4. Нажмите клавишу I, чтобы прервать размещение.

Пример сцены с размещением касанием

Пример сцены с размещением касанием состоит из четырех размещенных объектов, каждый из которых имеет разную конфигурацию. Пример сцены содержит стены, которые показывают поведение размещения поверхности, отключенное по умолчанию в иерархии. Пример сцены можно найти в пакете Unity Microsoft.MixedReality.Toolkit.Unity.Examples на странице выпуска. Расположение сцены: MRTK.Examples/Demos/Solvers/Scenes/TapToPlaceExample.unity

Пример размещения касанием

См. также