在 Unity 3D 中检测长触摸

Detect long touch in Unity 3D

我正在尝试使用 Time.time 或 Time.deltatime 检测屏幕上的长按,但没有任何效果。 结果应该是这样的:在开始 TouchPhase.Stationary(或 Began)后计时器应该继续,然后在 TouchPhase.Ended 后计时器可以重置为 0。 但这里有条件检查,如果我按住传感器上的按钮少于 0.5 秒 - 做点什么。

问题:

  1. Time.Deltatime 由于某种原因,它不会为每次迭代添加一个变量,而是不断分配一个等于最后一帧时间的新值,大约在 0.02-0.1 左右

  2. Time.time不断给变量加一个值,当减去按下屏幕的时间和休假时间时,本该归零的变量,但是随着每次迭代动作,由于某种原因,该值不能在 0.0 - 0.05 之间变化,由于某种原因,计时器不断对值求和,变量不断增加

我的问题:如何跟踪我的手指在屏幕上停留了多少秒?

void TapOrLongTounch()
{
    float pressTime = 0;
    float endPressTime = 0;
    if (Input.touchCount > 0)
    {
        Touch touch = Input.GetTouch(0);
        if (touch.phase == TouchPhase.Stationary)
        {
            pressTime += Time.time;
        }

        if (touch.phase == TouchPhase.Ended)
        {
            endPressTime = Time.time - pressTime;

            if (endPressTime < 0.5f)
            {
                //Do something;
            }
            endPressTime = 0;
        }
    }
}

首先Time.time

This is the time in seconds since the start of the application [...].

你所做的基本上是每帧以指数方式增加越来越多的时间。

→ 你更想数的是Time.deltaTime

The interval in seconds from the last frame to the current one [...].

喜欢

if (touch.phase == TouchPhase.Stationary)
{
    pressTime += Time.deltaTime;
}

这样 pressTime 就会得到触摸静止的总时间(以秒为单位)。

但是 你也把它作为一个方法变量所以它总是从 0 开始!

→ 你宁愿有一个 class 字段!


然后进一步

if (touch.phase == TouchPhase.Ended)
{
    endPressTime = Time.time - pressTime;
    ...
    

没有意义/非常多余。 pressTime已经触摸静止的总时间!


一般来说,我宁愿使用 switch-case 并做例如

float pressTime = 0;

void TapOrLongTounch()
{
    if (Input.touchCount <= 0) return;
    
    var touch = Input.GetTouch(0);

    switch(touch.phase)
    {
        // Maybe you also want to reset when the touch was moved?
        //case TouchPhase.Moved:
        case TouchPhase.Began:
            pressTime = 0;
            break;

        case TouchPhase.Stationary:
            pressTime += Time.deltaTime;
            break;

        case TouchPhase.Ended:
        case TouchPhase.Canceled:
            if (pressTime < 0.5f)
            {
                //Do something;
            }
            pressTime = 0;
            break;
    }
}