使用Unity3D 2018.2
试图获得单击,双击和按住键。
存在的问题:
单次点击:有时不会注册我的单次点击
点按两次:每次我点按我的设备时都会被呼叫8次
三击:双击将被调用10次,然后三击将被调用9次
这是我的代码,如果您对C#和Unity陌生,那么我将无法完成一个如此简单的任务,请您多加帮助
private void handleTouchTypes()
{
foreach (Touch touch in Input.touches)
{
float tapBeginTime = 0;
float tapEndedTime = 0;
// Touches Began
if (touch.phase == TouchPhase.Began)
{
tapBeginTime = Time.time;
}
// Touches Ended
if (touch.phase == TouchPhase.Ended)
{
tapEndedTime = Time.time;
// Single Touch: for 0.022f of a Second
if (touch.tapCount == 1 && ((tapEndedTime - tapBeginTime) < 0.03f))
{
Debug.Log("Single Touch");
}
// Hold Touch: within half a second .5f to 1f
if (touch.phase == TouchPhase.Moved && touch.deltaPosition.magnitude < 0.02f && (tapEndedTime - tapBeginTime) >= 0.5f && (tapEndedTime - tapBeginTime) <= 1f)
{
Debug.Log("Holding Touch");
}
}
if (touch.tapCount == 2)
{
// Double Tap
Debug.Log("Double Tap");
}
if (touch.tapCount >= 3)
{
// Triple Tap
Debug.Log("3 Touches and/or more");
}
}
}
最佳答案
这里有些不对劲。
1)你在打电话
float tapBeginTime = 0;
float tapEndedTime = 0;
在每个Touch元素的开头。意思是您的支票
(tapEndedTime - tapBeginTime) < 0.03f
永远不会过去,因为
tapBeginTime
到您设置的0
点将被重置为tapEndedTime = Time.time;
。如果您想基于每次触摸来跟踪这些时间,我建议创建一个字典,将触摸的
fingerId
映射到它们的开始时间。您无需记录每次触摸的tapEndedTime
,因为它足以作为根据需要计算的局部变量。2)我对此不是100%肯定,但是您可能还需要检查
if (touch.phase == TouchPhase.Ended)
以获得准确的结果,除了if (touch.tapCount == 2)
检查。我知道我个人过去没有遇到过明确检查的问题。3)您还在
if (touch.phase == TouchPhase.Moved)
块内进行if (touch.phase == TouchPhase.Ended)
检查。我会让你知道这一点:)希望以上几点可以帮助您解决一些近期的问题。解决了这些表面问题后,建议您进一步探索优化结果代码的方法。
祝好运!
关于c# - Unity3D:C#-似乎无法正确处理单/双/保持触摸,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51316603/