在Unity中使用手势识别器双击全息透镜

本文关键字:双击 全息 手势识别 Unity | 更新日期: 2023-09-27 18:11:20

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

因为我正在使用手势识别器,我有一个回调方法:

private void GestureRecognizer_TappedEvent(InteractionSourceKind source, int tapCount, Ray headRay)
    {
        switch (tapCount)
        {
            case 1:
                OnTap();
                break;
            case 2:
                OnDoubleTap();
                break;
        }
    }

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

谢谢!

在Unity中使用手势识别器双击全息透镜

我使用了一个计时器,在'双击速度'计时器过期后,我检测到SingleTap或第二次点击,然后我双击。

缺点是双击比双击鼠标需要更长的时间,因此增加了一些延迟到单点,我不确定这是一个好的体验。

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

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

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();
}

由于这个问题仍然没有完整的(有效的)答案,而且我在其他地方找不到,下面是我如何修复它。与使用计时器类似,但在我看来稍微好一点。

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默认的半秒。