首页 > 解决方案 > Unit 和 Android 无法精确跟随手指?

问题描述

我正在使用 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 上进行测试,仅使用该对象,没有其他内容。

标签: androidunity3dtouchlag

解决方案


你并不孤单。Unity 的 Input 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);   
    }
}

推荐阅读