Впервые на русском: Документация Unity для разработчиков. Примеры взаимодействия в VRSampleScenes. Взаимодействие в Тире 180 и Тире 360

Продолжаем публикацию эксклюзивной информации для разработчиков Unity. Новый раздел посвящён взаимодействиям в Тире 180 и Тире 360.

Документация Unity для разработчиков:

  1. Обзор виртуальной реальности
  2. Проекты сэмплов для виртуальной реальности
  3. Начало работы с VR Development. Основы
  4. Начало работы с VR Development. Создание первого проекта виртуальной реальности
  5. Начало работы с VR Development. Полезная информация для разработки виртуальной реальности
  6. Обзор VREyeRaycaster, VRInput и VRInteractiveItem
  7. Обзор SelectionRadial и SelectionSlider
  8. Примеры взаимодействия в VRSampleScenes. Взаимодействия в Menu scene
  9. Примеры взаимодействия в VRSampleScenes. Взаимодействие в Лабиринте
  10. Примеры взаимодействия в VRSampleScenes. Взаимодействие в Тире 180 и Тире 360

В сэмплах имеется две игры-шутера для стрельбы: галерея – с видом в 180 градусов, и стрельба на арене – с видом в 360 градусов, где игрок окружен потенциальными мишенями в окружающей среде, что выглядит как «Церебро» из «Людей Икс».

Каждая из целей в играх имеет коллайдер, VRInteractiveItem и ShootingTarget.

Компонент ShootingTarget подписывается на событие OnDown на VRInteractiveItem, чтобы определить, была ли цель поражена. Этот метод подходит для мгновенных выстрелов; для игры с использованием снарядов нам понадобится реализовать другое решение.

Теперь вы должны ознакомиться с основными компонентами взаимодействия виртуальной реальности и с тем, как они используются в проекте VR Samples. Давайте теперь обсудим, как взгляд и сетка работают в этих сэмплах.

Взгляд

Процесс оглядывания, с помощью которого пользователь производит поиск, очень важно в виртуальной реальности – он позволяет пользователю взаимодействовать с объектом, запускать анимацию или, например, выпускать пулю в цель. Мы называет это «взглядом», и этот термин мы будем использовать в наших статьях о виртуальной реальности.

Поскольку большинство шлемов виртуальной реальности ещё не поддерживает отслеживание движения глаз, мы можем только оценить взгляд пользователя. Поскольку искажения на линзах заставляют пользователя обычно смотреть просто прямо вперед, есть простое решение этого. Как показано в обзоре, нам нужно только бросить луч вперёд от центра камеры и найти то, с чем столкнулся луч. Конечно, это означает, что всё, что может быть на пути луча (или взаимодействовать с ним через взгляд), должно иметь прилагаемый компонент коллайдера.

Сетка

Сетка может помочь указать центр взгляда пользователя. Стиль сетки может быть простой точкой или, возможно, перекрестием, в зависимости от вашего проекта.

В традиционных 3D-играх сетка часто устанавливается в фиксированной точке пространства; Часто в центре экрана. Позиционирование сетки в виртуальной реальности является более сложным: поскольку пользователь смотрит вокруг среды виртуальной реальности, глаза будут сходиться на объектах ближе к камере. Если сетка находится в фиксированном положении, тогда пользователь увидит её раздвоение: вы можете имитировать это, держа палец перед вашими глазами и фокусируясь на объектах ближе и дальше – если вы сосредоточитесь на своем пальце, фон удвоится, и наоборот. Это известно как вергенция.

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

Простое позиционирование сетки в этом месте в пространстве будет означать, что сетка будет маленькой на больших расстояниях и большой, когда она приближается. Чтобы сетка оставалась того же размера, независимо от расстояния, мы должны масштабировать её с расстоянием до камеры.

Чтобы проиллюстрировать это, вот несколько примеров сетки на разных расстояниях и масштабах, взятых из Examples/Reticle scene.

Сетка, расположенная на объекте, который близко к камере:

Сетка, расположенная на объекте, который дальше:

Сетка, расположенная на большом расстоянии:

Из-за масштабирования и позиционирования, которые мы используем, сетка кажется одинаковой для пользователя независимо от расстояния.

Когда нет объекта в фокусе, мы просто устанавливаем сетку с заранее заданным расстоянием. В наружной среде это может быть прямо перед камерой, если это в помещении, это может быть намного ближе.

Рендеринг сетки над другими объектами игры

Если сетка размещена в том же положении, что и объект, то сетка может оказаться и на соседних объектах:

Чтобы решить эту проблему, нам необходимо обеспечить то, чтобы сетка была наложена поверх всего в области зрения. С сэмплами мы предоставили шейдер, основанный на существующем шейдере Unity UI/Unlit/Text, который называется UIOverlay.shader. При выборе шейдера для материала его можно найти в разделе UI/Overlay.

Это работает как с элементами UI, так и с текстом, и сетка будет рисоваться поверх других объектов сцены:

Выравнивание сетки на игровых объектах в сцене

Наконец, нам может потребоваться, чтобы поворот сетки соответствовал нормали объекта, на который он попал. Мы можем сделать это, используя RaycastHit.normal:

 

public void SetPosition (RaycastHit hit)

{

m_ReticleTransform.position = hit.point;

m_ReticleTransform.localScale = m_OriginalScale * hit.distance;

 

// If the reticle should use the normal of what has been hit…

if (m_UseNormal)

// … set it’s rotation based on it’s forward vector facing along the normal.

m_ReticleTransform.rotation = Quaternion.FromToRotation (Vector3.forward, hit.normal);

else

// However if it isn’t using the normal then it’s local rotation should be as it was originally.

m_ReticleTransform.localRotation = m_OriginalRotation;

}

 

Вы можете увидеть это в действии на сцене Лабиринта.

Вот сетка, соответствующая нормали стены:

Вот сетка, соответствующая нормалям пола:

Мы также включили пример скрипта сетки. Это работает с VREyeRaycaster для того, чтобы расположить сетку в правильной точке сцены и, при необходимости, соответствовать нормали объекта, который был задействован.

Все вышесказанное можно просмотреть в сцене Сетки в VRSampleScenes/Scenes/Examples/.

 

Примечание: Данный материал представлен для ознакомления, при перепечатывании ссылка на оригинал обязательна. Если вы хотите принять участие в помощи проекту, пишите на editor@vrgeek.ru

Если вы разработчик и вы хотите продолжить свою карьеру в лучших компаниях России, пишите на editor@vrgeek.ru с пометкой «Работа мечты», и мы поможем вам с этим.