在 Unity 3D 中检测长触摸
Detect long touch in Unity 3D
我正在尝试使用 Time.time 或 Time.deltatime 检测屏幕上的长按,但没有任何效果。
结果应该是这样的:在开始 TouchPhase.Stationary(或 Began)后计时器应该继续,然后在 TouchPhase.Ended 后计时器可以重置为 0。
但这里有条件检查,如果我按住传感器上的按钮少于 0.5 秒 - 做点什么。
问题:
Time.Deltatime 由于某种原因,它不会为每次迭代添加一个变量,而是不断分配一个等于最后一帧时间的新值,大约在 0.02-0.1 左右
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;
}
}
我正在尝试使用 Time.time 或 Time.deltatime 检测屏幕上的长按,但没有任何效果。 结果应该是这样的:在开始 TouchPhase.Stationary(或 Began)后计时器应该继续,然后在 TouchPhase.Ended 后计时器可以重置为 0。 但这里有条件检查,如果我按住传感器上的按钮少于 0.5 秒 - 做点什么。
问题:
Time.Deltatime 由于某种原因,它不会为每次迭代添加一个变量,而是不断分配一个等于最后一帧时间的新值,大约在 0.02-0.1 左右
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;
}
}