1

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

我已经尝试过这些方法,但即使当指针位于按钮上时按钮显示突出显示颜色,我每次都得到错误。

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;
4

1 回答 1

4

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

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

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

对于OVRInputModule,您需要将“Ray Transform”属性设置为rightHandAnchorleftHandAnchor在您的LocalAvatar对象中。

编辑:

我忘了提到你的画布也需要OVRRaycaster添加组件。基本上会重载所有正常的OVRInputModule输入事件,因此您的画布按钮将响应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!");
    }
}

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

此外,无论您在相机装备中为您选择什么“事件蒙版” OVRPhysicsRaycaster,该层中的任何普通(非 UI)3D 对象都将检测到相同的IPointerEnterHandler事件IPointer...Handler,就像 UI 按钮一样,因此您可以使用相同的代码这些对象也是如此,而不仅仅是UI 对象。

于 2019-09-13T22:45:45.087 回答