Unity3D - 基于触摸移动的2D对象旋转(触摸之间的差异)

时间:2014-06-26 15:13:43

标签: vector rotation unity3d

我是Unity的新手。我希望根据移动的用户触摸旋转我的2D对象(在屏幕上移动手指)。我有这段代码:

void Update ()
{
    if (Input.touches.Length > 0) {
         t = Input.GetTouch (0);

        if (t.phase == TouchPhase.Moved) {
            Vector3 movePos = new Vector3 (t.position.x, t.position.y, 0);
            var objectPos = Camera.main.WorldToScreenPoint (transform.position);
            var dir = movePos - objectPos; 
            transform.rotation = Quaternion.Euler (new Vector3 (0f, 0f, Mathf.Atan2 (dir.y, dir.x) * Mathf.Rad2Deg));
        }
    }
}

此代码基于用户触摸旋转对象但是当我在另一个位置再次触摸屏幕并进行触摸移动时,它会将整个对象旋转到实际触摸,然后它将根据触摸移动进行正确的对象旋转。 / p>

我不想根据触摸位置旋转整个对象,而只是根据触摸移动旋转对象。你了解我吗?你能帮助我吗?我应该如何重写我的代码?

2 个答案:

答案 0 :(得分:0)

如果我理解你,请尝试使用以下代码:

private float turnSpeed = 5f;
private Vector2 movement;

void Update()
{
    Vector2 currentPosition = transform.position;

    if (Input.touchCount > 0)
    {
        Touch touch = Input.GetTouch(0);

        if (touch.phase == TouchPhase.Moved)
        {
            Vector2 moveTowards = Camera.main.ScreenToWorldPoint(touch.position);

            movement = moveTowards - currentPosition;
            movement.Normalize();
        }
    }

    float targetAngle = Mathf.Atan2(movement.y, movement.x) * Mathf.Rad2Deg;
    transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0, 0, targetAngle), turnSpeed * Time.deltaTime);
}

让我知道你想要的是什么。此外,这里有一个完整的示例:https://github.com/joaokucera/unity-2d-object-rotation

答案 1 :(得分:0)

使用deltaPosition而不是触摸位置。这应该会让你朝着正确的方向前进。

var movedVector = t.deltaPosition;

编辑:

这是与您现有代码的可能集成。我在这台PC上没有Unity,所以这完全没有经过测试。主要思想是你正在改变帧之间的手指位置。然后,您可以通过移动速度来缩放该更改,当然还有帧渲染之间的时间变化(增量时间)。

对象如何相对于该信息旋转取决于您。我刚刚将逻辑插入到现有代码中。

float moveSpeed = 2.0f;

void Update ()
{
    if (Input.touches.Length > 0) {
         t = Input.GetTouch (0);

        if (t.phase == TouchPhase.Moved) {
            var delta = t.deltaPosition * moveSpeed * Time.deltaTime;
            transform.rotation = Quaternion.Euler (new Vector3 (0f, 0f, Mathf.Atan2 (delta .y, delta.x) * Mathf.Rad2Deg));
        }
    }
}