2016-10-04 3 views
3

나는 hololens에서 탭 및 두 번 탭 동작을 구현하려고합니다. 그러나 각각의 개인 제스처는 작동하지만 두 번 탭하면 한 번 두 번 두 번 두드립니다. 타이머를 사용하여 문제를 해결하는 몇 가지 방법을 보았지만 좀 더 세련된 솔루션이있을 것으로 생각했습니다.Unity에서 GestureRecogniser를 사용하여 두 번 탭 홀로 인

나는 GestureRecogniser을 사용하고 있기 때문에, 내가 콜백 방법이 있습니다

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

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

    } 

내가 여기에 아무것도 할 수있다, 또는 나는 그것이 Update 기능의에 확인하는 별도의 스크립트를 가지고에 의존해야 할 것이다?

감사합니다.

답변

0

타이머를 사용하고 '더블 클릭 속도'타이머가 만료 된 후 I SingleTap 또는 두 번째 클릭이 감지 된 후 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 기본값 인 0.5 초라고 가정했습니다.