使用C#在Unity 3d中使用触摸旋转游戏对象

时间:2018-09-07 02:23:50

标签: c# android unity3d touch

我正在基于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);
}

感谢您提供的任何帮助或见识。

1 个答案:

答案 0 :(得分:1)

您没有跟踪fingerId

触摸时可能不会以相同的顺序存储:

  

此外,设备可以检测到帧更新之间的触摸连续性,因此可以跨帧报告一致的ID号,并用于确定特定手指的移动方式。

     

... fingerId属性可用于识别帧之间的相同触摸。

因此,当新手指触摸屏幕时,您的代码可能会看到以下内容:

  • 第一指触摸,触摸计数1,跳过代码
  • 第二根手指触摸,它是数组中的第二根手指,触摸计数2,开始处理:
    • 第一次触摸的阶段为TouchPhase.Moved
    • lastRotPosition当前为零(由于默认值或由于先前的TouchPhase.Ended而引起)
    • touch.position - lastRotPosition的计算结果为非零(发生大的旋转)

正常运行时,您会得到以下提示:

  • 第一指触摸,触摸计数1,跳过代码
  • 第二根手指触摸,它是数组中的第一根手指,触摸计数2,开始处理:
    • 第一次触摸的阶段为TouchPhase.Begin
    • lastRotPosition已更新为触摸的位置
    • touch.position - lastRotPosition的下一帧评估为接近零(发生小的旋转)