在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
函数?
谢谢!
我使用了一个计时器,在'双击速度'计时器过期后,我检测到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默认的半秒。