【问题标题】:Swipe on Oculus GO Touchpad triggers UI clicks when it shouldn't在 Oculus GO 触摸板上滑动会触发 UI 点击
【发布时间】:2019-06-04 13:56:11
【问题描述】:

使用: Unity 2018.4.1 LTS & Oculus GO

我正在使用凝视指针与 Unity UI 进行交互。

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

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

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

我的输入管理器(索引触发器与 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 发生冲突。我在这里想念什么?如何区分触发点击和触摸板滑动?!

【问题讨论】:

    标签: android unity3d virtual-reality oculus


    【解决方案1】:

    我也遇到了这个问题,我通过像这样注释掉 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;
            }
    

    【讨论】:

    • 谢谢,我已经这样做了,你是对的,它禁用了触摸板滑动点击,但是它也禁用了食指点击,我需要它来保持功能。所以我正在寻找一种将触摸板滑动和触发点击分开的方法。
    【解决方案2】:

    刚刚发现:

    katbot 的答案是将 Trigger Click 与 Touchpad swipe Click 分开的两个部分之一。

    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”来恢复它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多