我正在基于2指触摸旋转GameObject。我的旋转工作正常,但是遇到一个奇怪的问题,有时我会用两根手指触摸以开始旋转,但是一旦触摸屏幕,对象就会立即旋转。它何时执行似乎是随机的,并且轮换也似乎是随机的。我以为触摸会触发基于最后一个位置的旋转,但是我的代码应该重新设置开始位置。
触摸代码位于附加到对象的脚本中,可以旋转,因此全部都在一个文件中。
这是代码。
在Update方法中,我检测到它支持触摸,并尝试调用“ HandleTouch()”
void Update()
{
if (Input.touchSupported)
HandleTouch();
else
HandleMouse();
}
HandleTouch方法
private void HandleTouch()
{
if (Input.touchCount < 2) return;
switch (Input.touchCount)
{
case 2:
Touch touch = Input.GetTouch(0);
if (touch.phase == TouchPhase.Began)
{
lastRotPosition = touch.position;
}
else if (touch.phase == TouchPhase.Moved)
{
Vector3 offset = touch.position - lastRotPosition;
lastRotPosition = touch.position;
RotateCamera(offset.x * RotateSpeedTouch, offset.y * RotateSpeedTouch);
}
else if (touch.phase == TouchPhase.Ended)
{
lastRotPosition = new Vector2();
}
break;
}
}
这是旋转GameObject的方法
void RotateCamera(float x, float y)
{
float rotX = x * rotateSpeed * Mathf.Deg2Rad;
float rotY = y * rotateSpeed * Mathf.Deg2Rad;
transform.Rotate(Vector3.up, rotX);
transform.Rotate(Vector3.right, -rotY);
}
感谢您提供的任何帮助或见识。
答案 0 :(得分:1)
fingerId
触摸时可能不会以相同的顺序存储:
此外,设备可以检测到帧更新之间的触摸连续性,因此可以跨帧报告一致的ID号,并用于确定特定手指的移动方式。
...
fingerId
属性可用于识别帧之间的相同触摸。
因此,当新手指触摸屏幕时,您的代码可能会看到以下内容:
TouchPhase.Moved
lastRotPosition
当前为零(由于默认值或由于先前的TouchPhase.Ended
而引起)touch.position - lastRotPosition
的计算结果为非零(发生大的旋转)正常运行时,您会得到以下提示:
TouchPhase.Begin
lastRotPosition
已更新为触摸的位置touch.position - lastRotPosition
的下一帧评估为接近零(发生小的旋转)