【问题标题】:Double tap hololens using GestureRecogniser in Unity在 Unity 中使用 GestureRecogniser 双击 hololens
【发布时间】:2016-10-04 09:15:40
【问题描述】:

我正在尝试在 hololens 中实现点击和双击手势。每个单独的手势都有效,但是,当我双击时,它也会单击两次。我看到一些使用计时器来解决它,但我认为可能有更优雅的解决方案。

由于我使用的是 GestureRecogniser,所以我有一个回调方法:

private void GestureRecognizer_TappedEvent(InteractionSourceKind source, int tapCount, Ray headRay)
    {

        switch (tapCount)
        {
            case 1:
                OnTap();
                break;
            case 2:
                OnDoubleTap();
                break;
        }

    }

我可以在这里做任何事情,还是我必须求助于一个单独的脚本来检查它的Update 函数?

谢谢!

【问题讨论】:

    标签: c# unity3d uigesturerecognizer gesture hololens


    【解决方案1】:

    我使用了一个计时器,在“双击速度”计时器到期后,我单击单次或检测到第二次单击,然后我双击。

    缺点是双击比鼠标双击花费的时间更长,因此会增加单击的一些延迟,我不确定这是否是一种好的体验。

    这有点旧,所以我很好奇你最后做了什么。

    【讨论】:

    • 我最终还是使用了计时器,因为我找不到更好的方法,很遗憾。我希望有更好的方法,但它似乎是相当标准的。
    【解决方案2】:

    有一种方法可以避免使用计时器,因为双击手势是可识别的。

    void Start()
    {
        // get a new gesture recognizer
        recognizer = new GestureRecognizer();
        // set up to receive both tap and double tap events
        recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.DoubleTap);
        // see https://docs.unity3d.com/550/Documentation/ScriptReference/VR.WSA.Input.GestureRecognizer.TappedEventDelegate.html 
        recognizer.TappedEvent += (source, tapCount, ray) =>
        {
            if (tapCount == 1)
            {
                Debug.Log("Tap");
            }
            else if (tapCount == 2)
            {
                Debug.Log("Double Tap");
            }
        };
        recognizer.StartCapturingGestures();
    }
    

    【讨论】:

    • 那行不通。它基本上以tapCount 为 1 调用它一次,然后以 2 再次调用它。所以它不会绕过第一个。我的意思是,您的代码与我的代码几乎相同。我已经添加了 DoubleTap 手势设置。
    【解决方案3】:

    由于对此仍然没有完整的(有效的)答案,而且我在其他地方找不到答案,因此这就是我修复它的方法。类似于使用计时器,但在我看来稍微好一点。

    const float DELAY = .5f;
    
    void Start()
    {
        recognizer = new GestureRecognizer();
        recognizer.StartCapturingGestures();
    
        recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.DoubleTap);
        recognizer.TappedEvent += (source, tapCount, ray) =>
        {
            if (tapCount == 1)
                Invoke("SingleTap", DELAY);
            else if (tapCount == 2)
            {
                CancelInvoke("SingleTap");
                DoubleTap();
            }
        };
    }
    
    void SingleTap()
    {
        Debug.Log("Single Tap")
    }
    
    void DoubleTap()
    {
        Debug.Log("Double Tap")
    }
    

    注意:我找不到识别双击的延迟,所以我认为这是 Windows 默认的半秒。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-08
      • 2018-09-08
      • 1970-01-01
      • 2019-10-26
      • 2018-12-31
      • 2018-05-01
      • 2020-02-23
      • 1970-01-01
      相关资源
      最近更新 更多