首页 文章

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

提问于
浏览
1

我是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));
        }
    }
}

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

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

2 回答

  • 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

  • 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));
            }
        }
    }
    

相关问题