关于Unity VR中Sliders 的问题
计算机/软件
0 260
2

我们正在为Go开发视频播放器应用。我们构建了一个简单的raycaster脚本,当用户指向UI按钮元素并拉下触发器时,它就会触发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();
            }

        }
....
    }

我们真的很希望能够使用激光指针和按钮来操作UI Sliders,但不清楚是否存在类似的事件,我们可以触发相应的行为。我们可以调用onValueChanged来改变值,但那并没有给我们真正想要的滑动行为,只有让我们知道最终的位置才可以设置新值。

有人对如何解决这个问题有好主意吗?

收藏
2021-01-21 04:14 更新 同步 •  1253
共 1 个回答
高赞 时间
0

Oculus Integration有一个名为的脚本OVRInputModule.cs。我相信这是为你正在尝试做的事而设计的。为了做到这一点,有几个步骤。

我将代码分为三个脚本:ControllerInfo,ControllerPointer和SetUITransformRay。

ControllerInfo只是一个确保脚本始终具有正确信息的类。

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 ray设置控制器。通常情况下,场景中需要有两个控制器;左边一个,右边一个。更多关于如何设置的信息,请参阅下面的完整方法。将此组件添加到画布时生成的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拖到你的场景上。将aOVRTrackedRemote拖到左右锚中。根据锚点将每个遥控器设置为左或右。

步骤2)设置画布和事件系统。

步骤3)设置正确的对象

创建3个对象;Controller Manager,Controller Pointer和OVRGazePointer。

对于OVRGazePointer,我只是快速进入了UI的示例场景,Oculus\VR场景,并在那里预先设置了OVRGazePointer。

在控制器指针上,有一个LineRenderer。这有两点,无所谓在哪里。它利用世界空间,宽度为0.005。

只有两点并利用世界空间非常重要。这是因为ControllerPointer脚本依赖于这两个设置。

收藏
2021-01-21 04:30 更新 gitvrar •  435