使用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/

10-12 02:07