2016-10-04 51 views
3

我試圖在hololens中實現雙擊和雙擊手勢。然而,當我雙擊時,每個單獨的手勢都起作用,它也單擊兩次。我看到一些使用計時器來解決它,但我認爲可能會有更優雅的解決方案。雙擊hololens在Unity中使用手勢識別器

由於我使用的是GestureRecogniser,我有一個回調方法:

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

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

    } 

我可以做任何事情,在這裏,否則我將不得不訴諸於具有獨立的腳本,它會檢查它的Update功能?

謝謝!

回答

0

我使用了一個計時器,在'雙擊速度'計時器過期後,我檢測到SingleTap或第二次點擊,然後是I DoubleTap。

不利的一面是雙擊需要比雙擊鼠標更長的時間,因此在單擊中增加了一些延遲,我不確定是否是一種很好的體驗。

這有點舊了,所以我很好奇你最終做了什麼。

+0

不幸的是,我最終使用了定時器,因爲我找不到更好的方法。我希望有一個更好的方式,但它似乎是相當標準的。 – Gentatsu

0

有一種方法可以避免使用定時器,因爲雙擊手勢是可識別的。

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

這不起作用。它基本上用'tapCount'作爲1來調用它,然後再用它作爲2.所以它不會繞過第一個。我的意思是,你的代碼和我的代碼非常相似。我已經添加了DoubleTap手勢設置。 – Gentatsu

0

由於還沒有完成(工作)回答了這個,我無法找到一個別的地方,這裏就是我的固定它。類似於使用計時器,但在我看來略好一些。

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