如何检查 OVRInputModule 上的 Oculus Go 控制器是否点击了 GUI 对象

How to check if Oculus Go controller on OVRInputModule is clicking on GUI object or not

我是 Unity 的初学者,我一直在尝试为 Oculus go 制作一个应用程序。所以我实现了 Oculus go Controller 的工作和屏幕上的一些按钮。我可以单击按钮并调用连接到按钮的功能。 我想做的是当控制器点击不是 UI 按钮时触发一些动作。

我已经尝试过这些方法,但每次都得到 false,即使指针在按钮上时按钮显示高亮颜色也是如此。

Physics.Raycast(..)
EventSystem.current.IsPointerOverGameObject
Ray laserPointer = new Ray(rightHandAnchor.position, rightHandAnchor.forward);
RaycastHit hit;
bool hitOrNot = Physics.Raycast(laserPointer, out hit, maxRayDistance);

bool hitOrNot = EventSystem.current.IsPointerOverGameObject;

您需要在场景的 EventSystem 对象中包含 OVRInputModule(您可以删除 "Standard Input Module".

这将允许激光指示器使用类似标准的事件与 UI 系统连接。

另一件需要注意的事情是,为了让您的激光指示器与 普通游戏对象(非 UI)交互,您 必须将 OVRPhysicsRaycaster 添加到场景中的 OVRCameraRig 对象。

对于 OVRInputModule,您需要将 "Ray Transform" 属性 设置为 LocalAvatar 对象中的 rightHandAnchorleftHandAnchor .

编辑:

我忘了提到您的 canvas(es) 也需要添加 OVRRaycaster 组件。 OVRInputModule 将基本上使所有正常输入事件过载,因此您的 canvas 按钮将响应 IPointerEnterHandler 事件,就像您使用鼠标时一样。

using UnityEngine;
using UnityEngine.EventSystems;

public class YourButton : MonoBehavior, IPointerEnterHandler, IPointerClickHandler
{
    public void OnPointerEnter(PointerEventData eventData)
    {
        Debug.Log("Raycast hit!");
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log("Clicked!");
    }
}

有了所有这些,除非您有特殊需要,否则您真的不需要在脚本中手动进行光线投射。

此外,无论 "Event Mask" 你 select 在相机装备中的 OVRPhysicsRaycaster,该层中的任何正常(非 UI)3D 对象都会检测相同的 IPointerEnterHandlerIPointer...Handler 事件就像 UI 按钮一样,因此您也可以对这些对象使用相同的代码,而不是 只是 UI 个对象。