C# 如何检查OVRInputModule上的Oculus Go控制器是否正在单击GUI对象

C# 如何检查OVRInputModule上的Oculus Go控制器是否正在单击GUI对象,c#,unity3d,oculusgo,C#,Unity3d,Oculusgo,我是Unity的初学者,我一直在尝试为Oculus go制作一个应用程序。所以我实现了Oculus go控制器和屏幕上的一些按钮。我可以单击按钮并调用连接到按钮的函数。 我想做的是当控制器点击非UI按钮时触发一些动作 我尝试过这些方法,但每次都会出错,即使指针在按钮上时按钮显示高亮颜色 Physics.Raycast(..) EventSystem.current.IsPointerOverGameObject 及 您需要在场景的EventSystem对象中设置OVRInputModule(您

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

我尝试过这些方法,但每次都会出错,即使指针在按钮上时按钮显示高亮颜色

Physics.Raycast(..)
EventSystem.current.IsPointerOverGameObject


您需要在场景的
EventSystem
对象中设置
OVRInputModule
(您可以删除“标准输入模块”)

这将允许激光指针使用类似标准事件与
UI
系统接口

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

对于
OVRInputModule
,您需要在
LocalAvatar
对象中将“光线变换”属性设置为
rightHandAnchor
leftHandAnchor

编辑:

我忘了提到您的画布还需要添加
OVRRaycaster
组件。
OVRInputModule
基本上会重载所有正常的输入事件,因此您的画布按钮将响应
ipInterenterHandler
事件,就像您使用鼠标时一样

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!");
    }
}
有了所有这些,你不应该真的需要在脚本中手动进行光线投射,除非你有特殊需要


此外,无论您为摄影机装备中的
OVRPhysicsRaycaster
选择什么“事件遮罩”,任何正常(非UI)该层中的3D对象将像UI按钮一样检测相同的
iPointerHandler
IPointer…Handler
事件,因此您也可以对这些对象使用相同的代码,而不仅仅是UI对象。

我已经添加了您建议的所有内容。我可以单击UI按钮。此外,我还可以获取3D对象的名称。但是当激光在对象上时,我无法获取UI对象的名称。请确保也将
OVRRaycaster
添加到画布上。我试图检测激光指针何时只是悬停在按钮上,但不知何故我无法检测。我需要按下触发器按钮以获取调用的方法。此外,它们都会在同一时间被调用我。这里的更多细节:@DiscreteHa你找到解决方案了吗?我想我们也有同样的问题
bool hitOrNot = EventSystem.current.IsPointerOverGameObject;
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!");
    }
}