我正在使用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上测试该物体,而没有其他东西。
答案 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);
}
}