在 Oculus GO 触摸板上滑动会触发 UI 次不该点击的点击

Swipe on Oculus GO Touchpad triggers UI clicks when it shouldn't

使用: 统一 2018.4.1 LTS & Oculus GO

我正在使用注视点与 Unity 交互 UI。

这应该在您扣动扳机时发生,这正是我在脚本中定义的方式:在 go-controller 的触摸板上向左或向右滑动,但也会触发点击。我自己没有定义它,这只是发生的事情,我不知道如何解决它。

我发现并摆弄了 this thread and this thread 中提出的解决方案。

但是,none 这些解决方案为我提供了一种方法来摆脱这些滑动点击,同时保持索引触发点击。

我的输入管理器(与 UI 的索引触发器交互似乎发生在 OVRInputModule 中):


 private void Update()
        {

            if (OVRInput.GetDown(OVRInput.Button.PrimaryTouchpad) || OVRInput.GetDown(OVRInput.Button.Two))
            {
                ToggleVidInterface();

            }

            if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger))
            {
                StartCoroutine(TouchpadCounter()); 
            }

        }

        IEnumerator TouchpadCounter()
        {
            int secondsForCounting = 2;
            float startTime = Time.time;
            int touchCount = 0;

            while (Time.time - startTime <= secondsForCounting && OVRInput.Get(OVRInput.Button.PrimaryIndexTrigger))
            {
                if (OVRInput.GetDown(OVRInput.Button.PrimaryTouchpad))
                {
                    touchCount++;
                    Debug.Log("touchCount for Admin Menue: " + touchCount);
                }

                if (touchCount >= 3)
                {
                    ActivateAdminMenue();
                }

                yield return null;
            }

            yield return null;
        }

部分OVRInputModule(不知道对不对):

        /// <summary>
        /// Get state of button corresponding to gaze pointer
        /// </summary>
        /// <returns></returns>
        virtual protected PointerEventData.FramePressState GetGazeButtonState()
        {
            var pressed = Input.GetKeyDown(gazeClickKey) || OVRInput.GetDown(joyPadClickButton);
            var released = Input.GetKeyUp(gazeClickKey) || OVRInput.GetUp(joyPadClickButton);



#if UNITY_ANDROID && !UNITY_EDITOR
            // On Gear VR the mouse button events correspond to touch pad events. We only use these as gaze pointer clicks
            // on Gear VR because on PC the mouse clicks are used for actual mouse pointer interactions.
            pressed |= Input.GetMouseButtonDown(0);
            released |= Input.GetMouseButtonUp(0);
#endif



            if (pressed && released)
                return PointerEventData.FramePressState.PressedAndReleased;
            if (pressed)
                return PointerEventData.FramePressState.Pressed;
            if (released)
                return PointerEventData.FramePressState.Released;
            return PointerEventData.FramePressState.NotChanged;
        }

与 Android if 条件混淆只是启用或禁用整体点击(触发器和触摸板)。我在这里错过了什么?如何区分触发点击和触摸板滑动?!

我也 运行 遇到了这个问题,我通过注释掉 OVRInputModule.GetGazeButtonState() 的一部分解决了这个问题:

        virtual protected PointerEventData.FramePressState GetGazeButtonState()
        {
            var pressed = Input.GetKeyDown(gazeClickKey) || OVRInput.GetDown(joyPadClickButton);
            var released = Input.GetKeyUp(gazeClickKey) || OVRInput.GetUp(joyPadClickButton);

//  Comment out or remove this block, because it causes touchpad touch events to register as click events.
// #if UNITY_ANDROID && !UNITY_EDITOR
//             // On Gear VR the mouse button events correspond to touch pad events. We only use these as gaze pointer clicks
//             // on Gear VR because on PC the mouse clicks are used for actual mouse pointer interactions.
//             pressed |= Input.GetMouseButtonDown(0);
//             released |= Input.GetMouseButtonUp(0);
// #endif

            if (pressed && released)
                return PointerEventData.FramePressState.PressedAndReleased;
            if (pressed)
                return PointerEventData.FramePressState.Pressed;
            if (released)
                return PointerEventData.FramePressState.Released;
            return PointerEventData.FramePressState.NotChanged;
        }

刚刚发现:

katbot 的答案是将触发点击与触摸板滑动点击分开的两个部分之一。

先在OVRInputModule.cs中注释掉,像这样:

virtual protected PointerEventData.FramePressState GetGazeButtonState()
{
    var pressed = Input.GetKeyDown(gazeClickKey) || OVRInput.GetDown(joyPadClickButton);
    var released = Input.GetKeyUp(gazeClickKey) || OVRInput.GetUp(joyPadClickButton);

    //  Comment out or remove this block, because it causes touchpad touch events to register as click events.
// #if UNITY_ANDROID && !UNITY_EDITOR
    // On Gear VR the mouse button events correspond to touch pad events. We only use these as gaze pointer clicks
    // on Gear VR because on PC the mouse clicks are used for actual mouse pointer interactions.
    //pressed |= Input.GetMouseButtonDown(0);
    //released |= Input.GetMouseButtonUp(0);
// #endif

    if (pressed && released)
            return PointerEventData.FramePressState.PressedAndReleased;
    if (pressed)
            return PointerEventData.FramePressState.Pressed;
    if (released)
            return PointerEventData.FramePressState.Released;
    return PointerEventData.FramePressState.NotChanged;
}

然后转到 UnityEditor 中的 OVRInputModule。在“Joy Pad Click Button”下,现在选择“Primary Index Trigger”。现在你已经通过注释掉 Input.GetMouseButtonDown(0) 东西来杀死触摸板滑动点击,这也会杀死正常的触发器点击。但是我们可以通过将它们链接到 Unity 编辑器中的 "Joy Pad Click Button" 来恢复它们。