Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用统一手势识别器的双点击全息镜头_C#_Unity3d_Uigesturerecognizer_Gesture_Hololens - Fatal编程技术网

C# 使用统一手势识别器的双点击全息镜头

C# 使用统一手势识别器的双点击全息镜头,c#,unity3d,uigesturerecognizer,gesture,hololens,C#,Unity3d,Uigesturerecognizer,Gesture,Hololens,我试图在全息镜头中实现轻拍和双击手势。每一个单独的手势都有效,但是,当我双击时,它也会双击两次。我看到一些人使用定时器来解决这个问题,但我认为可能有一个更优雅的解决方案 因为我使用的是手势识别器,所以我有一个回调方法: private void GestureRecognizer_TappedEvent(InteractionSourceKind source, int tapCount, Ray headRay) { switch (tapCount)

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

因为我使用的是手势识别器,所以我有一个回调方法:

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

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

    }
我可以在这里做些什么吗,或者我必须使用一个单独的脚本来检查它的
Update
功能吗


谢谢

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

不利的一面是,双击要比双击鼠标花费更长的时间,因此在单次点击中增加了一些延迟,我不确定这是否是一个好的体验


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

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

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

我最终使用了计时器,因为不幸的是,我找不到更好的方法。我希望有一个更好的方法,但它似乎是相当标准的。这不起作用。它基本上用
tapCount
作为1调用它一次,然后用它作为2再次调用它。所以它不会绕过第一个。我的意思是,你的代码和我的差不多。我已经添加了双击手势设置。