Unit和Android是否无法精确地跟随手指?

时间:2018-10-01 19:30:12

标签: android unity3d touch lag

我正在使用Unity创建一个Android游戏,并且试图创建一个物体来跟随我的手指。这是我正在使用的代码。

for (int i = 0; i < Input.touchCount; i++)
    {
        RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.touches[i].position), Vector2.zero);

        Vector3 touchPosition = Camera.main.ScreenToWorldPoint(Input.touches[i].position);

        if (Input.GetTouch(i).phase == TouchPhase.Moved && hit.collider != null)
        {
            transform.position = new Vector2(touchPosition.x, touchPosition.y + sizeY);
        }
    }

我将碰撞器放在对象下面,并将对象的大小添加到Y上,使其显示在手指上方。 问题是,如果我稍微加快手指移动速度,就会丢失物体,而物体会滞后。由于物体滞后,如果我更快地移动手指,我最终会离开对撞机区域,并且物体会停止移动。 我发现可行的唯一方法是摆脱Raycast的影响,并使对象跟随屏幕上任何位置的触摸(我不喜欢这样)。

我只是想知道这是否是我可以从Unity和Android上获得的最好的效果,或者是否有一种方法可以使对象精确地,不滞后地一步一步跟随手指移动。 我正在三星Galaxy S8上测试该物体,而没有其他东西。

1 个答案:

答案 0 :(得分:1)

您并不孤单。 Unity的输入API基于帧速率,并且可能无法与屏幕上的触摸移动速度保持一致。如果您要进行的工作需要基于屏幕上的触摸来快速响应,请使用新的Unity InputSystem。该API仍处于实验模式。

它的Touchscreen类可用于访问屏幕上的触摸。您当前的代码应转换为以下内容:

public int touchIndex = 0;

void Update()
{
    Touchscreen touchscreen = UnityEngine.Experimental.Input.Touchscreen.current;

    if (touchscreen.allTouchControls[touchIndex].ReadValue().phase != PointerPhase.None &&
               touchscreen.allTouchControls[touchIndex].ReadValue().phase == PointerPhase.Moved)
    {
        Vector2 touchLocation = touchscreen.allTouchControls[touchIndex].ReadValue().position;   
        RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(touchLocation), Vector2.zero);    
        Vector3 touchPosition = Camera.main.ScreenToWorldPoint(touchLocation);
        transform.position = new Vector2(touchPosition.x, touchPosition.y + sizeY);   
    }
}