Unity3D:C#-似乎无法正确处理单/双/保持触摸

时间:2018-07-13 01:43:05

标签: c# android ios unity3d touch

使用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 个答案:

答案 0 :(得分:1)

这里有一些不同的东西。

1)您正在致电

httpServer := &http.Server{
    Handler: newHandler123(),
}

l, err := net.Listen("tcp", ":8080")
if err != nil {
    log.Fatal(err)
}

err = httpServer.Serve(l)
if err != nil {
    log.Fatal(err)
}
每个触摸元素开头的

。表示您要支票

    float tapBeginTime = 0;
    float tapEndedTime = 0;

将永远不会过去,因为在您设置(tapEndedTime - tapBeginTime) < 0.03f 的那一刻,tapBeginTime已被重置为0

如果您想基于每次触摸跟踪这些时间,我建议创建一个字典,将触摸的tapEndedTime = Time.time;映射到它们的开始时间。您无需记录每次触摸的fingerId,因为它足以作为根据需要计算的局部变量。

2)我对此不是100%肯定,但是您可能还需要检查tapEndedTime之外的if (touch.phase == TouchPhase.Ended)以获得准确的结果。我知道我个人以前没有明确检查过问题。

3)您还正在if (touch.tapCount == 2)块的if (touch.phase == TouchPhase.Moved)内部检查 。我会让你知道这一点:)

我希望这些观点能帮助您解决一些眼前的问题。解决了这些表面问题后,建议您进一步探索优化最终代码的方法。 祝你好运!