Слайдеры в Unity VR - PullRequest
       13

Слайдеры в Unity VR

0 голосов
/ 08 июня 2018

Мы работаем над приложением видеоплеера для Go.Мы создали простой скрипт raycaster для запуска событий onClick, когда пользователь указывает на элемент пользовательского интерфейса и нажимает на триггер:

bool triggerPulled = OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger);
    if (Physics.Raycast(transform.position, transform.forward, out hit, 1000))
    {

        if ( triggerPulled )
        {

            // if we hit a button
            Button button = hit.transform.gameObject.GetComponent<Button>();

            if (button != null)
            {
                button.onClick.Invoke();
            }

        }
....
    }

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

У кого-нибудь есть хорошие идеи, как к этому подойти?

Ответы [ 3 ]

0 голосов
/ 15 июня 2018

Интеграция Oculus имеет скрипт с именем OVRInputModule.cs.Я считаю, что это предназначено для того, что вы пытаетесь сделать.Для этого есть несколько шагов.GIF результата.

enter image description here

Чтобы добиться этого, я разделил код на три сценария;ControllerInfo, ControllerPointer и SetUITransformRay.

Информация контроллера - это просто класс, который гарантирует, что скрипты всегда имеют правильную информацию.

using UnityEngine;
using static OVRInput;

public class ControllerInfo : MonoBehaviour {
    [SerializeField]
    private Transform trackingSpace;
    public static Transform TRACKING_SPACE;
    public static Controller CONTROLLER;
    public static GameObject CONTROLLER_DATA_FOR_RAYS;

    private void Start () {
        TRACKING_SPACE = trackingSpace;
    }

    private void Update()
    {
        CONTROLLER = ((GetConnectedControllers() & (Controller.LTrackedRemote | Controller.RTrackedRemote) & Controller.LTrackedRemote) != Controller.None) ? Controller.LTrackedRemote : Controller.RTrackedRemote;
    }
}

ControllerPointer рисуетлиния от контроллера.Это представляет способ, которым контроллер указывает.Добавьте это к LineRenderer.

using UnityEngine;
using UnityEngine.EventSystems;
using static OVRInput;

[RequireComponent(typeof(LineRenderer))]
public class ControllerPointer : MonoBehaviour
{
    [SerializeField]
    private SetUITransformRay uiRays;
    private LineRenderer pointerLine;
    private GameObject tempPointerVals;

    private void Start()
    {
        tempPointerVals = new GameObject();
        tempPointerVals.transform.parent = transform;
        tempPointerVals.name = "tempPointerVals";
        pointerLine = gameObject.GetComponent<LineRenderer>();
        pointerLine.useWorldSpace = true;

        ControllerInfo.CONTROLLER_DATA_FOR_RAYS = tempPointerVals;
        uiRays.SetUIRays();
    }

    private void LateUpdate()
    {
        Quaternion rotation = GetLocalControllerRotation(ControllerInfo.CONTROLLER);
        Vector3 position = GetLocalControllerPosition(ControllerInfo.CONTROLLER);
        Vector3 pointerOrigin = ControllerInfo.TRACKING_SPACE.position + position;
        Vector3 pointerProjectedOrientation = ControllerInfo.TRACKING_SPACE.position + (rotation * Vector3.forward);
        PointerEventData pointerData = new PointerEventData(EventSystem.current);
        Vector3 pointerDrawStart = pointerOrigin - pointerProjectedOrientation * 0.05f;
        Vector3 pointerDrawEnd = pointerOrigin + pointerProjectedOrientation * 500.0f;
        pointerLine.SetPosition(0, pointerDrawStart);
        pointerLine.SetPosition(1, pointerDrawEnd);

        tempPointerVals.transform.position = pointerDrawStart;
        tempPointerVals.transform.rotation = rotation;
    }
}

SetUITransformRay автоматически установит контроллер для луча OVRInputModule.Требуется, как обычно, у вас есть два контроллера в вашей сцене;один для левого и один для правого.Смотрите полный метод ниже для получения дополнительной информации о том, как настроить это.Добавьте этот компонент в EventSystem, который генерируется при добавлении холста.

using UnityEngine;
using UnityEngine.EventSystems;

public class SetUITransformRay : MonoBehaviour
{
    [SerializeField]
    private OVRInputModule inputModule;
    [SerializeField]
    private OVRGazePointer gazePointer;

    public void SetUIRays()
    {
        inputModule.rayTransform = ControllerInfo.CONTROLLER_DATA_FOR_RAYS.transform;
        gazePointer.rayTransform = ControllerInfo.CONTROLLER_DATA_FOR_RAYS.transform;
    }
}

Шаги для использования

Шаг 1) Настройка сцены

Импорт пакета интеграции Oculus.Перетащите OVRCameraRig на свою сцену.Перетащите OVRTrackedRemote в левый и правый якоря.Установите каждый пульт дистанционного управления влево или вправо в зависимости от привязки.

enter image description here

Шаг 2) Настройте свой холст и систему событий.

ВклCanvas,

enter image description here

В системе событий,

enter image description here

Шаг3) Настройте правильные объекты

Создайте 3 объекта;Controller Manager, Controller Pointer и OVRGazePointer.

Для OVRGazePointer я просто быстро вошел в пример сцены для пользовательского интерфейса, Oculus\VR\Scenes, и подготовил там OVRGazePointer.

На указателе контроллера есть LineRenderer.Это имеет два баллов, не важно где. использует мировое пространство .Он имеет ширину 0,005.

Только с двумя точками, и использование мирового пространства очень важно .Это связано с тем, что ControllerPointer скрипт полагается на то, что эти два настроены таким образом.

enter image description here

0 голосов
/ 06 июля 2018

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

https://developer.oculus.com/blog/easy-controller-selection/

0 голосов
/ 09 июня 2018

Я не знаю, поможет ли это, но я настоятельно рекомендую проверить эти два SDK:

Первый - GoogleVR SDK , вы можете проверить там систему событий и как они реализованыих система радиопередачи и объединила ее с единицей.

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

...