2

我正在尝试使用 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。

有人知道为什么吗?

4

1 回答 1

0

一个老问题,但我在尝试使用XRInteractorLineVisual.reticle.activeInHierarchy.

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

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

[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");
    }
}
于 2022-01-27T23:50:21.350 回答