Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C在Unity 3d中使用触摸旋转游戏对象_C#_Android_Unity3d_Touch - Fatal编程技术网

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

C# 使用C在Unity 3d中使用触摸旋转游戏对象,c#,android,unity3d,touch,C#,Android,Unity3d,Touch,我正在旋转一个基于2个手指触摸的游戏对象。我的旋转工作正常,但我遇到了一个奇怪的问题,有时我会用两个手指触摸开始旋转,但只要我触摸屏幕,物体就会立即旋转。这似乎是随机的,当它这样做,旋转也似乎是随机的。我认为触摸触发了基于最后一个位置的旋转,但我的代码应该是重置开始位置 触摸代码在附加到要旋转的对象的脚本中,因此它都在一个文件中 这是密码 在更新方法中,我检测到它支持触摸,并尝试调用HandleTouch void Update() { if (Input.touchSupported)

我正在旋转一个基于2个手指触摸的游戏对象。我的旋转工作正常,但我遇到了一个奇怪的问题,有时我会用两个手指触摸开始旋转,但只要我触摸屏幕,物体就会立即旋转。这似乎是随机的,当它这样做,旋转也似乎是随机的。我认为触摸触发了基于最后一个位置的旋转,但我的代码应该是重置开始位置

触摸代码在附加到要旋转的对象的脚本中,因此它都在一个文件中

这是密码

在更新方法中,我检测到它支持触摸,并尝试调用HandleTouch

void Update()
{
    if (Input.touchSupported)
        HandleTouch();
    else
        HandleMouse();
}
手触法

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;
    }
}
感谢您提供的任何帮助或见解。

您没有跟踪 因为触摸可能不会以相同的顺序存储:

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

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

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

第一个手指触摸,触摸计数1,跳过代码 第二个手指触摸,它是阵列中的第二个手指,触摸计数2,开始处理: 第一次触摸的相位为TouchPhase.Moved 由于默认值或之前的TouchPhase,lastRotPosition当前为零。结束 touch.position-lastRotPosition计算为非零大旋转 当它正常工作时,您会得到以下结果:

第一个手指触摸,触摸计数1,跳过代码 第二个手指触摸,它是阵列中的第一个手指,触摸计数2,开始处理: 第一次触摸具有阶段触摸阶段。开始 lastRotPosition将更新到触摸的位置 下一帧touch.position-lastRotPosition计算为接近零的小旋转
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);
}