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脚本依赖于这两个设置。