Интеграция Oculus имеет скрипт с именем OVRInputModule.cs
.Я считаю, что это предназначено для того, что вы пытаетесь сделать.Для этого есть несколько шагов.GIF результата.
Чтобы добиться этого, я разделил код на три сценария;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
в левый и правый якоря.Установите каждый пульт дистанционного управления влево или вправо в зависимости от привязки.
Шаг 2) Настройте свой холст и систему событий.
ВклCanvas,
В системе событий,
Шаг3) Настройте правильные объекты
Создайте 3 объекта;Controller Manager
, Controller Pointer
и OVRGazePointer
.
Для OVRGazePointer
я просто быстро вошел в пример сцены для пользовательского интерфейса, Oculus\VR\Scenes
, и подготовил там OVRGazePointer
.
На указателе контроллера есть LineRenderer
.Это имеет два баллов, не важно где. использует мировое пространство .Он имеет ширину 0,005.
Только с двумя точками, и использование мирового пространства очень важно .Это связано с тем, что ControllerPointer
скрипт полагается на то, что эти два настроены таким образом.