繁体   English   中英

XR Interaction Toolkit - 使用 XRRayInteractor 在 UI 元素上悬停事件

[英]XR Interaction Toolkit - Hover event on UI Elements with XRRayInteractor

我正在尝试使用 XR 交互工具包在 Oculus Quest 上制作 VR 游戏,并且我想在用户悬停 UI 元素时配置一个触觉事件。 问题是当我使用 XRRayInteractor 悬停 XRGrabInteractable 或 TeleportationArea 但不在画布上时,触觉事件起作用。 即使是简单的悬停事件(图片上的 OnHoverUI)也无法在画布上运行。 这真的很奇怪,因为我可以与 UI 元素(按钮、滑块等)进行交互。

这是我的 XRRayInteractor 的参数: XRRayInteractor 参数

我已经找到了一个没有这些参数的解决方案,但这真的很烦人。 首先,我需要访问控制器(右手和左手)。 然后,我向每个我想要触觉反馈的 UI 元素添加了一个“事件触发器”组件。 这些触发器有一个调用“OnHoverUI”函数的“Pointer Enter”事件。

void Start()
{
    var inputDevices = new List<InputDevice>();
    InputDevices.GetDevices(inputDevices);
    foreach (var device in inputDevices)
    {
        if (device.role.ToString() == "LeftHanded")
        {
             leftHand = device;
        }
        else if (device.role.ToString() == "RightHanded")
        {
            rightHand = device;
        }
    }
}

public void OnHoverUI()
{
    if (leftMenuMode) leftHand.SendHapticImpulse(0, 1f, 0.01f);
    else if (rightMenuMode) rightHand.SendHapticImpulse(0, 1f, 0.01f);
}

我真的很想使用 XRRayInteractor 的参数,但它们不适用于 UI。

有人知道为什么吗?

一个老问题,但我在尝试使用XRInteractorLineVisual.reticle.activeInHierarchy获得“XRInteractorRay 是否有效”时找到了一个简单的解决方法。

首先在层次结构中创建两个空的游戏对象,分别重命名为“leftLineVisual”和“rightLineVisual”,并禁用两个游戏对象。 在每个XRInteractorLineVisual脚本上(在每个 XR 控制器上),将标线设置为层次结构中对应的 GameObject。

然后,您可以使用XRInteractorLineVisual.reticle.activeInHierarchy获取 XR 射线的状态,例如

[SerializeField] XRInteractorLineVisual leftLineVisual;
[SerializeField] XRInteractorLineVisual rightLineVisual;

void Update() {
    if (rightLineVisual.reticle.activeInHierarchy || leftLineVisual.reticle.activeInHierarchy)
    {
        Debug.Log("One of the pointers is active");
    }
    else
    {
        Debug.Log("Both of the pointers are disabled");
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM